【踩坑笔记】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()分行正常。