目录

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文档相关推荐

  1. Qt使用html生成word文档

    Qt使用html生成word文档 零.前言 一.效果图 二.核心代码 零.前言 项目中要用到把一些图片和一些报告保存为word文件,今天研究了一下,主要是使用html方法保存为word文档,这对htm ...

  2. 用 Python 自动生成 Word 文档并在指定位置插入图片

    用Python生成Word文档 在指定位置插入图片 首先当然需要第三方库啦(▽) 天才第一步,第三方的库O(∩_∩)O哈哈~ 参照转发的是这位大佬的博客:https://blog.csdn.net/c ...

  3. freemarker生成word文档,通过libreoffice完美转为pdf文件排版不乱(包含调用浏览器打印pdf)

    了解libreoffice的朋友都知道,freemarker是用xml生成的word文档,libreoffice打开这些文档会不兼容,会直接显示xml代码或排版差别很大,尤其是文档中包含一些复杂表格的 ...

  4. android 生成多个表单,Android根据word模板文档将表单数据生成word文档的方案整理...

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 尝试的方案包括以下几种: freemarker 只能在java项目上运行,无法在Android项目上运行: poi 解析doc文件可 ...

  5. Android 使用模板生成Word文档,支持手机直接查看word

    最近在项目工作中,碰到一个很棘手的需求,说是要在手机端根据模板生成word文档,而且不借助第三方的软件可以查看word文档,一开始听这个需求差不多蒙了,这要怎么做,为什么不把生成word文档这个工作放 ...

  6. java下freemarker2.3.28+aspose实现生成word文档生成、word转pdf转换

    一.java生成word文档 java生成word文档常用的两种方式: (1)apache下的poi类库处理office文档 (2)freemarker编辑word文件转换的xml文件 通过网上了解, ...

  7. (详细)如何使用Freemarker生成Word文档中的文本、图片、表格、附件?

    前言-Freemarker简单介绍 近期项目工作中需要编写大量格式相同但数据不同的Word文档,需要实现自动生成文档的效果,但是通过网上冲浪和官方文档搜索,相对来说,没有分类整理的文档,因此自己抽空简 ...

  8. java生成word文档freemarker

    java freemarker + word 模板 生成 word 文档 (变量替换,数据的循环,表格数据的循环,以及图片的替换) 1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下 ...

  9. Python-生成word、docs文件[生成word文档]

    Python-生成word.docs文件[生成word文档] 方法一:写入新建文档 安装第三方库 实现代码 运行结果 注意 方法二:运用模板写入word文档 安装第三方库 创建模板或修改模板 实现代码 ...

最新文章

  1. 通俗篇:一文搞定矩阵相关概念及意义
  2. 英语单词 factor cull
  3. Linux系统调优概述
  4. 平板电脑哪个品牌的好_平板电脑性价比排行 这些品牌你值得拥有
  5. 排队接水pascal程序
  6. Runtime底层原理--动态方法解析、消息转发源码分析
  7. django图片上传到oss_django 配置阿里云OSS存储media文件的例子
  8. 滑动加载怎么做 php,vue之UI框架如何实现滑动加载数据
  9. 数据库面试 - 如何设计可以动态扩容缩容的分库分表方案?
  10. PAT乙级 1020 月饼
  11. 【半年总结】愿有岁月可回首
  12. xcode快捷键(二)
  13. B+树 mysql
  14. java 代码生成器 generator
  15. matlab iradon函数详解,如何处理iradon函数所得图像
  16. Java进阶总结——集合框架
  17. 游戏音效中竟然有3D音效,这是什么鬼?
  18. 30岁前,环游世界220天
  19. 最快路由器服务器地址,路由器中radius服务器IP地址要用什么样的IP
  20. 使用minikube快速部署k8s集群

热门文章

  1. intellij idea 更换代码颜色(教程)
  2. 与虎谋皮,饮鸩止渴,却有什么办法呢?
  3. React最佳实践系列 —— Dva快速入门
  4. 多个Ajax请求成功后再执行后续方法
  5. 关于sbb eax, eax以及sbb eax, 0FFFFFFFFh指令连用
  6. sub eax, _PAGESIZE; decrease by PAGESIZE test dword ptr [eax],eax ; probe page
  7. 大数据学长面试之boss直聘面试题
  8. flex水平排列左对齐
  9. 区块链技术将引爆金融深层价值|筱静观察2019第7期
  10. 3.3KW车载充电机开关电源设计方案资料数字控制单相PFC与全桥LLC 3.3KW 车载充电机OBC