/* * Wrapper for xlsxio_read library functions. * * Sample usage: * * std::string filename = "sample_file.xlsx"; * xlsxioreader xlsxfile = XlsxReader::open_xlsx_file(filename); * if (xlsxfile == NULL) { * printf("cannot open file: '%s'", filename.c_str()); * return false; * } * auto sheetNames = XlsxReader::list_sheets(xlsxfile); * for (auto sheetName = sheetNames.begin(); * sheetName != sheetNames.end(); * ++sheetName) { * printf("reading sheet: %s\n", sheetName->c_str()); * xlsxioreadersheet xlsxsheet = * XlsxReader::open_sheet(xlsxfile, *sheetName); * if (xlsxsheet == NULL) { * printf("cannot open sheet: '%s'", sheetName->c_str()); * continue; * } * std::string value; * int row_num = 1; * while (XlsxReader::GetNextRow(xlsxsheet)) { * std::string s; * printf("%d:\t", row_num); * while (XlsxReader::GetNextCell(xlsxsheet, s)) { * printf("%s\t", s.c_str()); * } * printf("\n"); * ++row_num; * } * XlsxReader::close_sheet(xlsxsheet); * } * XlsxReader::close_xlsx_file(xlsxfile); * return true; */ #include #include "modules/XlsxReader.h" using namespace DFHack; // returns NULL on error DFHACK_EXPORT XlsxReader::xlsx_file_handle XlsxReader::open_xlsx_file( std::string filename) { return xlsxioread_open(filename.c_str()); } DFHACK_EXPORT void XlsxReader::close_xlsx_file( XlsxReader::xlsx_file_handle file_handle) { xlsxioread_close((xlsxioreader)file_handle); } static int list_callback(const XLSXIOCHAR* name, void* cbdata) { auto sheetNames = (std::vector *)cbdata; sheetNames->push_back(name); return 0; } DFHACK_EXPORT std::vector XlsxReader::list_sheets( XlsxReader::xlsx_file_handle file_handle) { auto sheetNames = std::vector(); xlsxioread_list_sheets( (xlsxioreader)file_handle, list_callback, &sheetNames); return sheetNames; } // returns XLSXIOReaderSheet object or NULL on error DFHACK_EXPORT XlsxReader::xlsx_sheet_handle XlsxReader::open_sheet( XlsxReader::xlsx_file_handle file_handle, std::string sheet_name) { if (file_handle == NULL) return NULL; return xlsxioread_sheet_open( (xlsxioreader)file_handle, sheet_name.c_str(), XLSXIOREAD_SKIP_NONE); } DFHACK_EXPORT void XlsxReader::close_sheet( XlsxReader::xlsx_sheet_handle sheet_handle) { xlsxioread_sheet_close((xlsxioreadersheet)sheet_handle); } // start reading the next row of data; must be called before GetNextCell . // returns false if there is no next row to get. DFHACK_EXPORT bool XlsxReader::get_next_row( XlsxReader::xlsx_sheet_handle sheet_handle) { return xlsxioread_sheet_next_row((xlsxioreadersheet)sheet_handle) != 0; } // fills the value param with the contents of the cell in the next column cell // in the current row. // returns false if there are no more cells in this row. DFHACK_EXPORT bool XlsxReader::get_next_cell( XlsxReader::xlsx_sheet_handle sheet_handle, std::string& value) { char* result; if (!xlsxioread_sheet_next_cell_string((xlsxioreadersheet)sheet_handle, &result)) { value.clear(); return false; } value.assign(result); free(result); return true; }