C++基于libxls库读取xls文件

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库存在对数值型读取异常的问题,在提取单元格数据的时候,要自己进行判定,上面的代码中已经给出了判断的例子,可以根据自己的实际需求进行调整

发布了85 篇原创文章 · 获赞 61 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/Leo_csdn_/article/details/100578914