[转]qt QTableWidget&&QTableView 导出数据到excel
转自http://blog.csdn.net/fairystepwgl/article/details/54576372
注意:由于在qt导出的过程中分为QTableWidget导出文件到excel和QTableView导出文件到excel两个部分,所以在看这个笔记的的时候需要注意主方法程序中的注释部分,已经具体说明了部分代码的适用情况;
首先在 .pro文件中增加一个配置文件,如下:
1 CONFIG += qaxcontainer #导出excel
第二步,在实现导出功能方法的 .cpp 文件中引入如下类:
- 1 #include <QTableWidget>
- 2 #include <QFileDialog>
- 3 #include <QDesktopServices>
- 4 #include <QMessageBox>
- 5 #include <QAxObject>
第三步,是真正的实现方法,以上所做只是为这个方法做出的铺垫,具体如下:

- 1 //第一个参数是页面上的表格,第二个是导出文件的表头数据
- 2 void FaJianDialog::Table2ExcelByHtml(QTableWidget *table,QString title)
- 3 {
- 4 QString fileName = QFileDialog::getSaveFileName(table, "保存",QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),"Excel 文件(*.xls *.xlsx)");
- 5 if (fileName!="")
- 6 {
- 7 QAxObject *excel = new QAxObject;
- 8 if (excel->setControl("Excel.Application")) //连接Excel控件
- 9 {
- 10 excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体
- 11 excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
- 12 QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合
- 13 workbooks->dynamicCall("Add");//新建一个工作簿
- 14 QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿
- 15 QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
- 16
- 17 int i,j;
- 18 //QTablewidget 获取数据的列数
- 19 int colcount=table->columnCount();
- 20 //QTablewidget 获取数据的行数
- 21 int rowscount=table->rowCount()
- 22
- 23 //QTableView 获取列数
- 24 //int colount=ui->tableview->model->columnCount();
- 25 //QTableView 获取行数
- 26 //int rowcount=ui->tableview->model->rowCount();
- 27
- 28 QAxObject *cell,*col;
- 29 //标题行
- 30 cell=worksheet->querySubObject("Cells(int,int)", 1, 1);
- 31 cell->dynamicCall("SetValue(const QString&)", title);
- 32 cell->querySubObject("Font")->setProperty("Size", 18);
- 33 //调整行高
- 34 worksheet->querySubObject("Range(const QString&)", "1:1")->setProperty("RowHeight", 30);
- 35 //合并标题行
- 36 QString cellTitle;
- 37 cellTitle.append("A1:");
- 38 cellTitle.append(QChar(colcount - 1 + 'A'));
- 39 cellTitle.append(QString::number(1));
- 40 QAxObject *range = worksheet->querySubObject("Range(const QString&)", cellTitle);
- 41 range->setProperty("WrapText", true);
- 42 range->setProperty("MergeCells", true);
- 43 range->setProperty("HorizontalAlignment", -4108);//xlCenter
- 44 range->setProperty("VerticalAlignment", -4108);//xlCenter
- 45 //列标题
- 46 for(i=0;i<colcount;i++)
- 47 {
- 48 QString columnName;
- 49 columnName.append(QChar(i + 'A'));
- 50 columnName.append(":");
- 51 columnName.append(QChar(i + 'A'));
- 52 col = worksheet->querySubObject("Columns(const QString&)", columnName);
- 53 col->setProperty("ColumnWidth", table->columnWidth(i)/6);
- 54 cell=worksheet->querySubObject("Cells(int,int)", 2, i+1);
- 55 //QTableWidget 获取表格头部文字信息
- 56 columnName=table->horizontalHeaderItem(i)->text();
- 57 //QTableView 获取表格头部文字信息
- 58 // columnName=ui->tableView_right->model()->headerData(i,Qt::Horizontal,Qt::DisplayRole).toString();
- 59 cell->dynamicCall("SetValue(const QString&)", columnName);
- 60 cell->querySubObject("Font")->setProperty("Bold", true);
- 61 cell->querySubObject("Interior")->setProperty("Color",QColor(191, 191, 191));
- 62 cell->setProperty("HorizontalAlignment", -4108);//xlCenter
- 63 cell->setProperty("VerticalAlignment", -4108);//xlCenter
- 64 }
- 65
- 66 //数据区
- 67
- 68 //QTableWidget 获取表格数据部分
- 69 for(i=0;i<rowcount;i++){
- 70 for (j=0;j<colcount;j++)
- 71 {
- 72 worksheet->querySubObject("Cells(int,int)", i+3, j+1)->dynamicCall("SetValue(const QString&)", table->item(i,j)?table->item(i,j)->text():"");
- 73 }
- 74 }
- 75
- 76
- 77 //QTableView 获取表格数据部分
- 78 // for(i=0;i<rowcount;i++) //行数
- 79 // {
- 80 // for (j=0;j<colcount;j++) //列数
- 81 // {
- 82 // QModelIndex index = ui->tableView_right->model()->index(i, j);
- 83 // QString strdata=ui->tableView_right->model()->data(index).toString();
- 84 // worksheet->querySubObject("Cells(int,int)", i+3, j+1)->dynamicCall("SetValue(const QString&)", strdata);
- 85 // }
- 86 // }
- 87
- 88
- 89 //画框线
- 90 QString lrange;
- 91 lrange.append("A2:");
- 92 lrange.append(colcount - 1 + 'A');
- 93 lrange.append(QString::number(table->rowCount() + 2));
- 94 range = worksheet->querySubObject("Range(const QString&)", lrange);
- 95 range->querySubObject("Borders")->setProperty("LineStyle", QString::number(1));
- 96 range->querySubObject("Borders")->setProperty("Color", QColor(0, 0, 0));
- 97 //调整数据区行高
- 98 QString rowsName;
- 99 rowsName.append("2:");
- 100 rowsName.append(QString::number(table->rowCount() + 2));
- 101 range = worksheet->querySubObject("Range(const QString&)", rowsName);
- 102 range->setProperty("RowHeight", 20);
- 103 workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(fileName));//保存至fileName
- 104 workbook->dynamicCall("Close()");//关闭工作簿
- 105 excel->dynamicCall("Quit()");//关闭excel
- 106 delete excel;
- 107 excel=NULL;
- 108 if (QMessageBox::question(NULL,"完成","文件已经导出,是否现在打开?",QMessageBox::Yes|QMessageBox::No)==QMessageBox::Yes)
- 109 {
- 110 QDesktopServices::openUrl(QUrl("file:///" + QDir::toNativeSeparators(fileName)));
- 111 }
- 112 }
- 113 else
- 114 {
- 115 QMessageBox::warning(NULL,"错误","未能创建 Excel 对象,请安装 Microsoft Excel。",QMessageBox::Apply);
- 116 }
- 117 }
- 118 }

到此,你的整个导出功能基本上就相当于完成了。
- int rowCount = m_list.count();
- for (int i = 0;i < rowCount;i++)
- {
- QList<QVariant> temList;
- temList.push_back(QVariant(m_list[i].s1));
- temList.push_back(QVariant(m_list[i].s2));
- temList.push_back(QVariant(m_list[i].s3));
- temList.push_back(QVariant(m_list[i].s4));
- temList.push_back(QVariant(m_list[i].s5));
- temList.push_back(QVariant(m_list[i].s6));
- QAxObject *range = worksheet->querySubObject("Range(QString", QString("A%1:F%2").arg(3+i).arg(3+i));
- range->setProperty("Value", temList);
- }
- // m_list即为table数据
[转]qt QTableWidget&&QTableView 导出数据到excel的更多相关文章
- qt QTableWidget&&QTableView 导出数据到excel
通常情况下,我们在开发过程中比较常用的方法是将表格的数据到处到excel文件.我也在这个点上头疼了很长时间,不过功夫不负苦心人,最终还是勉强达到效果,为了后面再次用到时不手忙脚乱现在将方法寄存在此,如 ...
- 1.ASP.NET MVC使用EPPlus,导出数据到Excel中
好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件. 源代码下载:https://github.com/caofangshe ...
- 导出数据到Excel --使用ExcelReport有感
先看图,这是几个月前用NPOI写的导出数据到Excel,用了上百行代码,而且难控制,导出来也比较难看 excel打开的效果 下面是我用ExcelReport类库导出到Excel的操作 1.首先引用Ex ...
- 使用Open xml 操作Excel系列之二--从data table导出数据到Excel
由于Excel中提供了透视表PivotTable,许多项目都使用它来作为数据分析报表. 在有些情况下,我们需要在Excel中设计好模板,包括数据源表,透视表等, 当数据导入到数据源表时,自动更新透视表 ...
- Dynamics CRM导出数据到Excel
原创地址:http://www.cnblogs.com/jfzhu/p/4276212.html 转载请注明出处 Pivot Table是微软BI的一个重要工具,所以这里讲一下Dynamics CRM ...
- MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult
导出EXCEL方法总结 MVC导出数据到EXCEL的方法有很多种,常见的是: 1.采用EXCEL COM组件来动态生成XLS文件并保存到服务器上,然后转到该文件存放路径即可: 优点:可设置丰富的EXC ...
- php导出数据到excel,防止身份证等数字字符格式变成科学计数的方法
而关于php的也有,但是大多都是用phpExcel导出的方法或者spreadsheet等类或者控件之类的导出方法,而我所在维护的系统却用很简单的方法,如下,网上很少有讲如何设置要导出数据的EXcel格 ...
- NPOI导出数据到Excel
NPOI导出数据到Excel 前言 Asp.net操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微 ...
- ASP.NET导出数据到Excel 实例介绍
ASP.NET导出数据到Excel 该方法只是把asp.net页面保存成html页面只是把后缀改为xlc不过excel可以读取,接下连我看看还有别的方式能导出数据,并利用模版生成. 下面是代码 新建 ...
随机推荐
- Python小练习_数据库表数据导出到excel
需求:只要传入一个表名,就能把所有的数据导入出来,字段名是excel的表头 1.要动态获取到标的字段 cur.descrption能获取到表的字段 fileds = [filed[0] for fil ...
- 用HTTP操作和文件操作把网页下载到sd卡
这里先把代码贴到这里做一个存档,写到SD卡的是一个txt文件,改成HTML格式之后会出现百度主页,但是中文是乱码,这一点先暂时不去研究了. 代码: package com.larry.gotcha; ...
- BZOJ_1406_[AHOI2007]密码箱_枚举+数学
BZOJ_1406_[AHOI2007]密码箱_枚举+数学 Description 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子 ...
- 「NOIP2012」「LuoguP1083」 借教室
Description 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的 ...
- python-----windows下安装face_recognition库
如果直接在cmd命令界面 输入:pip install face_recognition 如下图所示: 如果第一次就会出现一系列的问题,解决此问题就安装如下步骤: 一.如果你本机没有安装vistual ...
- Centos6.6安装后一些常见问题详解
<一>.centos6.6通过VM最小化安装后上不了网的解决方法: 在安装centos6.6时,没有在网络设置中设置网卡自动启动的,安装完系统后,是不能联网的,解决方法如下: vi/etc ...
- springboot读写分离--temp
我最初的想法是: 读方法走读库,写方法走写库(一般是主库),保证在Spring提交事务之前确定数据源. 保证在Spring提交事务之前确定数据源,这个简单,利用AOP写个切换数据源的切面,让他的优先级 ...
- vs2008控制台程序运行一闪而过,不显示按任意键继续
调试运行(F5)而且没插断点.且程序没有暂停的点,就会一闪而过 直接执行(Ctrl+F5),在程序结束前会有“按任意键继续” 当你不想进入调试状态,只想看一看程序执行结果时用ctrl+f5F5会进入调 ...
- View Controller Programming Guide for iOS---(六)---Responding to Display-Related Notifications
Responding to Display-Related Notifications 响应跟显示相关的通知 When the visibility of a view controller’s vi ...
- Android Handler消息机制源码解析
好记性不如烂笔头,今天来分析一下Handler的源码实现 Handler机制是Android系统的基础,是多线程之间切换的基础.下面我们分析一下Handler的源码实现. Handler消息机制有4个 ...