一杯咖啡,一包烟,一个bug改一天!!!啊~~~~~多么痛的领悟
这几天接触使用POI解决无插件下载模板的需求,一个刚入职场不久的萌新,在接到这个需求时,表示是一脸懵逼?,虽说是导出碰壁,但还是有所收获!!!
先贴代码:
public static void replaceText(InputStream inputStream, OutputStream outputStream, Map<String, String> map) {
try {
XWPFDocument document;//= new XWPFDocument(POIXMLDocument.openPackage(srcPath));
document = new XWPFDocument(inputStream);
//1. 替换段落中的指定文字
Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
String text;
Set<String> set;
XWPFParagraph paragraph;
List<XWPFRun> run;
String key;
while (itPara.hasNext()) {
paragraph = itPara.next();
set = map.keySet();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
key = iterator.next();
run = paragraph.getRuns();
for (int i = 0, runSie = run.size(); i < runSie; i++) {
text = run.get(i).getText(run.get(i).getTextPosition());
if (text != null && text.equals(key)) {
run.get(i).setText(map.get(key), 0);
}
}
}
}
//2. 替换表格中的指定文字
List<XWPFTable> xwpfTables = document.getTables();
replaceTableText(xwpfTables, map);
//3.替换页眉
List<XWPFHeader> pageHeaders = document.getHeaderList();
replaceHeaderText(pageHeaders, map);
//3.输出流
document.write(outputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void replaceTableText(List<XWPFTable> xwpfTables, Map<String, String> map) {
for (XWPFTable xwpfTable : xwpfTables) {
List<XWPFTableRow> xwpfTableRows = xwpfTable.getRows();
for (XWPFTableRow xwpfTableRow : xwpfTableRows) {
List<XWPFTableCell> xwpfTableCells = xwpfTableRow.getTableCells();
for (XWPFTableCell cell : xwpfTableCells) {
for (Map.Entry<String, String> e : map.entrySet()) {
String textVal = cell.getText();
if (textVal.equals(e.getKey())) {
cell.removeParagraph(0);
if ("${year4}".equals(textVal)) {
cell.getText();
}
//修改部分cell样式
if ("${stockname}".equals(textVal) || "${industry}".equals(textVal) || "${scode}".equals(textVal) || "${reporttypename}".equals(textVal)) {
XWPFParagraph pIO = cell.addParagraph();
XWPFRun rIO = pIO.createRun();
rIO.setFontSize(20);
rIO.setBold(true);
rIO.setText(e.getValue());
//设置字体居中
setAlignCenter(cell);
} else {
cell.setText(e.getValue());
}
}
List<XWPFTable> innerxwpfTables = cell.getTables();
if (innerxwpfTables.size() > 0) {
replaceTableText(innerxwpfTables, map);
}
}
}
}
}
}
public static void setAlignCenter(XWPFTableCell cell) {
CTTc cttc = cell.getCTTc();
CTP ctp = cttc.getPList().get(0);
CTPPr ctppr = ctp.getPPr();
if (ctppr == null) {
ctppr = ctp.addNewPPr();
}
CTJc ctjc = ctppr.getJc();
if (ctjc == null) {
ctjc = ctppr.addNewJc();
}
//水平居中
ctjc.setVal(STJc.CENTER);
}
重点来了,关于cell单元格内换行的问题,网上都说可以采用”\n“、"\r"、”\n\r“、"char(11)",然而楼主试了好多次,都无果,最后通过调整单元格的宽度实现了,(替换word文档时,官方API也说是使用”\n“),就是我们可以先试着将单元格宽度调到适当部位,然后通过调试,慢慢就通了。
就到这吧,致深夜加班的自己!!!
本文介绍了在使用POI处理无插件下载模板时遇到的Word单元格内字符串换行问题。尽管网上的建议如使用'
'等字符无效,作者通过调整单元格宽度成功实现了换行。通过逐步调试,最终解决了这个问题。
2390

被折叠的 条评论
为什么被折叠?



