关于将QT tableview中的数据导出到EXcel表格中

来源:互联网 发布:java中的流 编辑:程序博客网 时间:2024/05/19 20:44
将下面的.h和.cpp文件添加到你想用的工程下即可。.h文件:#ifndef EXPORTEXCELOBJECT_H#define EXPORTEXCELOBJECT_H#include #include #include #include class EEO_Field{public: EEO_Field(const int ic, const QString &sf, const QString &st): iCol(ic),sFieldName(sf),sFieldType(st){}; int iCol; QString sFieldName; QString sFieldType;};class ExportExcelObject : public QObject{ Q_OBJECTpublic: ExportExcelObject(const QString &filepath, const QString &sheettitle, QTableView *tableview):excelFilePath(filepath), sheetName(sheettitle), tableView(tableview){}; ~ExportExcelObject() {QSqlDatabase::removeDatabase("excelexport");};public: void setOutputFilePath(const QString &spath) {excelFilePath = spath;}; void setOutputSheetTitle(const QString &ssheet) {sheetName = ssheet;}; void setTableView(QTableView *tableview) {tableView = tableview;}; void addField(const int iCol, const QString &fieldname, const QString &fieldtype) {fieldList << new EEO_Field(iCol, fieldname, fieldtype);}; void removeAllFields() {while (!fieldList.isEmpty()) delete fieldList.takeFirst();}; int export2Excel();signals: void exportedRowCount(int row);private: QString excelFilePath; QString sheetName; QTableView *tableView; QList fieldList;};#endif // EXPORTEXCELOBJECT_H.cpp文件#include "exportexcelobject.h"#include #include #include int ExportExcelObject::export2Excel(){ if(fieldList.size() <= 0) { qDebug() << "ExportExcelObject::export2Excel failed: No fields defined."; return -1; } QSqlDatabase db = QSqlDatabase::addDatabase("QODBC", "excelexport"); if(!db.isValid()) { qDebug() << "ExportExcelObject::export2Excel failed: QODBC not supported."; return -2; } // set the dsn string QString dsn = QString("DRIVER={Microsoft Excel Driver (*.xls)};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%1\";DBQ=%2"). arg(excelFilePath).arg(excelFilePath); db.setDatabaseName(dsn); if(!db.open()) { qDebug() << "ExportExcelObject::export2Excel failed: Create Excel file failed by DRIVER={Microsoft Excel Driver (*.xls)}."; //QSqlDatabase::removeDatabase("excelexport"); return -3; } QSqlQuery query(db); //drop the table if it's already exists QString s, sSql = QString("DROP TABLE [%1] (").arg(sheetName); query.exec(sSql); //create the table (sheet in Excel file) sSql = QString("CREATE TABLE [%1] (").arg(sheetName); for (int i = 0; i < fieldList.size(); i++) { s = QString("[%1] %2").arg(fieldList.at(i)->sFieldName).arg(fieldList.at(i)->sFieldType); sSql += s; if(i < fieldList.size() - 1) sSql += " , "; } sSql += ")"; query.prepare(sSql); if(!query.exec()) { qDebug() << "ExportExcelObject::export2Excel failed: Create Excel sheet failed."; //db.close(); //QSqlDatabase::removeDatabase("excelexport"); return -4; } //add all rows sSql = QString("INSERT INTO [%1] (").arg(sheetName); for (int i = 0; i < fieldList.size(); i++) { sSql += fieldList.at(i)->sFieldName; if(i < fieldList.size() - 1) sSql += " , "; } sSql += ") VALUES ("; for (int i = 0; i < fieldList.size(); i++) { sSql += QString(":data%1").arg(i); if(i < fieldList.size() - 1) sSql += " , "; } sSql += ")"; qDebug() << sSql; int r, iRet = 0; for(r = 0 ; r < tableView->model()->rowCount() ; r++) { query.prepare(sSql); for (int c = 0; c < fieldList.size(); c++) { query.bindValue(QString(":data%1").arg(c), tableView->model()->data(tableView->model()->index(r, fieldList.at(c)->iCol))); } if(query.exec()) iRet++; if(r % 10 == 0) emit exportedRowCount(r); } emit exportedRowCount(r); return iRet;}具体用到槽函数时:void MainWindow::onpushButtonclicked(){ QString fileName = QFileDialog::getSaveFileName(this, tr("Excel file"), qApp->applicationDirPath (), tr("Excel Files (*.xls)")); if (fileName.isEmpty()) return; ExportExcelObject obj(fileName, "mydata", ui->tableView); obj.addField(3, "colum4", "char(20)"); obj.addField(1, "colum2", "char(20)"); obj.addField(2, "colum3", "char(20)"); obj.addField(4, "colum5", "char(20)"); obj.addField(5, "colum6", "char(20)"); ui->progressBar->setValue(0); ui->progressBar->setMaximum(ui->tableView->model()->rowCount()); connect(&obj, SIGNAL(exportedRowCount(int)), ui->progressBar, SLOT(setValue(int))); int retVal = obj.export2Excel(); if( retVal > 0) { QMessageBox::information(this, tr("Done"), QString(tr("%1 records exported!")).arg(retVal) ); }}
0 1