您的位置:首页 > 移动开发 > Objective-C

qt中使用xlslib写入中文(QAxObject 速度很慢)

2016-05-27 10:45 483 查看
在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);

};

 

中文也是可以写入的哦
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: