/*** 利用模板生成word文档
*@paramfiledValueMap 对应的字段 key - value 形式, 如果value是 inputstream 我们认为是图片, 并且是png的, 否则都会转成string
*@paraminputStream 模板输入流
*@paramoutputStream 输出流
*@throwsIOException
*@throwsInvalidFormatException*/
public static void POIUtilsTemplate2Word(MapfiledValueMap, InputStream inputStream, OutputStream outputStream)throwsIOException, InvalidFormatException {final XWPFDocument document = newXWPFDocument(inputStream).getXWPFDocument();
List paragraphList =document.getParagraphs();
List filedList =Lists.newArrayList();
List valueList =Lists.newArrayList();
List filedInputStream =Lists.newArrayList();
List valueInputStream =Lists.newArrayList();
filedValueMap.forEach((filed, value)->{final String filedKey = String.format("${%s}", filed);if (value instanceofInputStream) {
filedInputStream.add(filedKey);
valueInputStream.add(value);
}else{
filedList.add(filedKey);
valueList.add(String.valueOf(value));
}
});final String[] filedArray = filedList.toArray(newString[filedList.size()]);final String[] valueArray = valueList.toArray(newString[valueList.size()]);for(XWPFParagraph paragraph : paragraphList) {final List runs =paragraph.getRuns();final String text =paragraph.getText();
String runText=StringUtils.replaceEach(text, filedArray, valueArray);if (CollectionUtils.size(runs) > 0) {//为了 解决 POI 中 runs 分段错误问题, 他大爷的
for (int i = 0; i < runs.size(); i ++) {//是否包含图片
final int index = StringUtils.indexOfAny(text, filedInputStream.toArray(newString[filedInputStream.size()]));if (index > -1 && i == 0) {final XWPFRun run =runs.get(i);/*** 修改sonar问题,这个for循环只循环一次,所以直接取第一个 2020/06/05*/run.addPicture((InputStream) valueInputStream.get(0), HSSFPicture.PICTURE_TYPE_PNG, "file",
Units.toEMU(100), Units.toEMU(50));//for (int filedIndex = 0; filedIndex < filedInputStream.size(); filedIndex++)//{//run.addPicture((InputStream) valueInputStream.get(filedIndex),//HSSFPicture.PICTURE_TYPE_PNG,//"file", Units.toEMU(100), Units.toEMU(50));//break;//}
} else{
runs.get(i).setText(i== 0 ? runText : "", 0);
}
}
}
}
document.write(outputStream);
}