Qt 使用WPS或HTML生成word文档
目录
1.使用HTML生成word文档
2.使用WPS
3.实际展示:
1.使用HTML生成word文档
直接使用QString保存HTML语句,在需要插入数据的地方填充,插入表格地方可循坏拼接字符串
最后将字符串直接显示在QTextEdit控件中,可预览并修改,如果要插入资源图片,在QTextEdit中可以右键资源文件复制路径就可显示图片,导出word文档时则需要把资源图片拷贝出来获取绝对路径。最后新建word文档写入HTML语句。使用WPS打开该文档是默认是web预览全铺开的,需要手动切换页面视图。
QString html = "";html += "<html>";html += "<head>";html += "<title>html to word</title>";html += "<head>";html += "<body>";html += "<h1 style=\"background-color:gray\" align=\"center\" >qt使用HTML转存为word文档</h1>";html += "<hr>";html += "<table width=\"100%\" border=\"1\" cellspacing=\"1\" cellpadding=\"4\" align=\"center\">";html += "<tr>";html += "<td align=\"center\" height=\"60\">表格测试</td>";html += "</tr>";html += "</table>";html += "<table width=\"100%\" border=\"1\" cellspacing=\"1\" cellpadding=\"4\" bgcolor=\"#cccccc\" align=\"center\">";html += "<tr>";html += "<th>第一列</th>";html += "<th>第二列</th>";html += "<th>第三列</th>";html += "<th>第四列</th>";html += "<th>第五列</th>";html += "</tr>";html += "<tr>";html += "<th>123456</th>";html += "<th>aaa</th>";html += "<th>bbb</th>";html += "<th>ccc</th>";html += "<th>ddd</th>";html += "</tr>";html += "</table>";html += "</body>";html += "</html>";ui->textEdit->setHtml(html);QFile wordfile(path);wordfile.open(QIODevice::WriteOnly | QIODevice::Append);QString str = ui->textEdit->toHtml();QTextStream stream(&wordfile);stream<<str<<endl;wordfile.close();
效果:
2.使用WPS
WPS开发文档:https://open.wps.cn/docs/client/wpsLoad
Qt使用 QAxObject 加载WPS COM组件,实现调用WPS,WPS开发文档中提供各种操作方法及属性,这里举几个简单示例,主要讲一下方法,看明白后可以根据需求,自行调用WPS接口。
//电脑是否存在WPS组件
bool CallWPS::wps_wordEnable()
{QAxObject * _word = new QAxObject();bool able = _word->setControl("kwps.Application");delete _word;return able;
}//打开文档
void CallWPS::openWord(bool visible, QString tmpfile)
{if(!wps_wordEnable()){qDebug()<<"wps word module is not exist";return;}m_pword->setControl("kwps.Application");/*设置可见性*/m_pword->setProperty("Visible",visible);/*运行时警告 0:忽略,-1:显示消息框和警告,-2:仅显示消息框*/m_pword->setProperty("DisplayAlerts",-1);/*获取所有文档*/QAxObject * decuments = m_pword->querySubObject("Documents");if(tmpfile.isEmpty()){/*打开空白文档*/decuments->dynamicCall("Add");}else {/*打开模板文档*/this->tmpfile = tmpfile;decuments->dynamicCall("Add (QString)",tmpfile);}document = m_pword->querySubObject("ActiveDocument");if(visible){/*窗口状态,0:正常(跟随上次打开状态),1:最大化,2:最小化*/m_pword->setProperty("WindowState",0);}return;
}//书签处插入数据
void CallWPS::insert_text_Bookmark(const QString mark, const QString data)
{if(mark.isEmpty() || data.isEmpty())return;QAxObject * bookmark = document->querySubObject("Bookmarks")->querySubObject("Item(QString)",mark);if(!bookmark){qDebug()<<"bookmark is not exist";return;}bookmark->dynamicCall("Select(void)");bookmark->querySubObject("Range")->setProperty("Text",data);return;
}//书签处插入表格
void CallWPS::insert_table_Bookmark(const QString mark, int row, int column)
{if(mark.isEmpty())return;QAxObject * bookmark = document->querySubObject("Bookmarks")->querySubObject("Item(QString)",mark);if(!bookmark){qDebug()<<"bookmark is not exist";return;}bookmark->dynamicCall("Select(void)");QAxObject * bookmark_tab = bookmark->querySubObject("Range");//创建表格QAxObject * tables = document->querySubObject("Tables");//表格对象QAxObject* datatable = tables->querySubObject("Add(QVariant, int, int)", bookmark_tab->asVariant(),row,column);//表格格式datatable->setProperty("Style", "wdStyleTableMediumGrid3");//表格边框QAxObject* Borders = datatable->querySubObject("Borders");Borders->setProperty("InsideLineStyle","wdLineStyleDouble");//内部双实线Borders->setProperty("OutsideLineStyle","wdLineStyleSingle");//外部单实线//设置表头for(int i=1;i<=column;i++){QAxObject *m_pRange = datatable->querySubObject("Cell(int,int)",1,i)->querySubObject("Range");m_pRange->querySubObject("ParagraphFormat")->setProperty("Alignment", "wdAlignParagraphCenter");//居中m_pRange->querySubObject("Cells")->setProperty("VerticalAlignment", "wdCellAlignVerticalCenter");//文字与单元格中心对齐m_pRange->setProperty("Text","表头");}return;
}//获取光标选中 QPoint(x:光标起始位,y:光标末尾)
QPoint CallWPS::getRange()
{QAxObject * range = m_pword->querySubObject("Selection")->querySubObject("Range");int start = range->dynamicCall("Start").toInt();int end = range->dynamicCall("End").toInt();QPoint point(start,end);return point;
}
解析:
1.m_pword->setControl("kwps.Application");使用COM组件名称初始化COM对象;
2.m_pword->setProperty("Visible",visible);顾名思义,设置属性,参数为属性名称和属性值,
在WPS开发文档中查找到:
同样的我们可以 m_pword->setProperty("Width",500); 来设置WPS窗口的宽度。
3.使用 int width = m_pword->dynamicCall("Width").toInt();来获取WPS窗口的宽度。
其中 dynamicCall 函数意思为 动态调用 ,返回QVariant类型数据,可以转换为想要的数据类型,
可以通过WPS开发文档查看方法或属性是否可读以及返回值类型。
4. document = m_pword->querySubObject("ActiveDocument"); 激活当前文档,其中querySubObject 函数意思为查询子对象,
可以通过此函数获取该类的子对象进行调用。
也可以使用这些函数进行组合调用,如:
QAxObject * range = m_pword->querySubObject("Selection")->querySubObject("Range");QAxObject * bookmark->querySubObject("Range")->setProperty("Text",data);
5.在有的地方需要的传参为 COM对象,需要用 asVariant() 函数转换:
QAxObject * b1 = bookmark->querySubObject("InlineShapes");b1->dynamicCall("AddPicture(const QString&, QVariant, QVariant ,QVariant)", path,false,false,b1->asVariant());
以上就是 QAxObject 对象常用的一些函数介绍,方法就是这些,你可以通过查阅开发文档知晓接口名称,功能,传参及返回值来调用。
那么WPS开发文档那么长,找不到自己需要的功能函数在哪怎么办?
答:WPS提供了录制宏的方法示例,操作如下:可以将你需要完成的操作录制生成对应的功能函数,在开发文档中查找,很便捷。
3.实际展示:
(这里只是简单的几个功能演示,方法思路已经提供,具体需要自己实现了)
附:在弹出窗口调用时,有可能正在执行时关闭了WPS窗口,在执行操作前判断一下窗口是否被关闭,激活的文档是否切换等;
//判断WPS应用程序是否被关闭QAxObject * ret = m_pword->querySubObject("Application");if(ret){qDebug()<<"wps application is not exist";}
Qt 使用WPS或HTML生成word文档相关推荐
- Qt使用html生成word文档
Qt使用html生成word文档 零.前言 一.效果图 二.核心代码 零.前言 项目中要用到把一些图片和一些报告保存为word文件,今天研究了一下,主要是使用html方法保存为word文档,这对htm ...
- 用 Python 自动生成 Word 文档并在指定位置插入图片
用Python生成Word文档 在指定位置插入图片 首先当然需要第三方库啦(▽) 天才第一步,第三方的库O(∩_∩)O哈哈~ 参照转发的是这位大佬的博客:https://blog.csdn.net/c ...
- freemarker生成word文档,通过libreoffice完美转为pdf文件排版不乱(包含调用浏览器打印pdf)
了解libreoffice的朋友都知道,freemarker是用xml生成的word文档,libreoffice打开这些文档会不兼容,会直接显示xml代码或排版差别很大,尤其是文档中包含一些复杂表格的 ...
- android 生成多个表单,Android根据word模板文档将表单数据生成word文档的方案整理...
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 尝试的方案包括以下几种: freemarker 只能在java项目上运行,无法在Android项目上运行: poi 解析doc文件可 ...
- Android 使用模板生成Word文档,支持手机直接查看word
最近在项目工作中,碰到一个很棘手的需求,说是要在手机端根据模板生成word文档,而且不借助第三方的软件可以查看word文档,一开始听这个需求差不多蒙了,这要怎么做,为什么不把生成word文档这个工作放 ...
- java下freemarker2.3.28+aspose实现生成word文档生成、word转pdf转换
一.java生成word文档 java生成word文档常用的两种方式: (1)apache下的poi类库处理office文档 (2)freemarker编辑word文件转换的xml文件 通过网上了解, ...
- (详细)如何使用Freemarker生成Word文档中的文本、图片、表格、附件?
前言-Freemarker简单介绍 近期项目工作中需要编写大量格式相同但数据不同的Word文档,需要实现自动生成文档的效果,但是通过网上冲浪和官方文档搜索,相对来说,没有分类整理的文档,因此自己抽空简 ...
- java生成word文档freemarker
java freemarker + word 模板 生成 word 文档 (变量替换,数据的循环,表格数据的循环,以及图片的替换) 1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下 ...
- Python-生成word、docs文件[生成word文档]
Python-生成word.docs文件[生成word文档] 方法一:写入新建文档 安装第三方库 实现代码 运行结果 注意 方法二:运用模板写入word文档 安装第三方库 创建模板或修改模板 实现代码 ...
最新文章
- 通俗篇:一文搞定矩阵相关概念及意义
- 英语单词 factor cull
- Linux系统调优概述
- 平板电脑哪个品牌的好_平板电脑性价比排行 这些品牌你值得拥有
- 排队接水pascal程序
- Runtime底层原理--动态方法解析、消息转发源码分析
- django图片上传到oss_django 配置阿里云OSS存储media文件的例子
- 滑动加载怎么做 php,vue之UI框架如何实现滑动加载数据
- 数据库面试 - 如何设计可以动态扩容缩容的分库分表方案?
- PAT乙级 1020 月饼
- 【半年总结】愿有岁月可回首
- xcode快捷键(二)
- B+树 mysql
- java 代码生成器 generator
- matlab iradon函数详解,如何处理iradon函数所得图像
- Java进阶总结——集合框架
- 游戏音效中竟然有3D音效,这是什么鬼?
- 30岁前,环游世界220天
- 最快路由器服务器地址,路由器中radius服务器IP地址要用什么样的IP
- 使用minikube快速部署k8s集群
热门文章
- intellij idea 更换代码颜色(教程)
- 与虎谋皮,饮鸩止渴,却有什么办法呢?
- React最佳实践系列 —— Dva快速入门
- 多个Ajax请求成功后再执行后续方法
- 关于sbb eax, eax以及sbb eax, 0FFFFFFFFh指令连用
- sub eax, _PAGESIZE; decrease by PAGESIZE test dword ptr [eax],eax ; probe page
- 大数据学长面试之boss直聘面试题
- flex水平排列左对齐
- 区块链技术将引爆金融深层价值|筱静观察2019第7期
- 3.3KW车载充电机开关电源设计方案资料数字控制单相PFC与全桥LLC 3.3KW 车载充电机OBC