1. 程式人生 > >qt中使用xlslib寫入中文(QAxObject 速度很慢)

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);

};

中文也是可以寫入的哦