在程序中读取excel文件比如XLS和XLSX,方法有很多,比如ADO,OLE,ODBC等方式。但是这些方法要么依赖于平台,要么读取速度慢,有的甚至需要电脑本身装有excel程序。
但是有一个付费的商业软件库Libxl,属于轻量化的读取工具,读取速度可以,且不依赖于平台,可在windows,mac,linux上使用。这个软件可以免费使用,但是一次加载限制操作300个单元,并且第一行不能进行读写。如果想打破限制,这里有pojie版。本文使用的就是这个版本。
实现功能:打开一个包含一个工作表的excel文件,在其中新建一张表。然后把原始表中的数据复制到新表中。
int main()
{
Book* book = xlCreateXMLBook();
book->setKey(L"Halil Kural", L"windows-2723210a07c4e90162b26966a8jcdboe");
if (book->load(L"xlsx读取测试文件.xlsx"))
{
book->addSheet(L"使用libxl库新建的表");
Sheet * sheetread = book->getSheet(0);
Sheet * sheetwrite = book->getSheet(1);
if (sheetread)
{
for (int i = 0; i < 15; i++)
{
for (int j = 0; j < 5; j++)
{
CellType celltype = sheetread->cellType(i, j);
Format *format = sheetread->cellFormat(i, j);
if (celltype == CELLTYPE_STRING)
{
const wchar_t * t = sheetread->readStr(i, j);
sheetwrite->writeStr(i+2, j+2, t, format);
char *pcstr = (char *)malloc(sizeof(char)*(2 * wcslen(t) + 1));
memset(pcstr, 0, 2 * wcslen(t) + 1);
w2c(pcstr, t, 2 * wcslen(t) + 1);
cout << pcstr << "\t\t";
free(pcstr);
}
else if (celltype == CELLTYPE_NUMBER)
{
double result = sheetread->readNum(i, j);
sheetwrite->writeNum(i+2, j+2, result, format);
cout << result << "\t\t";
}
else if (celltype == CELLTYPE_BLANK)
{
cout << "\t\t" << endl;
}
else if (celltype == CELLTYPE_EMPTY)
{
cout << "\t\t" << endl;
}
}
cout << endl;
}
}
//保存excel
book->save(L"xlsx读取测试文件.xlsx");
book->release();
}
system("pause");
return 0;
}
为了支持中文读取和显示,需要以下函数
//中文的内容读出来后要进行编码的转换,这个为转换函数:wchar_t to char
char *w2c(char *pcstr, const wchar_t *pwstr, size_t len)
{
int nlength = wcslen(pwstr);
//获取转换后的长度
int nbytes = WideCharToMultiByte(0, 0, pwstr, nlength, NULL, 0, NULL, NULL);
if (nbytes>len) nbytes = len;
// 通过以上得到的结果,转换unicode 字符为ascii 字符
WideCharToMultiByte(0, 0, pwstr, nlength, pcstr, nbytes, NULL, NULL);
return pcstr;
}
原始excle表格:
运行过程cmd显示内容:
运行结束后新表内容,向下和向右各偏移2格。
https://download.csdn.net/download/iamqianrenzhan/10536061