针对WordUtils不能替换同行多占位符的情况

更换表格内容采取以下方法

WordUtils更换表格中同行多占位符,目前本人没有时间优化这部分内容,所以直接采取了替换方法的行为,请各位见谅


private static void parseTable(XWPFTable table, Map<String, Object> dataMap) {
        Map<String, String> source = (Map<String, String>) dataMap.get("source");
        log.info(source.keySet().toString()); //可能为null 所以转字符串
        Map<String, Object> imageMap = (Map<String, Object>) dataMap.get("${image}"); // 这块儿内容我采取过image,但效果不太好,直接使用了${image}
        log.info(imageMap.keySet().toString());
        int count = 0;
        log.info("所有key : " + dataMap.keySet().toString());
        for (XWPFTableRow row : table.getRows()) { // 行
            for (XWPFTableCell cell : row.getTableCells()) { // 单元格
                for (XWPFParagraph p : cell.getParagraphs()) {  // 段落
                    for (XWPFRun run : p.getRuns()) {
                        String text = run.getText(0);
                        log.info("等待替换文字: " + text);
                        for (String s : dataMap.keySet()) {
                            log.info("当前key:" + s);
                            if (s.equals("source") && !source.isEmpty()) { //替换文本内容
                                String value = "";
                                for (String key : source.keySet()) {
                                    if (text != null && text.contains(key)) {
                                        value = text.replace(key, source.get(key));
                                        log.info("替换后文字:" + text);
                                        run.setText(value, 0);
                                    }
                                }
                            }
                            if (text != null && text.contains("${image}") && !imageMap.isEmpty()) { //替换图片
                                if (count == 1) {
                                    break; // 因为会循环访问key,而我所需操作当中只需要一张图片,所以计数为1不进入替换
                                }
                                run.setText("", 0); //清空段落文字内容,方便填充图片
                                // 获取元素
                                int width = (int) imageMap.get("width");
                                int height = (int) imageMap.get("height");
                                int picType = getPictureType((String) imageMap.get("type"));
                                byte[] bs = (byte[]) imageMap.get("con");
                                String fileName = (String) imageMap.get("fileName");
                                try {
                                    // 写入图片
                                    run.addPicture(new ByteArrayInputStream(bs), picType, fileName, width, height);
                                    log.info("写入完成");
                                    count++;
                                } catch (Exception e) {
                                    e.printStackTrace();
                                    log.info("图片写入失败");
                                }
                            }
                        }
                    }
                }
            }
        }
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用POI操作Word可以实现动态添加行和表格中动态行,同时也支持插入图片。这里提供一个简单的示例代码: ``` import java.io.*; import org.apache.poi.xwpf.usermodel.*; public class WordUtils { private XWPFDocument document; public WordUtils() { document = new XWPFDocument(); } public void addParagraph(String text) { XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText(text); } public void addTable(int rows, int cols) { XWPFTable table = document.createTable(rows, cols); for (int i = 0; i < rows; i++) { XWPFTableRow row = table.getRow(i); for (int j = 0; j < cols; j++) { XWPFTableCell cell = row.getCell(j); cell.setText(String.format("row %d, col %d", i, j)); } } } public void addDynamicTable(int rows, int cols, String[][] data) { XWPFTable table = document.createTable(rows, cols); for (int i = 0; i < rows; i++) { XWPFTableRow row = table.getRow(i); for (int j = 0; j < cols; j++) { XWPFTableCell cell = row.getCell(j); if (data[i][j].startsWith("<img")) { try { String fileName = data[i][j].substring(data[i][j].indexOf("src=") + 5, data[i][j].indexOf(">") - 1); FileInputStream fis = new FileInputStream(fileName); cell.removeParagraph(0); XWPFParagraph paragraph = cell.addParagraph(); XWPFRun run = paragraph.createRun(); run.addPicture(fis, Document.PICTURE_TYPE_JPEG, fileName, Units.toEMU(100), Units.toEMU(100)); fis.close(); } catch (Exception e) { e.printStackTrace(); } } else { cell.setText(data[i][j]); } } } } public void save(String fileName) { try { FileOutputStream fos = new FileOutputStream(fileName); document.write(fos); fos.close(); document.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 这个类中提供了三个方法分别用于添加段落、表格和动态表格。其中动态表格需要传入一个二维数组来表示表格中的数据,如果数据是以`<img>`开头的字符串,则表示该单元格需要插入一张图片,图片的文件名应该在`src=`和`>`之间。最后调用`save`方法将文档保存到指定的文件中即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值