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

  • 相关阅读:
    JS调用App方法及App调用JS方法
    提升用户体验之 选用合适的鼠标光标
    js仿QQ拖拽删除
    Linux下安装 mongodb
    QQ分享-定制分享卡片
    js判断浏览器语言实现网站国际化
    js复制内容到剪切板
    为什么会有堆内存和栈内存之分
    Avro实现RPC
    zookeeper学习day01
  • 原文地址:https://www.cnblogs.com/ztzheng/p/4172847.html
Copyright © 2011-2022 走看看