Qt学习笔记之数据库结构设计7

网友投稿 130 2024-01-26

四、导出EXCEL表最后,就是导出excel了,创建一个新的类odbcexcel.h文件复制#ifndef ODBCEXCEL_H#define ODBCEXCEL_H#include#include#

include#include#include#includeclassOdbcExcel {public: OdbcExcel(); //将数据保存为excelboolstaticsave

(QString filePath,QStringList headers,QList data,QString comment=""); //将QTableView保存为excelboolstatic

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

(){return error;} private: voidstaticprintError( QSqlError error); boolstaticinsert(QSqlQuery& query, QString sheetName, QStringList slist)

; static QString error; }; #endif// ODBCEXCEL_Hodbcexcel.c复制#include"odbcexcel.h" #include"odbcexcel.h"

#include OdbcExcel::OdbcExcel() { } QString OdbcExcel::error; bool OdbcExcel::save(QString filePath, QStringList headers, QList

data,QString comment) { QString sheetName = "Sheet1"; QSqlDatabase db = QSqlDatabase::addDatabase(

"QODBC","excelexport"); if( !db.isValid()) { error="数据库驱动异常"; return false;

//! type error } QString dsn = "DRIVER={Microsoft Excel Driver (*.xls)};""DSN=;FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"

"+filePath+"\\";DBQ="+filePath; db.setDatabaseName( dsn); // open connectionif( !db.open()) {

error="无法打开数据库"; return false; //! db error } QSqlQuery query(db); QString sql;

// drop the table if its already exists sql = QString("DROP TABLE [%1]").arg(sheetName); query

.exec( sql); //create the table (sheet in Excel file) sql = QString("CREATE TABLE [%1] (").arg(sheetName);

foreach (QString name, headers) { sql +=QString("[%1] varchar(200)").arg(name); if(name!=headers.last()) sql +=

","; } sql += ")"; query.prepare( sql); if( !query.exec()) { OdbcExcel::printError(

query.lastError()); db.close(); return false; } foreach (QStringList slist, data) { insert(

query,sheetName,slist); } if(!comment.isEmpty()) { QStringList slist; slist<

for(int i=0,n=headers.size()-1;i

,sheetName,slist); } db.close(); return true; } bool OdbcExcel::saveFromTable(QString filePath,QTableView *tableView, QString comment) { QAbstractI

temModel* model=tableView->model(); const int column=model->columnCount(); const int row=model->rowCount();

//header QStringList headers; for(int i=0;i//隐藏列 if(tableView->isColumnHidden(i))

continue; headers

list; QList data; for(int i=0;iif(model->index(i,0).data().isNull()) continue;

list.clear(); for(int j=0;j//隐藏列 if(tableView->isColumnHidden(j))

continue; list

OdbcExcel::save(filePath,headers,data,comment); } void OdbcExcel::printError(QSqlError error) { QString sqlerr =

error.text(); error=sqlerr; qCritical()

"INSERT INTO [%1] VALUES(").arg( sheetName); for(int i=0,n=slist.size();i

":%1").arg(i); if(i!=n-1) sSql+=","; else sSql+=")"; }

query.prepare( sSql); for(int i=0,n=slist.size();i

).arg(i),slist.at(i)); } if( !query.exec()) { printError( query.lastError());

return false; } return true; } 然后在UI界面中创建一个导出按键,并在按键按下时调用数据库导出类来完成导出excel功能复制//导出void sqlite_sqlquerymodel_edit::on_pushButton_export_clicked() { QFi

leDialog dlg; dlg.setAcceptMode(QFileDialog::AcceptSave); // Qt 5 dlg.setDirectory(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation));

// Qt 4// dlg.setDirectory(QDesktopServices::storageLocation(QDesktopServices::DesktopLocation)); dlg.setNameFilter(

"*.xls"); dlg.selectFile(QDate::currentDate().toString("yyyy-MM-dd.xls")); if(dlg.exec()!= QDialog

::Accepted) return; QString filePath=dlg.selectedFiles()[0]; if(OdbcExcel::saveFromTable(filePath,ui->tableView,

"注释:无")) { QMessageBox::information(this,tr("提示"),tr("保存成功")); } else{ QString msg=

"保存失败!\\n\\r"+OdbcExcel::getError(); QMessageBox::critical(this,tr("错误"),tr(msg.toUtf8())); } }

点击导出后,弹出保存文件框保存文件

保存成功

然后打开excel查看保存的数据跟Qt上的一致

OK,Qt操作数据库就到这了。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Qt学习笔记之数据库结构设计6
下一篇:API技巧集(一)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~