zoukankan      html  css  js  c++  java
  • Qt将表格table保存为excel(odbc方式)

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

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

    ok,进入正题。

    现在我有一个table,如图:

    2

    图中的table可以是QTableWidget或QTableView

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

    ui->tableWidget->setColumnCount(3);

    运行中效果如下:

    182207041884388[1]

    现在问题来了,怎样才能将我的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="保存失败!
    
    "+OdbcExcel::getError();
    17         QMessageBox::critical(this,tr("错误"),tr(msg.toUtf8()));
    18     }

    看一下效果:

    182237361109549[1]

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

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

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

    转载请标明出处:http://www.cnblogs.com/ztzheng/p/4172847.html

  • 相关阅读:
    POJ-1189 钉子和小球(动态规划)
    POJ-1191-棋盘分割(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 730 统计不同回文子字符串(动态规划)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 729 我的日程安排表 I(二叉树)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
    Java实现 LeetCode 728 自除数(暴力)
  • 原文地址:https://www.cnblogs.com/ztzheng/p/4172847.html
Copyright © 2011-2022 走看看