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;在包中添加…

比萨问题–建造者与装饰者

问题陈述 我们需要为一家披萨公司构建软件&#xff0c;该公司想要准备各种类型的披萨&#xff0c;例如鸡肉披萨&#xff0c;扁平面包&#xff0c;意大利辣香肠披萨和额外的奶酪&#xff0c;并在上面放些配料。 让我们尝试看看哪种设计模式适合该问题说明以及在哪种情况下。 传…

系统启动

1.开机2.bios加电自检power on self test 由于此时显卡还未初始化&#xff0c;只能靠声音辨别错误3.将boot sector读入0000&#xff1a;7c00处4.检查0000&#xff1a;7def是否等于0xaa555.跳转到0000&#xff1a;7c00处执行MBR程序6.MBR将自己复制到0000&#xff1a;0600处执行…

bzoj3589 动态树 求链并 容斥

bzoj3589 动态树 链接 bzoj 思路 求链并。 发现只有最多5条链子&#xff0c;可以容斥。 链交求法&#xff1a;链顶是两条链顶深度大的那个&#xff0c;链底是两个链底的\(lca\) 如果链底深度小于链顶&#xff0c;就说明两条链没有交集。 复杂度\(m*2^klog^2n\) 还有一种做法。 …

NodeJS学习目录

前面的话 几年前&#xff0c;对于学习NodeJS可能还有所迟疑&#xff0c;怕分散了前端学习的精力。但到了现在&#xff0c;如果不学习nodeJS&#xff0c;前端的学习却可能无法再有所进展。技术的进步就是这么残酷。对新技术观望的时候&#xff0c;该技术已经大行其道了 小火柴将…

最佳加法表达式

题意&#xff1a;有一个由1..9组成的数字串.问如果将m个加号插入到这个数字串中,在各种可能形成的表达式中&#xff0c;值最小的那个表达式的值是多少。输入&#xff1a;5 31 2 3 4 5输出&#xff1a;24 1 #include<iostream>2 #include<algorithm>3 using namespa…

我最喜欢的IntelliJ IDEA功能

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

[转载]PHP 计算时间差

我们常常在网站上看到某篇文章发表于“3天前”&#xff0c;“5个月前”&#xff0c;“4年前”。下面这个函数就提供了计算这个时间差的功能。 <?php/*** 时间差计算** param Timestamp $time* return String Time Elapsed* author Shelley Shyan* copyright http://phparch…

cd1101d 树形dp

cd1101d 简单dp 链接 codeforces 思路 所有数的质因数存下来&#xff0c;最多6个。 然后\(f[i][j][0/1]\)表示i子树内链gcd为j的i是否为链头。 暴力转移就行了 代码 #include <bits/stdc.h> using namespace std; const int _2e57,N2e5; int n,pri[_],vis[_],cnt; vector…

深入理解闭包系列第五篇——闭包的10种形式

前面的话 根据闭包的定义&#xff0c;我们知道&#xff0c;无论通过何种手段&#xff0c;只要将内部函数传递到所在的词法作用域以外&#xff0c;它都会持有对原始作用域的引用&#xff0c;无论在何处执行这个函数都会使用闭包。接下来&#xff0c;本文将详细介绍闭包的10种形式…

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;其中…

jQuery设计思想

前面的话 在深入了解jQuery的各个细节之前&#xff0c;需要对jQuery的设计思想有一个大致的了解。在遇到问题时&#xff0c; 知道应该使用jQuery的哪一个功能&#xff0c;然后迅速从手册中找到具体的用法。本文将详细介绍jQuery的设计思想 选择元素 jQuery的基本设计思想和主要…

sql性能优化二

1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂&#xff0c;这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的&#xff0c;从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别&#xff1a; ORACLE试图将其转换成多个表的连接&#xff0c;如果…

cf1039D 分块

cf1039D 链接 cf 思路 一次k可以贪心O(n)算。 对于\(≤\sqrt{n}\)的k&#xff0c;暴力算。 对于\(&#xff1e;\sqrt{n}\)的k&#xff0c;最多会有\(\sqrt{n}\)种答案&#xff0c;而且答案单调。 二分就行了。 复杂度\(O(nlognn\sqrt{n}logn)\) 递归会被卡&#xff0c;所以要记…

Source Insight 常用设置和快捷键大全

摘自&#xff1a;https://www.cnblogs.com/bluestorm/archive/2012/10/28/2743792.html Source Insight 4.0 文件类型、编码格式、tab转空格、tab键自动补全设置。。。http://www.cnblogs.com/bluestorm/p/6864540.html 1.括号配对高亮&#xff1a;“在前括号左侧&#xff0c;后…

JUnit中的参数化测试运行器

我们都有书面的单元测试&#xff0c;其中在一个测试中针对不同的可能的输入输出组合进行测试。 让我们以一个简单的斐波那契数列为例来看看它是如何完成的。 以下代码针对提到的元素数量计算斐波那契数列&#xff1a; import java.math.BigInteger; import java.util.ArrayLi…

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对象也都有一套自己的属性。下…

CF888G XOR-MST 最小异或生成树

CF888G XOR-MST 链接 CF888G 思路 trie上贪心&#xff0c;先左右两边连边&#xff0c;再用一条边的代价连起左右两颗树。因为内部的边一定比跨两棵树的边权笑&#xff0c;显然是对的。 代码自己瞎yy的。启发式合并 代码 #include <bits/stdc.h> #define ll long long usi…