本篇文章属于《518抽奖软件开发日志》系列文章的一部分。 我在开发《518抽奖软件》(www.518cj.net)的时候,需要支持从excel表格里面导入数据。找到几个读取表格的开源库,但是有的收费有的不好用,最终用的xlnt这个只能读xlsx的开源库,代码如下。 - #include <xlnt/xlnt.hpp>
- using namespace xlnt;
- #define MAX_MSG 2048
- BOOL load_xlsx(const WCHAR* file, int maxRow, vector<vector<string>>& rows, WCHAR* err)
- {
- CHAR fileA[MAX_PATH * 3] = { 0 };
- WideCharToMultiByte(CP_UTF8, 0, file, -1, fileA, sizeof(fileA) - 1, NULL, NULL);
- try
- {
- workbook wb;
- try { wb.load(fileA); }
- catch (xlnt::exception e)
- {
- if (err) MultiByteToWideChar(CP_UTF8, 0, e.what(), -1, err, MAX_MSG - 1);
- return FALSE;
- }
- worksheet ws = wb[0];
- /* 列不存在:一般读取空字符串,不会失败 */
- BOOL bFirstRow = TRUE;
- for (auto row : ws.rows(true))
- {
- vector<string> one;
- if (bFirstRow)
- {
- bFirstRow = FALSE;
- continue;
- }
- for (auto cell : row)
- {
- one.push_back(cell.to_string());
- if (one.size() >= 7)
- break;
- }
- while (one.size() < 7)
- one.push_back("");
- rows.push_back(one);
- if (maxRow != 0 && rows.size() >= maxRow)
- break;
- }
- }
- catch (...)
- {
- if (err) wcscpy(err, L"unknown error");
- rows.clear();
- return FALSE;
- }
- return TRUE;
- }
复制代码
|