QT使用xml模版生成word文档

1.手动新建一个Word模版文件:

使用$包裹关键字,作为替换索引键值;

2.将word文件另存为XML文件

图片中pkg:binaryData</pkg:binaryData>中的是图片文件对应的base64的内容;

3.把pkg:binaryData</pkg:binaryData>中的内容改为111111111111111111111111111111111,并且使用 strContent.replace("111111111111111111111111111111111", base64);替换即可;

4.具体替换代码如下:

cpp 复制代码
    // 1. 设置编码,防止中文乱码
    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

    // 模板文件路径
    QString templatePath = "D:/XX/templates/log_template.xml";
    QFile templateFile(templatePath);

    // 2. 打开并读取整个模板文件
    if (!templateFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
        showMsg("打开模板文件失败:"+ templatePath);
        qDebug() << "打开模板文件失败:" << templateFile.errorString();
        return;
    }
    QByteArray xmlContent = templateFile.readAll();
    templateFile.close();

    // 转换为QString方便操作
    QString strContent = QString::fromUtf8(xmlContent);

    // 3. 进行变量替换
    strContent.replace("$Time$", "20261012");
    strContent.replace("$Name$", "张三");
    strContent.replace("$Order$", "20261012001");
    strContent.replace("$Total$", "100");
    strContent.replace("$FailNum$", "2");
    strContent.replace("$FailRate$", "98%");

    QString failStr;
    failStr += "2026101200010002";
    failStr += ":";
    failStr += "经过设备列表:";
    failStr += "0001锯切、";
    failStr += "0002打钉、";
    failStr += "0005铣孔;";
    failStr += "失败原因:孔加工位置异常;";
    failStr += "</w:t><w:br/><w:t>"; // XML中添加换行

    failStr += "2026101200010004";
    failStr += ":";
    failStr += "经过设备列表:";
    failStr += "0003锯切、";
    failStr += "0004打钉、";
    failStr += "0005铣孔;";
    failStr += "失败原因:端铣异常;";

    strContent.replace("$FailStr$", failStr);

    // 4. 替换图片
    QImage img;
    QString path = "D:\\XX\\profileImage\\60K.jpg";
    img.load(path);
    QByteArray ba;
    QBuffer buffer(&ba);
    QFileInfo info(path);
    img.save(&buffer, info.suffix().toLatin1()); // 按后缀格式编码
    QString base64 = ba.toBase64();               // 替换到模板里
    strContent.replace("$image$", "</w:t><w:br/><w:t>");
    strContent.replace("$11111111111$", base64);

    // 5. 输出生成的文件
    QString outputPath = "D:/XX/reports/员工_张三.doc";
    QFile outputFile(outputPath);
    if (!outputFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
        showMsg("创建输出文件失败:" + outputPath);
        qDebug() << "创建输出文件失败:" << outputFile.errorString();
        return;
    }
    outputFile.write(strContent.toUtf8());
    outputFile.close();

    showMsg("报告生成成功:"+ outputPath);

6.生成表格

6.1word里增加表格

6.2转成xml文件

找到xml中tr对应的部分包括<w:tr>

6.3将要替换的tr内容替换为tableContableContableCon,等待程序中替换表格内容

6.4要替换的tr内容定义成一个替换模版,是一行格式的模版

6.5 如下每行使用模版生成一行内容,拼接完替换到tableContableContableCon中即可

cpp 复制代码
 QString rowTemplateXml = "<w:tr><w:tblPrEx><w:tblBorders><w:top w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/><w:left w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/><w:bottom w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/><w:right w:val=\"single\" ";
 rowTemplateXml += "w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/><w:insideH w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/><w:insideV w:val=\"single\" w:color=\"auto\" w:sz=\"4\" w:space=\"0\"/></w:tblBorders><w:tblCellMar><w:left w:w=\"108\" w:type=\"dxa\"/><w:right w:w=\"108\" w:type=\"dxa\"/>";
 rowTemplateXml += "</w:tblCellMar></w:tblPrEx><w:tc><w:tcPr><w:tcW w:w=\"2130\" w:type=\"dxa\"/></w:tcPr><w:p w14:paraId=\"6E55C731\"><w:pPr><w:rPr><w:rFonts w:hint=\"default\"/><w:vertAlign w:val=\"baseline\"/><w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/></w:rPr>";
 rowTemplateXml += "</w:pPr><w:r><w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:vertAlign w:val=\"baseline\"/><w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/></w:rPr><w:t>$bCode$</w:t></w:r></w:p>";
 rowTemplateXml += "</w:tc><w:tc><w:tcPr><w:tcW w:w=\"2130\" w:type=\"dxa\"/></w:tcPr><w:p w14:paraId=\"46E9DDAF\"><w:pPr><w:rPr><w:rFonts w:hint=\"default\"/>";
 rowTemplateXml += "<w:vertAlign w:val=\"baseline\"/><w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint=\"eastAsia\"/>";
 rowTemplateXml += "<w:vertAlign w:val=\"baseline\"/><w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/></w:rPr>";
 rowTemplateXml += "<w:t>$bCode2$</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w=\"2131\" w:type=\"dxa\"/></w:tcPr><w:p w14:paraId=\"173F5443\">";
 rowTemplateXml += "<w:pPr><w:rPr><w:rFonts w:hint=\"default\"/><w:vertAlign w:val=\"baseline\"/><w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/></w:rPr></w:pPr>";
 rowTemplateXml += "<w:r><w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:vertAlign w:val=\"baseline\"/><w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/></w:rPr>";
 rowTemplateXml += "<w:t>$bCode3$</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w=\"2131\" w:type=\"dxa\"/></w:tcPr><w:p w14:paraId=\"3809D323\">";
 rowTemplateXml += "<w:pPr><w:rPr><w:rFonts w:hint=\"default\"/><w:vertAlign w:val=\"baseline\"/><w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/></w:rPr>";
 rowTemplateXml += "</w:pPr><w:r><w:rPr><w:rFonts w:hint=\"eastAsia\"/><w:vertAlign w:val=\"baseline\"/><w:lang w:val=\"en-US\" w:eastAsia=\"zh-CN\"/></w:rPr><w:t>$bCode4$</w:t></w:r></w:p></w:tc></w:tr>";
 QString tableCon;
 QString newRow = rowTemplateXml;
 newRow.replace("$bCode$", "11");
 newRow.replace("$bCode2$", "2");
 newRow.replace("$bCode3$", "3");
 newRow.replace("$bCode4$", "4");
 tableCon += newRow;

 QString newRow2 = rowTemplateXml;
 newRow2.replace("$bCode$", "22");
 newRow2.replace("$bCode2$", "22");
 newRow2.replace("$bCode3$", "23");
 newRow2.replace("$bCode4$", "24");
 tableCon += newRow2;
 strContent.replace("$tableCon$", tableCon);

6.6效果

相关推荐
mengzhi啊1 小时前
qt把结构体数据存入json文件
qt·json
Am-Chestnuts2 小时前
DeepSeek写教案怎么导出Word?完整步骤
ai·word
kaixin_learn_qt_ing2 小时前
写入二进制文件(Qt)
qt
尘中远4 小时前
QWT7 的科学 Colormap 色彩评估:QwtColorMapPreset 22 种预设的感知均匀性与场景化选
qt·qwt·科学绘图·科学配色
宿州派大星9 小时前
Python实战:PyQt5 + OpenCV + Dlib 打造AI桌面应用
人工智能·python·qt
长沙红胖子Qt19 小时前
Qt+TiePieHS3开发笔记(二):HS3发送器发出内置波形、直连示波器,示波器检测内置波形Demo
qt·示波器·tiepiehs3·发生器·同步发射和示波器采集
陈年老古董1 天前
PyQt5 入门指南:环境搭建、PyCharm 外部工具配置与登录界面实战
开发语言·qt·pycharm
zhanghaha13141 天前
Qt 类完整例程【逐词拆解 + 逐步骤执行保姆教程】
开发语言·qt
jun_bai1 天前
使用Aspose实现word文档合并,内容替换
windows·c#·word