qt中使用xlslib寫入中文(QAxObject 速度很慢)
在QT中將一個TableModel的資料寫入excel有很多方法
1 使用QT的odbc連結EXCEL當做資料庫寫入 速度飛快。但是不好控制EXCEL裡面的格式。圖片字型等等。
2使用QAxObject寫入?網上一抓一大片全是這麼寫入的。實際使用過程中發現速度慢如狗。寫10行10列的資料要7-10秒不等。原因
估計是每次都重新開啟一些單元格寫入。要是寫幾百條那還得了?
3用第三方庫寫入xlslib
xls lib在QT上使用需要做一些修改
關於xlslib的編譯 檢視
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);
};
中文也是可以寫入的哦