利用libxl库的loadRaw函数读取EXECL数据
VC6的源代码(参考:https://www.libxl.com/write-excel-memory-buffer.html):
#include <iostream>
#include <fstream>
#include "libxl.h"
#pragma comment(lib,"libxl.lib")
using namespace libxl;
int main()
{
std::fstream stream("acb.xlsx", std::ios_base::in | std::ios_base::binary);//trunc binary
if(!stream)
{
std::cout << "file not found" << std::endl;
return 1;
}
stream.seekg(0, std::ios_base::end);
unsigned size =stream.tellg();
char* buf = new char[size];
stream.seekg(0, std::ios_base::beg);
stream.read(buf, size);
//注意:EXECL的单元格有任何格式都表示有数据,其空值用"(null)"表示。
Book* book = xlCreateXMLBook();
book->setKey("cqbjht", "windows-2f292c0c02c2e7036ab26e6dacpcr7gf"); //设置key
int readRow=0;//需读取数据的行号
int sheetIndex=0;//工作表序号
int rowsSum=0;//总行数
int colSumMax=0;//最大列数
int blankRowSum=10;//允许的最大空行数,-1没有空行。
int blankRow=0;//空行数
for(readRow=0;;++readRow)//readRow<=sheet->lastRow()
{
if(book->loadRaw(buf, size,sheetIndex,readRow,readRow))//读入数据
{
Sheet* sheet = book->getSheet(sheetIndex);
if(sheet->lastCol()==0)//判断是否读到空行,是就结束。
{
//也可以继续读取100行,如果都是空行就结束。有大于blankRowSum行空数据就变态了。
if(blankRow<=blankRowSum)
{
++blankRow;
}else
{
printf("数据读取完成,总行数=%d,最大列数=%d\n",rowsSum-blankRow,colSumMax);
break;
}
}
if(sheet->lastCol()>colSumMax)
colSumMax=sheet->lastCol();//计算最大列数
++rowsSum;//计算总行数
//显示读入的数据
for(int readCol=0;readCol<sheet->lastCol();++readCol)
{
printf("%s,",sheet->readStr(readRow,readCol));
blankRow=0;//复位空行标志
}
printf("%d\n",sheet->lastCol());
}
else
{
std::cout << book->errorMessage() << std::endl;
return 1;
}
}
delete[] buf;
book->release();
return 0;
}
EXECL文件内容:
`读入的数据,//注意:EXECL的单元格有任何格式都表示有数据,其空值用"(null)"表示。
`