123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- /*****************************************************************************
- Copyright (C) 2016 Brecht Sanders All Rights Reserved
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- *****************************************************************************/
- /**
- * @file xlsxio_read.h
- * @brief XLSX I/O header file for reading .xlsx files.
- * @author Brecht Sanders
- * @date 2016
- * @copyright MIT
- *
- * Include this header file to use XLSX I/O for reading .xlsx files and
- * link with -lxlsxio_read.
- * This header provides both advanced methods using callback functions and
- * simple methods for iterating through data.
- */
- #ifndef INCLUDED_XLSXIO_READ_H
- #define INCLUDED_XLSXIO_READ_H
- #include <stdlib.h>
- #if defined(_MSC_VER) && _MSC_VER < 1600
- typedef signed __int64 int64_t;
- typedef unsigned __int64 uint64_t;
- #else
- #include <stdint.h>
- #endif
- #include <time.h>
- /*! \brief character type used (usually char, but when XML_UNICODE is defined wchar_t) */
- #ifndef XLSXIOCHAR
- #if defined(XML_UNICODE_WCHAR_T)
- #warning Building with XML_UNICODE_WCHAR_T and -fshort-wchar is not supported unless all other linked libraries and programs are also compiled with -fshort-wchar
- #elif !defined(XML_UNICODE)
- #define XLSXIOCHAR char
- #else
- #include <wchar.h>
- #define XLSXIOCHAR wchar_t
- #endif
- #endif
- /*! \cond PRIVATE */
- #ifndef DLL_EXPORT_XLSXIO
- #ifdef _WIN32
- #if defined(BUILD_XLSXIO_DLL) || defined(BUILD_XLSXIO_SHARED) || defined(xlsxio_write_SHARED_EXPORTS)
- #define DLL_EXPORT_XLSXIO __declspec(dllexport)
- #elif !defined(STATIC) && !defined(BUILD_XLSXIO_STATIC) && !defined(BUILD_XLSXIO)
- #define DLL_EXPORT_XLSXIO __declspec(dllimport)
- #else
- #define DLL_EXPORT_XLSXIO
- #endif
- #else
- #define DLL_EXPORT_XLSXIO
- #endif
- #endif
- /*! \endcond */
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*! \brief get xlsxio_write version
- * \param pmajor pointer to integer that will receive major version number
- * \param pminor pointer to integer that will receive minor version number
- * \param pmicro pointer to integer that will receive micro version number
- * \sa xlsxiowrite_get_version_string()
- */
- DLL_EXPORT_XLSXIO void xlsxioread_get_version (int* pmajor, int* pminor, int* pmicro);
- /*! \brief get xlsxio_write version string
- * \return version string
- * \sa xlsxiowrite_get_version()
- */
- DLL_EXPORT_XLSXIO const XLSXIOCHAR* xlsxioread_get_version_string ();
- /*! \brief read handle for .xlsx object */
- typedef struct xlsxio_read_struct* xlsxioreader;
- /*! \brief open .xlsx file
- * \param filename path of .xlsx file to open
- * \return read handle for .xlsx object or NULL on error
- * \sa xlsxioread_close()
- */
- DLL_EXPORT_XLSXIO xlsxioreader xlsxioread_open (const char* filename);
- /*! \brief open .xlsx file
- * \param filehandle file handle of .xlsx file opened with read access in binary mode
- * \return read handle for .xlsx object or NULL on error
- * \sa xlsxioread_close()
- */
- DLL_EXPORT_XLSXIO xlsxioreader xlsxioread_open_filehandle (int filehandle);
- /*! \brief open .xlsx from memory buffer
- * \param data memory buffer containing .xlsx file (data must remain valid as long as any xlsxioread_ functions are called)
- * \param datalen size of memory buffer containing .xlsx file
- * \param freedata if non-zero data will be freed by xlsxioread_close()
- * \return read handle for .xlsx object or NULL on error
- * \sa xlsxioread_close()
- */
- DLL_EXPORT_XLSXIO xlsxioreader xlsxioread_open_memory (void* data, uint64_t datalen, int freedata);
- /*! \brief close .xlsx file
- * \param handle read handle for .xlsx object
- * \sa xlsxioread_open()
- */
- DLL_EXPORT_XLSXIO void xlsxioread_close (xlsxioreader handle);
- /*! \brief type of pointer to callback function for listing worksheets
- * \param name name of worksheet
- * \param callbackdata callback data passed to xlsxioread_list_sheets
- * \return zero to continue, non-zero to abort
- * \sa xlsxioread_list_sheets()
- */
- typedef int (*xlsxioread_list_sheets_callback_fn)(const XLSXIOCHAR* name, void* callbackdata);
- /*! \brief list worksheets in .xlsx file
- * \param handle read handle for .xlsx object
- * \param callback callback function called for each worksheet
- * \param callbackdata custom data as passed to quickmail_add_body_custom/quickmail_add_attachment_custom
- * \sa xlsxioread_list_sheets_callback_fn
- */
- DLL_EXPORT_XLSXIO void xlsxioread_list_sheets (xlsxioreader handle, xlsxioread_list_sheets_callback_fn callback, void* callbackdata);
- /*! \brief possible values for the flags parameter of xlsxioread_process()
- * \sa xlsxioread_process()
- * \name XLSXIOREAD_SKIP_*
- * \{
- */
- /*! \brief don't skip any rows or cells \hideinitializer */
- #define XLSXIOREAD_SKIP_NONE 0
- /*! \brief skip empty rows (note: cells may appear empty while they actually contain data) \hideinitializer */
- #define XLSXIOREAD_SKIP_EMPTY_ROWS 0x01
- /*! \brief skip empty cells \hideinitializer */
- #define XLSXIOREAD_SKIP_EMPTY_CELLS 0x02
- /*! \brief skip empty rows and cells \hideinitializer */
- #define XLSXIOREAD_SKIP_ALL_EMPTY (XLSXIOREAD_SKIP_EMPTY_ROWS | XLSXIOREAD_SKIP_EMPTY_CELLS)
- /*! \brief skip extra cells to the right of the rightmost header cell \hideinitializer */
- #define XLSXIOREAD_SKIP_EXTRA_CELLS 0x04
- /*! \brief skip hidden rows \hideinitializer */
- #define XLSXIOREAD_SKIP_HIDDEN_ROWS 0x08
- /*! @} */
- /*! \brief type of pointer to callback function for processing a worksheet cell value
- * \param row row number (first row is 1)
- * \param col column number (first column is 1)
- * \param value value of cell (note: formulas are not calculated)
- * \param callbackdata callback data passed to xlsxioread_process
- * \return zero to continue, non-zero to abort
- * \sa xlsxioread_process()
- * \sa xlsxioread_process_row_callback_fn
- */
- typedef int (*xlsxioread_process_cell_callback_fn)(size_t row, size_t col, const XLSXIOCHAR* value, void* callbackdata);
- /*! \brief type of pointer to callback function for processing the end of a worksheet row
- * \param row row number (first row is 1)
- * \param maxcol maximum column number on this row (first column is 1)
- * \param callbackdata callback data passed to xlsxioread_process
- * \return zero to continue, non-zero to abort
- * \sa xlsxioread_process()
- * \sa xlsxioread_process_cell_callback_fn
- */
- typedef int (*xlsxioread_process_row_callback_fn)(size_t row, size_t maxcol, void* callbackdata);
- /*! \brief process all rows and columns of a worksheet in an .xlsx file
- * \param handle read handle for .xlsx object
- * \param sheetname worksheet name (NULL for first sheet)
- * \param flags XLSXIOREAD_SKIP_ flag(s) to determine how data is processed
- * \param cell_callback callback function called for each cell
- * \param row_callback callback function called after each row
- * \param callbackdata callback data passed to xlsxioread_process
- * \return zero on success, non-zero on error
- * \sa xlsxioread_process_row_callback_fn
- * \sa xlsxioread_process_cell_callback_fn
- */
- DLL_EXPORT_XLSXIO int xlsxioread_process (xlsxioreader handle, const XLSXIOCHAR* sheetname, unsigned int flags, xlsxioread_process_cell_callback_fn cell_callback, xlsxioread_process_row_callback_fn row_callback, void* callbackdata);
- /*! \brief read handle for list of worksheet names */
- typedef struct xlsxio_read_sheetlist_struct* xlsxioreadersheetlist;
- /*! \brief open list of worksheet names
- * \param handle read handle for .xlsx object
- * \sa xlsxioread_sheetlist_close()
- * \sa xlsxioread_open()
- */
- DLL_EXPORT_XLSXIO xlsxioreadersheetlist xlsxioread_sheetlist_open (xlsxioreader handle);
- /*! \brief close worksheet
- * \param sheetlisthandle read handle for worksheet object
- * \sa xlsxioread_sheetlist_open()
- */
- DLL_EXPORT_XLSXIO void xlsxioread_sheetlist_close (xlsxioreadersheetlist sheetlisthandle);
- /*! \brief get next worksheet name
- * \param sheetlisthandle read handle for worksheet object
- * \return name of worksheet or NULL if no more worksheets are available
- * \sa xlsxioread_sheetlist_open()
- */
- DLL_EXPORT_XLSXIO const XLSXIOCHAR* xlsxioread_sheetlist_next (xlsxioreadersheetlist sheetlisthandle);
- /*! \brief read handle for worksheet object */
- typedef struct xlsxio_read_sheet_struct* xlsxioreadersheet;
- /*! \brief get index of last row read from worksheet (returns 0 if no row was read yet)
- * \param sheethandle read handle for worksheet object
- * \sa xlsxioread_sheet_open()
- */
- DLL_EXPORT_XLSXIO size_t xlsxioread_sheet_last_row_index (xlsxioreadersheet sheethandle);
- /*! \brief get index of last column read from current row in worksheet (returns 0 if no column was read yet)
- * \param sheethandle read handle for worksheet object
- * \sa xlsxioread_sheet_open()
- */
- DLL_EXPORT_XLSXIO size_t xlsxioread_sheet_last_column_index (xlsxioreadersheet sheethandle);
- /*! \brief get flags used to open worksheet
- * \param sheethandle read handle for worksheet object
- * \sa xlsxioread_sheet_open()
- */
- DLL_EXPORT_XLSXIO unsigned int xlsxioread_sheet_flags (xlsxioreadersheet sheethandle);
- /*! \brief open worksheet
- * \param handle read handle for .xlsx object
- * \param sheetname worksheet name (NULL for first sheet)
- * \param flags XLSXIOREAD_SKIP_ flag(s) to determine how data is processed
- * \return read handle for worksheet object or NULL in case of error
- * \sa xlsxioread_sheet_close()
- * \sa xlsxioread_open()
- */
- DLL_EXPORT_XLSXIO xlsxioreadersheet xlsxioread_sheet_open (xlsxioreader handle, const XLSXIOCHAR* sheetname, unsigned int flags);
- /*! \brief close worksheet
- * \param sheethandle read handle for worksheet object
- * \sa xlsxioread_sheet_open()
- */
- DLL_EXPORT_XLSXIO void xlsxioread_sheet_close (xlsxioreadersheet sheethandle);
- /*! \brief get next row from worksheet (to be called before each row)
- * \param sheethandle read handle for worksheet object
- * \return non-zero if a new row is available
- * \sa xlsxioread_sheet_open()
- */
- DLL_EXPORT_XLSXIO int xlsxioread_sheet_next_row (xlsxioreadersheet sheethandle);
- /*! \brief get next cell from worksheet
- * \param sheethandle read handle for worksheet object
- * \return value (caller must free the result) or NULL if no more cells are available in the current row
- * \sa xlsxioread_sheet_open()
- */
- DLL_EXPORT_XLSXIO XLSXIOCHAR* xlsxioread_sheet_next_cell (xlsxioreadersheet sheethandle);
- /*! \brief get next cell from worksheet as a string
- * \param sheethandle read handle for worksheet object
- * \param pvalue pointer where string will be stored if data is available (caller must free the result)
- * \return non-zero if a new cell was available in the current row
- * \sa xlsxioread_sheet_open()
- * \sa xlsxioread_sheet_next_cell()
- */
- DLL_EXPORT_XLSXIO int xlsxioread_sheet_next_cell_string (xlsxioreadersheet sheethandle, XLSXIOCHAR** pvalue);
- /*! \brief get next cell from worksheet as an integer
- * \param sheethandle read handle for worksheet object
- * \param pvalue pointer where integer will be stored if data is available
- * \return non-zero if a new cell was available in the current row
- * \sa xlsxioread_sheet_open()
- * \sa xlsxioread_sheet_next_cell()
- */
- DLL_EXPORT_XLSXIO int xlsxioread_sheet_next_cell_int (xlsxioreadersheet sheethandle, int64_t* pvalue);
- /*! \brief get next cell from worksheet as a floating point value
- * \param sheethandle read handle for worksheet object
- * \param pvalue pointer where floating point value will be stored if data is available
- * \return non-zero if a new cell was available in the current row
- * \sa xlsxioread_sheet_open()
- * \sa xlsxioread_sheet_next_cell()
- */
- DLL_EXPORT_XLSXIO int xlsxioread_sheet_next_cell_float (xlsxioreadersheet sheethandle, double* pvalue);
- /*! \brief get next cell from worksheet as date and time data
- * \param sheethandle read handle for worksheet object
- * \param pvalue pointer where date and time data will be stored if data is available
- * \return non-zero if a new cell was available in the current row
- * \sa xlsxioread_sheet_open()
- * \sa xlsxioread_sheet_next_cell()
- */
- DLL_EXPORT_XLSXIO int xlsxioread_sheet_next_cell_datetime (xlsxioreadersheet sheethandle, time_t* pvalue);
- #ifdef __cplusplus
- }
- #endif
- #endif
|