java POI合并两个Word后打开生成后的doxc提示 The file is corrupt and cannot be opened
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java POI合并两个Word后打开生成后的doxc提示 The file is corrupt and cannot be opened,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3229字,纯文字阅读大概需要5分钟。
内容图文
![java POI合并两个Word后打开生成后的doxc提示 The file is corrupt and cannot be opened](/upload/InfoBanner/zyjiaocheng/783/94b7a89903154f249b74de31d168c9f0.jpg)
目录
问题描述:
java后端使用 Apache 的 POI导出 Word,涉及到两个 Word 模板合并的时候,合并后的文件打开出现下图中的问题!
问题发现:
找了一圈最后在博客 java开发doxc下载提示 The file is corrupt and cannot be opened找到解决办法。
问题排查:
该博客中提到是
/** 获取指定标签中的内容
* @param xml
* @param label
* @return
*/
public static String regex(String xml, String label) {
String context = "";
// 正则表达式
String rgex = "<" + label + "[^>]*>((?:(?!<\\/" + label + ">)[\\s\\S])*)<\\/" + label + ">";
Pattern pattern = Pattern.compile(rgex);// 匹配的模式
Matcher m = pattern.matcher(xml);
// 匹配的有多个
List<String> list = new ArrayList<String>();
while (m.find()) {
int i = 1;
list.add(m.group(i));
i++;
}
if (list.size() > 0) {
// 输出内容自己定义
context = String.valueOf(list.size());
}
return context;
}
然后在 POI 合并的时候检查一下 POI 将 Word 转为 xml 后 w:sectPr
标签情况
/** 两个对象进行追加
* 2019-06-26 houzw添加
* @param src 目标文档
* @param append 子文档
* @return
* @throws Exception
*/
public static XWPFDocument mergeWord(XWPFDocument src, XWPFDocument append) throws Exception {
// XWPFParagraph paragraph = src.createParagraph();
// //设置分页符
// paragraph.setPageBreak(true);
CTBody src1Body = src.getDocument().getBody();
CTBody src2Body = append.getDocument().getBody();
List<XWPFPictureData> allPictures = append.getAllPictures();
// 记录图片合并前及合并后的ID
Map<String, String> map = new HashMap();
for (XWPFPictureData picture : allPictures) {
String before = append.getRelationId(picture);
// 将原文档中的图片加入到目标文档中
String after = src.addPictureData(picture.getData(), Document.PICTURE_TYPE_PNG);
map.put(before, after);
}
appendBody(src1Body, src2Body, map);
return src;
}
private static void appendBody(CTBody src, CTBody append, Map<String, String> map) throws Exception {
XmlOptions optionsOuter = new XmlOptions();
optionsOuter.setSaveOuter();
String appendString = append.xmlText(optionsOuter);
String srcString = src.xmlText();
String regex = regex(srcString, "w:sectPr");
System.out.println(regex);
String prefix = srcString.substring(0, srcString.indexOf(">") + 1);
String mainPart = srcString.substring(srcString.indexOf(">") + 1, srcString.lastIndexOf("<"));
String sufix = srcString.substring(srcString.lastIndexOf("<"));
String addPart = appendString.substring(appendString.indexOf(">") + 1, appendString.lastIndexOf("<"));
if (map != null && !map.isEmpty()) {
// 对xml字符串中图片ID进行替换
for (Map.Entry<String, String> set : map.entrySet()) {
addPart = addPart.replace(set.getKey(), set.getValue());
}
}
// 将两个文档的xml内容进行拼接
CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart + sufix);
src.set(makeBody);
}
合并三个 word 文档,结果输出 2 也就是说前两个文档合并后 w:sectPr
标签有两个。因为我输出的是目标模板合并前的 w:sectPr
标签情况。
解决具体方法
去掉追加word内容中的 w:sectPr
标签,确保合成的word中只有一个 w:sectPr
标签对
String rgex = "<[\\s]*?w:sectPr[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?w:sectPr[\\s]*?>";
appendString = appendString.replaceAll(rgex, "");
至此问题解决!问题总是具有片面性,真诚希望各位看官斧正,有新的观点留言我,大家一起交流学习。
谢谢各位,祝大家玩的开心。
内容总结
以上是互联网集市为您收集整理的java POI合并两个Word后打开生成后的doxc提示 The file is corrupt and cannot be opened全部内容,希望文章能够帮你解决java POI合并两个Word后打开生成后的doxc提示 The file is corrupt and cannot be opened所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。