libxls是一个轻量级的读取excel的xls格式的库,只能读不能写
和其配套的还有一个xlslib库,只能写不能读
可以根据自己的需求选择使用
读取代码:
#include <iostream>
#include <xls.h>
#include <xlsstruct.h>
using namesapce std;
int xlsread(const char* file_path_name)
{
// 工作簿
xlsWorkBook *pWB = NULL;
// 工作表
xlsWorkSheet *pWS = NULL;
// 单元格
xlsCell * cell = NULL;
int sheetIndex;
int row, col;
// 打开文件
pWB = xls_open(file_path_name, "UTF-8");
if (!pWB) {
fprintf(stderr, "Open File Error!\n");
return 2;
}
// 解析xls文件,这个不要忘了
xls_parseWorkBook(pWB);
fprintf(stderr, "Sheet count:%d\n", pWB->sheets.count);
// 读取每个工作表
for (sheetIndex = 0; sheetIndex < pWB->sheets.count; ++sheetIndex) {
// 获取工作表
pWS = xls_getWorkSheet(pWB, sheetIndex);
// 解析工作表
xls_parseWorkSheet(pWS);
fprintf(stderr, "Sheet %d name: %s\n", sheetIndex, (char *)pWB->sheets.sheet[sheetIndex].name);
fprintf(stderr, "Sheet Data:\n");
// 每行
for (row = 0; row < pWS->rows.lastrow; ++row) {
// 该行第几列
for (col = 0; col < pWS->rows.lastcol; ++col) {
// 获取单元格,这里也可以通过xls_row获取到这行的数据,然后,使用row->cells来获取单元格
cell = xls_cell(pWS, row, col);
// 判断单元格及内容是否为空
if (cell && cell->str) {
// 针对数值型进行分别判断!!很重要
if ( (to_string(cell->d) == (char *)(cell->str)) || // 值较小的数值
( cell->d == 0 && to_string(cell->d).c_str() != (char *)(cell->str))) // 数值域为 0
{
fprintf(stderr, "%s", (char *)cell->str);
}
else // 较大数值
fprintf(stderr, "%s", to_string(int(cell->d)).c_str());
//fprintf(stderr, "%s", (char *)cell->str);
}
if (col < pWS->rows.lastcol-1) // 逗号分隔
{
fprintf(stderr, ",");
}
}
fprintf(stderr, "\n");
}
fprintf(stderr, "\n");
// 关闭工作表
xls_close_WS(pWS);
}
// 关闭工作簿
xls_close_WB(pWB);
return 0;
}
int main()
{
xlsread("D:/myxls.xls");
return 0;
}
注:上面的demo中,是针对标准的表格,及行列都是一个格子,如果存在合并单元格的情况,则会因为下标访问出错而崩溃,需要自己定义相应的循环规则或读取条件,避免程序崩溃
同时由于libxls库存在对数值型读取异常的问题,在提取单元格数据的时候,要自己进行判定,上面的代码中已经给出了判断的例子,可以根据自己的实际需求进行调整