Qt/C++基于Word Xml模板方式生成word文档

C++生成word文档的方式大概有四种1.XML模板标签替换2.COM组件(MFC使用较多)3.HTML方式4.第三方库生成(aspore)需要付费。如果是小开发者建议采用Qt自带的格式或者XML模板标签替换的方法。今天这篇文章主要讲述的是利用Word Xml的方式来进行输出Word报告格式。

一、XML格式

WordXML文档是一种基于XML的文件格式,用于存储和处理Microsoft Word文档的内容和结构。它结合了XML的可读性、易于解析和易于扩展的特性,以及Word的文档处理能力。WordXML文档可以包含文档的文本内容、格式设置、表格、图像等元素,并且可以通过XML标签来描述这些元素的结构和数据。1

WordXML文档的结构包括:

声明部分:包含XML版本号和字符集声明,用于指定文件的XML版本和所使用的字符集。

根元素:所有元素都必须包含在一个根元素中,它是XML文件的起点。

元素:元素包含开始标记、结束标记和中间的数据,用于描述文档中的不同部分。

属性:元素可以包含属性,用于描述元素的特性。

WordXML文档的应用场景包括:

数据交换:作为通用的数据交换格式,用于在不同平台和编程语言之间交换Word文档数据。

数据存储:用于存储和管理Word文档的内容和格式设置,如配置信息和用户数据。

数据传输:在Web应用和移动应用中,用于在互联网上传输Word文档数据。

配置文件:作为配置文件格式,用于配置Word应用程序和系统的参数和选项。

为了使用WordXML文档中的数据,需要对XML文件进行解析和处理。常见的XML解析和处理方式包括DOM解析,它将XML文件解析为一个树形结构,然后可以使用节点操作方法来访问和操作XML文件中的数据。

需要注意的是word2013之后word就不再支持含有自定义标记的word文档的打开的,你需要全部删除自定义标记才能够正常打开,但是wps是支持的,但是这并不影响我们利用xml模板来生成word文档

二、XML模板替换的优缺点

优点
  • 代码量相对较少、导出速度快

  • 跨平台,支持多个系统,系统不安装 office 也能导出;

  • 支持图片以及固定格式导出;

缺点
  • 导出格式固定,可扩展性不强,如果需求变化导出格式变了,那么模板也要跟着改变;

  • 一种格式对应一份模板,如果导出格式较多,需要准备的模板文件较多,这样比较繁琐;

  • 需要 Word 2003 以上版本;

三、使用方法

  • 图片

    如上图所示的文档中$Name和$Time就是事先我们预留的占位符。

另存为xml格式的文档.我们打开文档如下图

图片

图片

如上图所示里面包含图片的部分已经列出来了,图片会被以二进制的方法进行写入到xml中,稍后我们会列出此种方法。

图片

如上图看到我们预留的时间占位符。

采用qt读取文件并替换我们预留的占位符就可以了代码如下

QTextCodec* codec = QTextCodec::codecForName("UTF-8");//或者"GBK",不分大小写QTextCodec::setCodecForLocale(codec);QFile file(strPath);QFileInfo qinf(strPath);QString strdir = qinf.absoluteDir().path();QString strbase = qinf.baseName();QString strout = strdir + "\\" + strbase + "_2.doc";if (!file.open(QIODevice::ReadOnly)){    qDebug() << "open xxml file fail. " << file.errorString();    return ;}QByteArray baContent = file.readAll();file.close();QString strAllContent = QString::fromLocal8Bit(baContent);QString strImagePaht = "C:\\Users\\pengd\\Desktop\\image2.png";QString strBase = ImageToBase64(strImagePaht);strAllContent.replace("$Name", "张三");strAllContent.replace("$Time", "2024/04/18"); 
QFile newFile(strout);if (!newFile.open(QIODevice::WriteOnly)){    qDebug() << "file open fail." << newFile.errorString();;    return ;}
newFile.write(strAllContent.toLocal8Bit());newFile.close();

上述代码中,有一个将图片转换为Base64的字符串的函数就是将图片转换成二进制代码的方法

QString ImageToBase64(QString strImagePath){    QImage image(strImagePath);    QByteArray ba;    QBuffer buf(&ba);    image.save(&buf, "png");    qDebug() << ba.toBase64();    QString str = ba.toBase64();    return str;}

下面这幅图就是图片在xml字段的嵌入方式,这些我们没必要去改,它是通过rid的方法去上面那个图片字段里去查找图片的编号,然后通过编号查找图片的二进制字符串然后重新绘制在word文档里的

图片

好了,文章到此结束!!!!

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Qt提供了一个名为QDocxDocument的类,可以用于生成Word文档。下面是一个使用Qt生成Word文档的示例,其中包含了一个XML模板。 ```c++ #include <QCoreApplication> #include <QFile> #include <QTextStream> #include <QXmlStreamWriter> #include <QDebug> #include <QDocxDocument> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建Word文档 QDocxDocument doc; doc.addParagraph("Hello World!"); // 打开XML模板文件 QFile templateFile(":/template.xml"); if (!templateFile.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open template file!"; return -1; } // 读取XML模板内容 QTextStream templateStream(&templateFile); QString templateContent = templateStream.readAll(); // 替换XML模板中的占位符 templateContent.replace("[Title]", "My Document Title"); templateContent.replace("[Body]", doc.toHtml()); // 将替换后的XML模板写入到Word文档中 doc.setContent(templateContent.toUtf8()); // 保存Word文档 if (!doc.save("example.docx")) { qDebug() << "Failed to save document!"; return -1; } return a.exec(); } ``` 在上面的代码中,我们首先创建了一个QDocxDocument对象,并向其中添加了一段文本。然后,我们打开了一个XML模板文件,并读取了其中的内容。接下来,我们使用QString的replace函数替换了XML模板中的占位符。最后,我们将替换后的XML模板写入到Word文档中,并保存该文档。 下面是一个示例的XML模板,其中包含了两个占位符:[Title]和[Body]。 ```xml <?xml version="1.0" encoding="UTF-8"?> <w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> <w:body> <w:p> <w:r> <w:t>[Title]</w:t> </w:r> </w:p> <w:p> <w:r> <w:t>[Body]</w:t> </w:r> </w:p> </w:body> </w:document> ``` 在实际使用时,我们可以根据需要修改XML模板,添加更多的占位符或调整文档的格式。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值