参考一下xlnt自带的例程xlnt.test.sln,用VS2015打开后,拷贝里面的代码,复制到自己的工程当中。记得导入相应的动态链接库。
//在stdafx.h当中添加两行代码:
#include <xlnt/xlnt.hpp>
#pragma comment (lib,"xlntd.lib")
//然后在自己的主程序里面添加函数test1()
#include <math.h>
void CMyDlialog::test1()
{
::DeleteFileA("mytest.xlsx");
int nt = GetTickCount();
xlnt::workbook *pwb = new xlnt::workbook();
xlnt::worksheet ws = pwb->active_sheet();
int nna = 100;
int ncnt, i;
double dbs;
ncnt = 200000;
char ssss[30],va[30];
//xlnt::fill fill(xlnt::pattern_fill()
// .type(xlnt::pattern_fill_type::solid)
// .foreground(xlnt::color::red()));//填充单元格
xlnt::font font1;//字体与颜色的设置
xlnt::font font2;
font1.color(xlnt::rgb_color(0, 0, 0));
font1.name("Times New Roman");
font1.size(12);
font1.bold(1);
font2 = font1;
font2.color(xlnt::rgb_color(255, 0, 0));
for (i = 0; i < ncnt; i++)
{
ZeroMemory(ssss,30);
ZeroMemory(va, 30);
sprintf_s(ssss, 30, "A%d", i + 1);
dbs = (rand() % 1000)*0.65 + rand() % 20 - 166;
sprintf_s(va, 30, "%.3lf", dbs);
//if (dbs>300)
// ws.cell(ssss).fill(fill);//填充单元格颜色
if (dbs>300)
ws.cell(ssss).font(font2);
else
ws.cell(ssss).font(font1);
ws.cell(ssss).value(dbs);//输出数值
//ws.cell(ssss).value(va);//输出文本
if ((i + 1) % 4000==0)
TRACE1("write already %d lines\n",i+1);
}
ws.clear_row(1);
ZeroMemory(ssss, 30);
sprintf_s(ssss, 30, "mytest.xlsx");//格式化输出文件名
pwb->save(ssss);
pwb->remove_sheet(ws);
delete pwb;
TRACE1("used %dms\n",GetTickCount()-nt);
}
再调用下test1()即可生成xlsx文件。20W行写入与生成压缩包xlsx差不多30秒时间开销。
主要的问题是:编译器会提示有内存泄露,可以不用管它。xlsx生成完毕,保存退出后内存就会释放的。
类库里面的std::string没有格式化输出函数,因此这里通过char格式化输出,这样在VS平台使用会很方便。