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效果
