poi 替换word里的\n 变成 换行的两种情况

本文介绍了如何处理两种Word文档中换行的常见问题。第一种是普通段落文字的换行,通过使用XWPFRun的addBreak()方法实现。第二种情况是针对Word表格中单元格文字的换行,由于setText()方法无法正确显示换行,作者通过读源码并模拟程序流程,创建段落和run来解决换行问题。通过这种方式,成功解决了XWPFTableCell无法正确显示换行内容的困扰。
摘要由CSDN通过智能技术生成

1. 普通的段落文字换行

这种方式是网上拥有方案最多的一种情况,大多就是利用run.addBreak()方式来做中断 以下是代码示例

/**
     * 段落/n替换成换行符
     *
     * @param value
     * @param paragraph
     * @param run
     */
    public static void setWrap(Object value, XWPFParagraph paragraph, XWPFRun run) {
        if (((String) value).indexOf("\n") > 0) {
            //设置换行
            String[] text = value.toString().split("\n");
            paragraph.removeRun(0);
            run = paragraph.insertNewRun(0);
            for (int f = 0; f < text.length; f++) {
                if (f == 0) {
                    //此处不缩进因为word模板已经缩进了。
                    run.setText(text[f].trim());
                    run.setFontSize(12);
                } else {
                    run.addCarriageReturn();//硬回车
                    //注意:wps换行首行缩进是三个空格符,office要的话可以用 run.addTab();缩进或者四个空格符
                    run.setText(text[f].trim());
                    run.setFontSize(12);
                }
            }
        } else {
            run.setText((String) value);
        }
    }

但以上代码对于以下第二种情况会不起作用

2.word 中 的 table 表格的cell 文字换行

这种情况网上也有解决方案,但自己试过各种方案不生效

先说下不生效的地方  

XWPFTableCell.setText("1.aaaaaaaa\n 2.bbbbbbbbb");

设置完这个值之后发现 XWPFTableCell.getText() 怎么也没取出这个值

无奈之下,读源码吧,看看源码的做法。
 

 

流程大概:创建段落对象,创建run设置值  按着样来看,没啥问题啊,怪就怪在这个方法得到的runs ,iruns 的size 都是0 ,所以也不纠结了,直接模拟他的程序流程做就好了 代码如下:

public static void addBreakInCell(XWPFTableCell cell, String value) {
    if (!StringUtils.isEmpty(value) && value.contains("\n")) {
        String[] valueSplit = value.split("\n");
        for (int i = 0; i < valueSplit.length; i++) {
            //创建表格段落
            cell.getXWPFDocument().createParagraph();
            XWPFParagraph paragraph = cell.getParagraphs().get(0);
            XWPFRun run = paragraph.createRun();
            run.setText(valueSplit[i]);
            if (i < valueSplit.length - 1) {
                run.addBreak();//中断
            }
            paragraph.addRun(run);
        }
    }
}

这样测试完之后就解决了此类问题!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值