【踩坑笔记】java使用poi导出word文档换行
poi导出word,没有使用模板替换方式,而是设置创建paragraph和cell生成word。单元格内容填充的段落没有自动换行,原来换行是这么写的:
infoTableRow.getCell(1).setText(changeLine(entry.getValue()));
/**
* word表格内换行
* @param value
* @return
*/
private static String changeLine(String value) {
StringBuffer buffer = new StringBuffer();
if (value.indexOf("\n") > 0) {
String[] strings = value.split("\n");
for (int i = 0; i < strings.length; i++) {
if (i == 0) {
buffer.append(strings[i].trim());
} else {
buffer.append("\r\n");
buffer.append(strings[i].trim());
}
}
} else {
buffer.append(value);
}
return buffer.toString();
}
java换行符“\n”在word文档中不生效,使用“\r”,“\r\n”,“(char)11”,“^p”,“< br>”,“<w:br>”,“<w:p><w:p/>” 等替换均无法实现单元格内换行的功能(“\r\n”没有换行,但是有空格效果)。
实现单元格内自动换行:
String value = entry.getValue();
// 设置单元格内段落
XWPFParagraph contentParagraph = infoTableRow.getCell(1).getParagraphs().get(0);
XWPFRun run = contentParagraph.createRun();
setWrap(value, contentParagraph, run);
/**
* 设置换行
*
* @param value 需要换行的内容
* @param paragraph 当前段落
* @param run
*/
private static void setWrap(Object value, XWPFParagraph paragraph, XWPFRun run) {
if (((String) value).indexOf("\n") > 0) {
//设置换行
String[] text = value.toString().split("\n");
run = paragraph.insertNewRun(0);
for (int f = 0; f < text.length; f++) {
if (f == 0) {
run.setText(text[f].trim());
} else {
// run.addCarriageReturn();//硬回车
// 换行
run.addBreak();
run.setText(text[f].trim());
}
}
} else {
run.setText((String) value);
}
}
单元格cell相当于一个小的document。原始代码中使用setText()方法填充内容,为了实现分行效果修改为paragraph。addCarriageReturn依然没有实现单元格内分行的效果(单元格外可以),更改为addBreak()分行正常。