在QT中将一个TableModel的数据写入excel有很多方法
1 使用QT的odbc链接EXCEL当做数据库写入 速度飞快。但是不好控制EXCEL里面的格式。图片字体等等。
2使用QAxObject写入?网上一抓一大片全是这么写入的。实际使用过程中发现速度慢如狗。写10行10列的数据要7-10秒不等。原因
估计是每次都重新打开一些单元格写入。要是写几百条那还得了?
3用第三方库写入xlslib
xls lib在QT上使用需要做一些修改
关于xlslib的编译 查看
http://blog.csdn.net/groundhappy/article/details/51512964
QT的工程配置中 配置属性 C/C++ 语言 将wchar_t视为内置类型是否。和xlslib_lib的冲突
所以前面 编译的xlslib编译的时候会出现N多错误
如果将QT里面的这个 将wchar_t视为内置类型 否 修改为 是
那么QString::toStdWstring()就没法使用。除非重新编译QT源码。所以这里修改xlslib_lib来实现
将xlslib_lib的wchar_t视为内置类型修改为和QT一样 否
。编译出现错误。
xlslib_core::format_t::format_t(xlslib_core::CGlobalRecords&,const xlslib_strings::ustring &)
但是这个好修改
定位到错的地方 因为将wchar_t修改。编译器认为
Ustring和u16string是一样的。所以认为重复定义
format_t(CGlobalRecords&gRecords, const xlslib_strings::ustring& fmtstr);
#ifndef __FRAMEWORK__
format_t(CGlobalRecords&gRecords, const xlslib_strings::u16string& fmtstr);
#endif
解决方法将 头文件
#ifndef __FRAMEWORK__
format_t(CGlobalRecords&gRecords, const xlslib_strings::u16string& fmtstr);
#endif
注释掉
同时CPP里面的函数也注释掉
这样的地方有多处。每一编译定位有错误的地方 再修改
最后编译通过
将lib和头文件准备好。
头文件主要是
Src里面所有的.h文件。Common以及xlslib oledoc目录记得保留。不要所有的h文件拷贝到同一个目录了
以及 xlslib\xlslib\build\msvc2010(对应的)ac-config.win32.h 这个文件放到common目录下
将QStandardItemModel的指针内部的数据写入xls
#include "xlslib.h"
using namespace xlslib_core;
using namespace std;
void ExportToExcelFile(QStandardItemModel *tableView,QString&filename)
{
workbook wb;
xf_t* xf =wb.xformat();
worksheet* ws;
ws = wb.sheet("sheet1");
int tableR =tableView->rowCount();
int tableC =tableView->columnCount();
//获取表头写做第一行
for (int i=0;i<tableC; i++)
{
if( tableView->horizontalHeaderItem(i) != NULL )
{
ws->label(0,i,tableView->horizontalHeaderItem(i)->text().toStdWString(),xf);
}
}
//写数据
for (int i=0;i<tableR; i++)
{
for(int j=0; j<tableC; j++)
{
if( tableView->item(i,j) != NULL )
{
ws->label(i+1,j,tableView->item(i,j)->text().toStdWString(),xf);
}
}
}
wb.Dump(filename.toStdString());
QMessageBox::information(this,QString::fromLocal8Bit("导出成功"),QString::fromLocal8Bit("已保存在\n")+filename);
};
中文也是可以写入的哦