38.QT-QAxObject快速写入EXCEL示例

参考链接: https://blog.csdn.net/czyt1988/article/details/52121360

http://blog.sina.com.cn/s/blog_a6fb6cc90101gv2p.html

 

1. QAxObject介绍

在QT中,有个自带的QAxObject类,可以直接操作EXCEL

除此之外,当我们操作某个文件夹下的EXCEL的时候,都会在该文件夹下出现一个隐藏文件~$XX.xlsx,如下图所示:

此时,如果我们再用QAxObject去操作这个文件时,该文件是只读的,无法保存成功的,所以我们使用QAxObject时,需要提前判断一次.

 

2.示例

首先在项目下创建一个模板templatePath.xlsx文件

 

3.效果如下

4.写代码

#include <QApplication>
#include "widget.h"
#include <QtGui>
#include <QAxObject>
#include <QStandardPaths>
#include <QFileDialog>
#include <QFileDialog>/*excel操作*/
enum EXcel_ColumnType{ColumnA = 1,ColumnB = 2,ColumnC = 3,ColumnD = 4,ColumnE = 5,ColumnF = 6,ColumnG = 7,ColumnH = 8,ColumnI = 9
};QString saveas()
{QString file;QString filter;//如果版本低于QT5,则需要将://  QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),//改为:QDesktopServices::storageLocation(QDesktopServices::DesktopLocation),file = QFileDialog::getSaveFileName (NULL,                               //父组件"另存为",                              //标题QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),                 //设置路径, .表示当前路径,./表示更目录"Excel(*.xlsx)",     //过滤器&filter  );return file;
}//设置EXCEL中单个内容的数据
void  Excel_SetCell(QAxObject *worksheet,EXcel_ColumnType column,int row,QColor color,QString text)
{QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, column);cell->setProperty("Value", text);QAxObject *font = cell->querySubObject("Font");font->setProperty("Color", color);
}//把QVariant转为QList<QList<QVariant> >,用于快速读出的
void castVariant2ListListVariant(const QVariant &var, QList<QList<QVariant> > &res)
{QVariantList varRows = var.toList();if(varRows.isEmpty()){return;}const int rowCount = varRows.size();QVariantList rowData;for(int i=0;i<rowCount;++i){rowData = varRows[i].toList();res.push_back(rowData);}
}//把QList<QList<QVariant> > 转为QVariant,用于快速写入的
void castListListVariant2Variant(const QList<QList<QVariant> > &cells, QVariant &res)
{QVariantList vars;const int rows = cells.size();for(int i=0;i<rows;++i){vars.append(QVariant(cells[i]));}res = QVariant(vars);
}int main(int argc, char *argv[])
{QApplication a(argc, argv);QString templatePath = "./template.xlsx";QFileInfo info(templatePath);if(!info.exists()){qDebug()<<"template.xlsx is NULL";return 0;}templatePath = info.absoluteFilePath();                   //获取模板的绝地路径templatePath = QDir::toNativeSeparators(templatePath);   //转换一下路径,让windows能够识别QString ExcelFile = QDir::toNativeSeparators(saveas());  //打开文件保存对话框,找到要保存的位置if(ExcelFile=="")return  0;QFile::copy(templatePath, ExcelFile);                   //将模板文件复制到要保存的位置去
info.setFile(ExcelFile);info.setFile(info.dir().path()+"/~$"+info.fileName());if(info.exists())          //判断一下,有没有"~$XXX.xlsx"文件存在,是不是为只读{qDebug()<<"报表属性为只读,请检查文件是否已打开!";return   0;}QAxObject *excel = new QAxObject();//建立excel操作对象excel->setControl("Excel.Application");//连接Excel控件excel->setProperty("Visible", true);//显示窗体看效果excel->setProperty("DisplayAlerts", false);//显示警告看效果QAxObject *workbooks = excel->querySubObject("WorkBooks");QAxObject* workbook = workbooks->querySubObject("Open(const QString&)",QDir::toNativeSeparators(ExcelFile) ); //打开
excel->setProperty("Caption", "Qt Excel");      //标题为Qt ExcelQAxObject *work_book = excel->querySubObject("ActiveWorkBook");QAxObject *worksheet = work_book->querySubObject("Sheets(int)",1);     //获取表单1
Excel_SetCell(worksheet,ColumnB,2,QColor(74,51,255),"12345");     //设置B2单元格内容为12345
Excel_SetCell(worksheet,ColumnB,3,QColor(255,255,0),"B3");     //设置B3单元格内容
Excel_SetCell(worksheet,ColumnB,4,QColor(255,0,0),"B4");     //设置B4单元格内容/*批量一次性设置A6~I106所在内容*/QAxObject *user_range = worksheet->querySubObject("Range(const QString&)","A6:I106");QList<QList<QVariant> > datas;for(int i=1;i<101;i++){QList<QVariant> rows;for(int j=1;j<10;j++){rows.append(i*j);}datas.append(rows);}QVariant var;castListListVariant2Variant(datas,var);user_range->setProperty("Value", var);workbook->dynamicCall("Save()" );

// workbook
->dynamicCall("Close()"); //关闭文件// excel->dynamicCall("Quit()");//关闭excelreturn 0;}

 

未完待续,下章学习Qtxlsx库操作EXCEL: https://www.cnblogs.com/lifexy/p/10743352.html

转载于:https://www.cnblogs.com/lifexy/p/10743316.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EA常见画图(类图、包图、构件图、状态图、顺序图、活动图)

EA常见活动图&#xff0c;状态图画法 类图:111&#xff08;1&#xff09;给关系添加注释&#xff08;2&#xff09;设置关系线样式 包图&#xff1a;&#xff08;1&#xff09;创建包图&#xff08;2&#xff09;在包中添加子包&#xff1a;&#xff08;3&#xff09;在包中添加…

我最喜欢的IntelliJ IDEA功能

我已经是IntelliJ IDEA的长期用户&#xff08;和客户&#xff09;。 我想我是在2005年或2006年&#xff08;版本5.0&#xff09;左右开始使用它的。 那时我是Eclipse用户。 我的一些同事向我推荐了它&#xff0c;起初我没有被说服&#xff0c;但是在尝试之后我印象深刻。 现在…

selenium 常见问题

启动selenium时报错如下异常&#xff1a; selenium.common.exceptions.WebDriverException: Message: geckodriver executable needs to be in PATH. 解决方式&#xff1a;需要下载geckodriver&#xff0c;并放在path的环境变量下&#xff0c;下载地址&#xff1a;https://gith…

通过示例了解挥发

我们已经花了几个月的时间来稳定Plumbr中的锁定检测功能 。 在此期间&#xff0c;我们遇到了许多棘手的并发问题。 许多问题是独特的&#xff0c;但是一种特殊类型的问题一直反复出现。 您可能已经猜到了–滥用volatile关键字。 我们已经发现并解决了许多问题&#xff0c;其中…

HDU 1212 Big Number

题意&#xff1a;给一数字字符串s ( ns.size()<1000 ) 和数字m (<1e5) 求s%m 模拟除法&#xff0c; k初值0&#xff0c;按s[0]...累乘相加&#xff0c;把字符串还原成数字&#xff0c;比m大时-m&#xff0c;继续按位还原到s[n-1] 此时剩下的k再%m即为所求 #include<…

BOM之navigator对象和用户代理检测

前面的话 navigator对象现在已经成为识别客户端浏览器的事实标准&#xff0c;navigator对象是所有支持javascript的浏览器所共有的。本文将详细介绍navigator对象和用户代理检测 属性 与其他BOM对象的情况一样&#xff0c;每个浏览器中的navigator对象也都有一套自己的属性。下…

智能自动PPR更改事件策略

ADF开发人员普遍认为&#xff0c;将迭代器绑定更改事件策略设置为ppr在性能方面不是一件好事&#xff0c;因为此策略会强制框架刷新每个请求上绑定到此迭代器的所有属性绑定。 这不是真的&#xff01; 框架仅刷新在请求期间已更改的属性和依赖于已更改属性的属性。 让我们考虑…

装饰器设计模式的应用

嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将展示装饰设计模式的实际应用。 装饰器设计模式是一种广泛使用的设计模式&#xff0c;同时在运行期间处理图形&#xff0c;树木和动态更改。 如果您正在寻找或尝试进行递归&#xff0c;这也是一个不错的选择。 我喜欢它。…

构造函数 基本使用

相关知识点&#xff1a; 构造函数、原型对象、实例对象 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta h…

Vista,Windows7中给IIS7添加PHP支持

截止到发文时&#xff08;2009年9月25日&#xff09;&#xff0c;PHP是最新版本为5.3.0&#xff0c;但是5.3.0在IIS中的运行方式是FastCGI&#xff0c;要在Vista的IIS7上实现这一点我始终没弄成。最后我还是用的老方法&#xff0c;ISAPI&#xff0c;选用了一个5.3以前的版本&am…

python画手绘图

第一步&#xff1a;插入代码 #e17.1HandDrawPic.py from PIL import Image import numpy as np vec_el np.pi/2.2 # 光源的俯视角度&#xff0c;弧度值 vec_az np.pi/4. # 光源的方位角度&#xff0c;弧度值 depth 10. # (0-100) im Image.open(C:\\Users\\Thinkpad\\Deskt…

解读阿里巴巴集团的“大中台、小前台”组织战略

解读阿里巴巴集团的“大中台、小前台”组织战略 https://www.iyiou.com/p/92012.html 亿欧导读 ] 阿里的“中台战略” 不是一个简单的组织变革&#xff0c;还有业务变革、机制变革、技术架构变革的一次全面转型。 【编者按】阿里巴巴“大中台小前台”的中台战略的官方提法源自2…

深入理解DOM节点关系

前面的话 DOM可以将任何HTML描绘成一个由多层节点构成的结构。节点分为12种不同类型&#xff0c;每种类型分别表示文档中不同的信息及标记。每个节点都拥有各自的特点、数据和方法&#xff0c;也与其他节点存在某种关系。节点之间的关系构成了层次&#xff0c;而所有页面标记则…

分布式锁(基于redis和zookeeper)详解

分布式锁&#xff08;基于redis和zookeeper&#xff09;详解 https://blog.csdn.net/a15835774652/article/details/81775044 为什么写这篇文章&#xff1f; 目前网上大部分的基于zookeeper&#xff0c;和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况&#xf…

JavaFX技巧12:在CSS中定义图标

当您是像我这样来自Swing的UI开发人员时&#xff0c;您很有可能仍在代码中直接设置图像/图标。 最可能是这样的&#xff1a; import javafx.scene.control.Label; import javafx.scene.image.ImageView;public class MyLabel extends Label {public MyLabel() {setGraphic(new…

第八次点评

本周心得&#xff1a; 本周没有作业 &#xff0c;批改的上周的作业。需求分析以及团队的明确分工是开发前准备的要素。本次批改主要侧重于需求分析的调研。 博客园地址https://www.cnblogs.com/zhaojh123/ 博客园点评博客&#xff1a; https://www.cnblogs.com/yanqignkui-123/…

JDBC、Tomcat为什么要破坏双亲委派模型?

问题一&#xff1a;双亲委派模型是什么 如果一个类加载器收到了加载某个类的请求&#xff0c;则该类加载器并不会去加载该类&#xff0c;而是把这个请求委派给父类加载器&#xff0c;每一个层次的类加载器都是如此&#xff0c;因此所有的类加载请求最终都会传送到顶端的启动类加…

dpdk之路-环境部署

dpdk实验环境部署 1、实验环境说明 vmware workstatioin 12 centos 7.5.1804 dpdk-stable-18.11.1 2、实验步骤 &#xff08;1&#xff09;虚拟机安装 http://vault.centos.org/7.5.1804/isos/x86_64/从链接下载CentOS-7-x86_64-DVD-1804.iso&#xff0c;安装时需要准备3张虚拟…

基于知识图谱的医疗诊断系统论文

本作品禁止任何人/企业申请专利&#xff0c;禁止任何人使用本作品参加任何比赛或作为毕业设计&#xff0c;如使用本作品源码进行商业用途务必联系作者。 一.科学性 1.研究意义 信息科技经过 60 余年的发展&#xff0c;已经普及到社会生活的每一个角落。随着信息技术在国家治理、…

华为云(ECS)-linux服务器中-Ubuntu图形界面安装-解决root登录受限-VNCviwer/Teamviwer远程访问教程...

安装ubuntu-desktop 1.更新软件库 apt-get update2.升级软件 apt-get upgrade3.安装桌面 apt-get install ubuntu-desktop 解决root登录受限 华为云登录进去是guest用户&#xff0c;不能选择登录用户且不需要密码就即可登录。 登录进去会如下警告信息&#xff1a; 首先下载…