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

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

ok,进入正题。

现在我有一个table,如图:

图中的table可以是QTableWidget或QTableView

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

ui->tableWidget->setColumnCount();

运行中效果如下:

现在问题来了,怎样才能将我的table保存为excel?

参照前面的博客,我自己重写了一个OdbcExcel类进行操作,先把代码贴上:

odbcexcel.h

 #ifndef ODBCEXCEL_H
#define ODBCEXCEL_H #include <QObject>
#include <QStringList>
#include <QSqlQuery>
#include <QSqlDatabase>
#include <QSqlError>
#include <QTableView> /**
* @brief The OdbcExcel class
* @author 郑泽桐
*/ class OdbcExcel
{
public:
OdbcExcel();
//将数据保存为excel
bool static save(QString filePath,QStringList headers,QList<QStringList> data,QString comment="");
//将QTableView保存为excel
bool static saveFromTable(QString filePath,QTableView *tableView,QString comment="");
//获取错误信息
QString static getError(){return error;}
private:
void static printError( QSqlError error);
bool static insert(QSqlQuery& query, QString sheetName, QStringList slist);
static QString error;
}; #endif // ODBCEXCEL_H

odbcexcel.cpp

 #include "odbcexcel.h"
#include <QDebug> OdbcExcel::OdbcExcel()
{
}
QString OdbcExcel::error; bool OdbcExcel::save(QString filePath, QStringList headers, QList<QStringList> 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 connection
if( !db.open())
{
error="无法打开数据库";
return false; //! db error
} QSqlQuery query(db);
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()) {
OdbcExcel::printError( query.lastError());
db.close();
return false;
}
foreach (QStringList slist, data) {
insert(query,sheetName,slist);
} if(!comment.isEmpty())
{
QStringList slist;
slist<<comment;
for(int i=,n=headers.size()-;i<n;i++)
{
slist<<"";
}
insert(query,sheetName,slist);
} db.close();
return true;
} bool OdbcExcel::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=;i<column;i++)
{
//隐藏列
if(tableView->isColumnHidden(i))
continue;
headers<<model->headerData(i,Qt::Horizontal).toString();
} //data
QStringList list;
QList<QStringList> data;
for(int i=;i<row;i++)
{
if(model->index(i,).data().isNull())
continue;
list.clear();
for(int j=;j<column;j++){
//隐藏列
if(tableView->isColumnHidden(j))
continue;
list<<model->index(i,j).data().toString();
}
data<<list;
}
return OdbcExcel::save(filePath,headers,data,comment);
} void OdbcExcel::printError(QSqlError error)
{
QString sqlerr = error.text();
error=sqlerr;
qCritical()<<sqlerr;
} bool OdbcExcel::insert(QSqlQuery &query, QString sheetName, QStringList slist)
{
QString sSql = QString("INSERT INTO [%1] VALUES(").arg( sheetName);
for(int i=,n=slist.size();i<n;i++)
{
sSql+=QString(":%1").arg(i);
if(i!=n-)
sSql+=",";
else
sSql+=")";
}
query.prepare( sSql);
for(int i=,n=slist.size();i<n;i++)
{
query.bindValue(QString(":%1").arg(i),slist.at(i));
}
if( !query.exec()) {
printError( query.lastError());
return false;
}
return true;
}

接下来就是调用了,save按键的click事件:

   QFileDialog 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()[];
if(OdbcExcel::saveFromTable(filePath,ui->tableWidget,"注释:无")) {
QMessageBox::information(this,tr("提示"),tr("保存成功"));
}
else{
QString msg="保存失败!\n\r"+OdbcExcel::getError();
QMessageBox::critical(this,tr("错误"),tr(msg.toUtf8()));
}

看一下效果:

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

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

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

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

Qt将表格table保存为excel(odbc方式)的更多相关文章

  1. html table表格导出excel的方法 html5 table导出Excel HTML用JS导出Excel的五种方法 html中table导出Excel 前端开发 将table内容导出到excel HTML table导出到Excel中的解决办法 js实现table导出Excel,保留table样式

    先上代码   <script type="text/javascript" language="javascript">   var idTmr; ...

  2. 【HTML5版】导出Table数据并保存为Excel

    首发我的博客 http://blog.meathill.com/tech/js/export-table-data-into-a-excel-file.html 最近接到这么个需求,要把<tab ...

  3. asp.net将内容导出到Excel,Table表格数据(html)导出EXCEL

    代码: /// <summary> /// HTML Table表格数据(html)导出EXCEL /// </summary> /// <param name=&quo ...

  4. qt QTableWidget&&QTableView 导出数据到excel

    通常情况下,我们在开发过程中比较常用的方法是将表格的数据到处到excel文件.我也在这个点上头疼了很长时间,不过功夫不负苦心人,最终还是勉强达到效果,为了后面再次用到时不手忙脚乱现在将方法寄存在此,如 ...

  5. [转]qt QTableWidget&&QTableView 导出数据到excel

    转自http://blog.csdn.net/fairystepwgl/article/details/54576372 注意:由于在qt导出的过程中分为QTableWidget导出文件到excel和 ...

  6. Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等

    目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...

  7. html table 保存到excel中

    引用:HTML中的table导出为Excel文件 <!DOCTYPE html> <html lang="en"> <head> <met ...

  8. Qt实现表格树控件-支持多级表头

    目录 一.概述 二.效果展示 三.实现方式 四.多级表头 1.数据源 2.表格 3.QStyledItemDelegate绘制代理 五.测试代码 六.相关文章 原文链接:Qt实现表格树控件-支持多级表 ...

  9. HTML Table导出为Excel的方法

    HTML Table导出为Excel的方法: 直接上源码 <html> <head> <meta http-equiv="Content-Type" ...

随机推荐

  1. C语言初学 转义字符举例

    #include<stdio.h> main() { printf("\101 \x42 C\n"); printf("I say:\"How ar ...

  2. SalutJs

    SalutJs 前言 卤煮在公司之初接触到的是一个微信APP应用.前端技术采用的是Backbone+zepto等小型JS类库.在项目开发之初,这类中小型的项目采用这两种库可以满足基本的需求.然而,随着 ...

  3. cad 画 tp图

    本文记录了cad 绘制 结构图 和触摸屏激光图. 1作为一个新手,我先要做的是适应操作界面. 页面:ctrl+鼠标滚轮 (类比,ps,ad等软件都是这样的.) 选取,划线,图层.等... 2画图... ...

  4. ROM包内的大致框架及各个文件的作用[转]

    1.system/app这个里面主要存放的是常规的应用程序,都是以apk格式结尾的文件,在这个文件夹下面的程序为系统默认的组件,个人安装的软件不会出现在这里,而是data文件夹中. 2.system/ ...

  5. JUnit使用Eclipse建立Test Suite - 就是爱Java

    当JUnit有多个或所有的Test Case要执行,此时就需要Test Suite来管理众多的Test Case,利用Eclipse的整合开发环境,可以针对多个不相关的Test Case或Test S ...

  6. RedisTemplate

    Spring Boot中Jedis几个api返回值的确认 @RequestMapping("/del/{key}") public String del(@PathVariable ...

  7. NOI2012 骑行川藏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2876 表示完全不会...... 还是跪拜大神吧 http://www.cnblogs.com/Ger ...

  8. jquery判断checkbox是否选中

    $('input:checkbox').click(function () { if ($("#chkPile").is(":checked")) { $(); ...

  9. 算法导论(第三版)Exercises2.1(插入排序、线性查找、N位大数相加)

    关于练习程序的说明参见置顶的那篇. 2.1-1: 31 41 59 26 41 58 31 41 59 26 41 58 31 41 59 26 41 58 26 31 41 59 41 58 26 ...

  10. c语言局部变量 静态局部变量 全局变量与静态全局变量

    基本概念: 作用域:起作用的区域,也就是可以工作的范围. 代码块:所谓代码块,就是用{}括起来的一段代码. 数据段:数据段存的是数,像全局变量就是存在数据段的 代码段:存的是程序代码,一般是只读的. ...