qt保存html表格,Qt将表格table保存为excel(odbc方式)

首先是保存excel的方法,可参照: http://dzmlmszp.blog.163.com/blog/static/179271962014819111812531/ ok,进入正题。 现在我有一个table,如图: 图中的table可以是QTableWidget或QTableView 但是我需要隐藏最后一列,不要让用户看到,则在代码中加入:

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

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

ok,进入正题。

现在我有一个table,如图:

test.jsp?url=http%3A%2F%2Fimages.cnitblog.com%2Fblog%2F590199%2F201412%2F182300515019017.jpg&refer=http%3A%2F%2Fwww.cnblogs.com%2Fztzheng%2Fp%2F4172847.html

图中的table可以是QTableWidget或QTableView

但是我需要隐藏最后一列,不要让用户看到,则在代码中加入:

ui->tableWidget->setColumnCount(3);

运行中效果如下:

test.jsp?url=http%3A%2F%2Fimages.cnitblog.com%2Fblog%2F590199%2F201412%2F182300531881332.jpg&refer=http%3A%2F%2Fwww.cnblogs.com%2Fztzheng%2Fp%2F4172847.html

现在问题来了,怎样才能将我的table保存为excel?

参照前面的博客,我自己重写了一个OdbcExcel类进行操作,先把代码贴上:

odbcexcel.h

1 #ifndef ODBCEXCEL_H2 #define ODBCEXCEL_H

3

4 #include

5 #include

6 #include

7 #include

8 #include

9 #include

10

11 /**12 * @brief The OdbcExcel class13 * @author 郑泽桐14 */

15

16 classOdbcExcel17 {18 public:19 OdbcExcel();20 //将数据保存为excel

21 bool static save(QString filePath,QStringList headers,QList data,QString comment="");22 //将QTableView保存为excel

23 bool static saveFromTable(QString filePath,QTableView *tableView,QString comment="");24 //获取错误信息

25 QString static getError(){returnerror;}26 private:27 void staticprintError( QSqlError error);28 bool static insert(QSqlQuery&query, QString sheetName, QStringList slist);29 staticQString error;30 };31

32

33 #endif //ODBCEXCEL_H

odbcexcel.cpp

1 #include "odbcexcel.h"

2 #include

3

4 OdbcExcel::OdbcExcel()5 {6 }7 QString OdbcExcel::error;8

9 bool OdbcExcel::save(QString filePath, QStringList headers, QListdata,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<

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

81 if(tableView->isColumnHidden(i))82 continue;83 headers<headerData(i,Qt::Horizontal).toString();84 }85

86 //data

87 QStringList list;88 QListdata;89 for(int i=0;iindex(i,0).data().isNull())92 continue;93 list.clear();94 for(int j=0;j

96 if(tableView->isColumnHidden(j))97 continue;98 list<index(i,j).data().toString();99 }100 data<

105 voidOdbcExcel::printError(QSqlError error)106 {107 QString sqlerr =error.text();108 error=sqlerr;109 qCritical()<

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

121 sSql+=")";122 }123 query.prepare( sSql);124 for(int i=0,n=slist.size();i

接下来就是调用了,save按键的click事件:

1   QFileDialog dlg;2 dlg.setAcceptMode(QFileDialog::AcceptSave);3 //Qt 5

4 dlg.setDirectory(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation));5 //Qt 46 //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.toUtf8()));18 }

看一下效果:

test.jsp?url=http%3A%2F%2Fimages.cnitblog.com%2Fblog%2F590199%2F201412%2F182300551261892.jpg&refer=http%3A%2F%2Fwww.cnblogs.com%2Fztzheng%2Fp%2F4172847.html

隐藏的列也不会显示出来。

调用OdbcExcel::saveFromTable函数,就可以将QTableWidget或QTableView保存为excel。

另外,我提供了save函数,可以直接将表头(QString headers)以及数据(QList data)保存为excel。

http://www.cnblogs.com/ztzheng/p/4172847.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值