程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Qt將表格table保存為excel(odbc方式),qtodbc

Qt將表格table保存為excel(odbc方式),qtodbc

編輯:C++入門知識

Qt將表格table保存為excel(odbc方式),qtodbc


首先是保存excel的方法,可參照:

http://dzmlmszp.blog.163.com/blog/static/179271962014819111812531/

 

ok,進入正題。

現在我有一個table,如圖:

 

圖中的table可以是QTableWidget或QTableView

 

但是我需要隱藏最後一列,不要讓用戶看到,則在代碼中加入:

ui->tableWidget->setColumnCount(3);

運行中效果如下:

 

現在問題來了,怎樣才能將我的table保存為excel?

參照前面的博客,我自己重寫了一個OdbcExcel類進行操作,先把代碼貼上:

 

odbcexcel.h

 1 #ifndef ODBCEXCEL_H
 2 #define ODBCEXCEL_H
 3 
 4 #include <QObject>
 5 #include <QStringList>
 6 #include <QSqlQuery>
 7 #include <QSqlDatabase>
 8 #include <QSqlError>
 9 #include <QTableView>
10 
11 /**
12  * @brief The OdbcExcel class
13  * @author 鄭澤桐
14  */
15 
16 class OdbcExcel
17 {
18 public:
19     OdbcExcel();
20     //將數據保存為excel
21     bool static save(QString filePath,QStringList headers,QList<QStringList> data,QString comment="");
22     //將QTableView保存為excel
23     bool static saveFromTable(QString filePath,QTableView *tableView,QString comment="");
24     //獲取錯誤信息
25     QString static getError(){return error;}
26 private:
27     void static printError( QSqlError error);
28     bool static insert(QSqlQuery& query, QString sheetName, QStringList slist);
29     static QString error;
30 };
31 
32 
33 #endif // ODBCEXCEL_H

 

odbcexcel.cpp

  1 #include "odbcexcel.h"
  2 #include <QDebug>
  3 
  4 OdbcExcel::OdbcExcel()
  5 {
  6 }
  7 QString OdbcExcel::error;
  8 
  9 bool OdbcExcel::save(QString filePath, QStringList headers, QList<QStringList> data,QString comment)
 10 {
 11     QString sheetName = "Sheet1";
 12 
 13     QSqlDatabase db = QSqlDatabase::addDatabase("QODBC","excelexport");
 14     if( !db.isValid())
 15     {
 16         error="數據庫驅動異常";
 17         return false;   //! type error
 18     }
 19 
 20     QString dsn = "DRIVER={Microsoft Excel Driver (*.xls)};"
 21             "DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\""+filePath+"\";DBQ="+filePath;
 22     db.setDatabaseName( dsn);
 23 
 24     // open connection
 25     if( !db.open())
 26     {
 27         error="無法打開數據庫";
 28         return false;  //! db error
 29     }
 30 
 31     QSqlQuery query(db);
 32     QString sql;
 33 
 34     // drop the table if it's already exists
 35     sql = QString("DROP TABLE [%1]").arg(sheetName);
 36     query.exec( sql);
 37     //create the table (sheet in Excel file)
 38     sql = QString("CREATE TABLE [%1] (").arg(sheetName);
 39     foreach (QString name, headers) {
 40         sql +=QString("[%1] varchar(200)").arg(name);
 41         if(name!=headers.last())
 42             sql +=",";
 43     }
 44     sql += ")";
 45     query.prepare( sql);
 46     if( !query.exec()) {
 47         OdbcExcel::printError( query.lastError());
 48         db.close();
 49         return false;
 50     }
 51     foreach (QStringList slist, data) {
 52         insert(query,sheetName,slist);
 53     }
 54 
 55     if(!comment.isEmpty())
 56     {
 57         QStringList slist;
 58         slist<<comment;
 59         for(int i=0,n=headers.size()-1;i<n;i++)
 60         {
 61             slist<<"";
 62         }
 63         insert(query,sheetName,slist);
 64     }
 65 
 66     db.close();
 67     return true;
 68 }
 69 
 70 bool OdbcExcel::saveFromTable(QString filePath,QTableView *tableView, QString comment)
 71 {
 72     QAbstractItemModel* model=tableView->model();
 73     const int column=model->columnCount();
 74     const int row=model->rowCount();
 75 
 76     //header
 77     QStringList headers;
 78     for(int i=0;i<column;i++)
 79     {
 80         //隱藏列
 81         if(tableView->isColumnHidden(i))
 82             continue;
 83         headers<<model->headerData(i,Qt::Horizontal).toString();
 84     }
 85 
 86     //data
 87     QStringList list;
 88     QList<QStringList> data;
 89     for(int i=0;i<row;i++)
 90     {
 91         if(model->index(i,0).data().isNull())
 92             continue;
 93         list.clear();
 94         for(int j=0;j<column;j++){
 95             //隱藏列
 96             if(tableView->isColumnHidden(j))
 97                 continue;
 98             list<<model->index(i,j).data().toString();
 99         }
100         data<<list;
101     }
102     return OdbcExcel::save(filePath,headers,data,comment);
103 }
104 
105 void OdbcExcel::printError(QSqlError error)
106 {
107     QString sqlerr = error.text();
108     error=sqlerr;
109     qCritical()<<sqlerr;
110 }
111 
112 bool OdbcExcel::insert(QSqlQuery &query, QString sheetName, QStringList slist)
113 {
114     QString sSql = QString("INSERT INTO [%1] VALUES(").arg( sheetName);
115     for(int i=0,n=slist.size();i<n;i++)
116     {
117         sSql+=QString(":%1").arg(i);
118         if(i!=n-1)
119             sSql+=",";
120         else
121             sSql+=")";
122     }
123     query.prepare( sSql);
124     for(int i=0,n=slist.size();i<n;i++)
125     {
126         query.bindValue(QString(":%1").arg(i),slist.at(i));
127     }
128     if( !query.exec()) {
129         printError( query.lastError());
130         return false;
131     }
132     return true;
133 }

 

接下來就是調用了,save按鍵的click事件:

 1   QFileDialog dlg;
 2     dlg.setAcceptMode(QFileDialog::AcceptSave);
 3     //  Qt 5
 4     dlg.setDirectory(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation));
 5     //  Qt 4
 6     //  dlg.setDirectory(QDesktopServices::storageLocation(QDesktopServices::DesktopLocation));
 7     dlg.setNameFilter("*.xls");
 8     dlg.selectFile(QDate::currentDate().toString("yyyy-MM-dd.xls"));
 9     if(dlg.exec()!= QDialog::Accepted)
10         return;
11     QString filePath=dlg.selectedFiles()[0];
12     if(OdbcExcel::saveFromTable(filePath,ui->tableWidget,"注釋:無")) {
13         QMessageBox::information(this,tr("提示"),tr("保存成功"));
14     }
15     else{
16         QString msg="保存失敗!\n\r"+OdbcExcel::getError();
17         QMessageBox::critical(this,tr("錯誤"),tr(msg.toLatin1()));
18     }

 

看一下效果:

隱藏的列也不會顯示出來。

 

調用OdbcExcel::saveFromTable函數,就可以將QTableWidget或QTableView保存為excel。

另外,我提供了save函數,可以直接將表頭(QString headers)以及數據(QList<QStringList> data)保存為excel。

 

轉載請標明出處:http://www.cnblogs.com/ztzheng/p/4172847.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved