使用POI解决word中cell单元格内字符串换行问题

本文介绍了在使用POI处理无插件下载模板时遇到的Word单元格内字符串换行问题。尽管网上的建议如使用' '等字符无效,作者通过调整单元格宽度成功实现了换行。通过逐步调试,最终解决了这个问题。

一杯咖啡,一包烟,一个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“),就是我们可以先试着将单元格宽度调到适当部位,然后通过调试,慢慢就通了。

就到这吧,致深夜加班的自己!!!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值