函數聲明部分:需求:將tableview中顯示的數據導出到Excel表格中
首先在項目文件.pro中加入
QT += axcontainer
同時在操作的界面上加入頭文件#include<QAxObject>,採用Excel控件
tableview是利用QSqlTableModel調用的數據庫,若不想顯示某列數據,調用hideCloumn(),在打印的時候判斷isColumnHidden()隱藏的列跳過即可,,主要實現代碼如下:
//隱藏列
ui->tableView->hideColumn(0);
//判斷隱藏列
if(tableView->isColumnHidden(j))
聲明部分:
//將數據保存爲excel
bool static save(QString filePath,QStringList headers,QList<QStringList> data,QString comment="");
//將QTableView保存爲excel
bool static saveFromTable(QString filePath,QTableView *tableView,QString comment="");
bool static insert(QSqlQuery& query, QString sheetName, QStringList slist);
實現部分:
bool UIDemo01::saveFromTable(QString filePath, QTableView *tableView, QString comment)
{
QAbstractItemModel *model=tableView->model();
const int column=model->columnCount();
const int row=model->rowCount();
//header
QStringList headers;
for(int i=0;i<column;i++)
{
//隱藏列
if(tableView->isColumnHidden(i))
continue;
headers<<model->headerData(i,Qt::Horizontal).toString();
}
//data
QStringList list;
QList<QStringList> data;
for(int i=0;i<row;i++)
{
if(model->index(i,0).data().isNull())
continue;
list.clear();
for(int j=0;j<column;j++){
//隱藏列
if(tableView->isColumnHidden(j))
continue;
list<<model->index(i,j).data().toString();
}
data<<list;
}
return UIDemo01::save(filePath,headers,data,comment);
}
bool UIDemo01::save(QString filePath, QStringList headers, QList<QStringList> data,QString comment)
{
QString sheetName = "Sheet1";
// 創建一個數據庫實例, 設置連接字符串
QSqlDatabase dbexcel = QSqlDatabase::addDatabase("QODBC","excelexport");
if(!dbexcel.isValid())
{
qDebug()<<"數據庫驅動異常";
return false; //! type error
}
QString dsn = QString("DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%1\";DBQ=%2").
arg(filePath).arg(filePath);
qDebug()<<dsn;
dbexcel.setDatabaseName(dsn);
// open connection
if(!dbexcel.open())
{
qDebug()<<"無法打開數據庫";
return false; //! db error
}
QSqlQuery query(dbexcel);
QString sql;
// drop the table if it's 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()) {
//UIDemo01::printError( query.lastError());
dbexcel.close();
return false;
}
foreach (QStringList slist, data) {
insert(query,sheetName,slist);
}
if(!comment.isEmpty())
{
QStringList slist;
slist<<comment;
for(int i=0,n=headers.size()-1;i<n;i++)
{
slist<<"";
}
insert(query,sheetName,slist);
}
dbexcel.close();
return true;
}
bool UIDemo01::insert(QSqlQuery &query, QString sheetName, QStringList slist)
{
QString sSql = QString("INSERT INTO [%1] VALUES(").arg(sheetName);
for(int i=0,n=slist.size();i<n;i++)
{
sSql+=QString(":%1").arg(i);
if(i!=n-1)
sSql+=",";
else
sSql+=")";
}
query.prepare(sSql);
for(int i=0,n=slist.size();i<n;i++)
{
query.bindValue(QString(":%1").arg(i),slist.at(i));
}
if( !query.exec()) {
return false;
}
return true;
}
調用代碼:
void UIDemo01::on_pushButtonOutExcel_clicked()
{
QFileDialog dlg;
QString filename;
dlg.setAcceptMode(QFileDialog::AcceptSave);
// Qt 5
dlg.setDirectory(QStandardPaths::writableLocation(QStandardPaths::DesktopLocation));
// Qt 4
// dlg.setDirectory(QDesktopServices::storageLocation(QDesktopServices::DesktopLocation));
dlg.setNameFilter("*.xls");
filename=QDate::currentDate().toString("yyyy-MM-dd")+"body.xls";
dlg.selectFile(filename);
if(dlg.exec()!= QDialog::Accepted)
return;
QString filePath=dlg.selectedFiles()[0];//得到用戶選擇的文件名
qDebug()<<filePath;
if(UIDemo01::saveFromTable(filePath,ui->tableViewCheck,"註釋:無")) {
QMessageBox::information(this,tr("提示"),tr("保存成功"));
}
else{
QMessageBox::information(this,tr("提示"),tr("保存失敗"));
}
}
有一點需要注意的是,在調用Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)注意中間有空格