如何使用POI动态生成word表格

使用POI 处理word表格 ,如只给一个对象TextVo 进行render渲染 ,并且使用 {{属性}} 占位 是可以正常输出一个 word 表格的

实现代码

img

word模板

img

正常生成

img

但是需要使用 TextVo 类型集合list数据 在同一个word文件中生成多个表格,请问如何实现呢

已解决

img

以下是使用POI处理Word表格的示例代码。它将一个TextVo对象用于render渲染,并使用{{属性}}占位符来生成Word表格。请注意,此示例仅用于演示目的。您需要根据实际需求进行修改和定制。

import org.apache.poi.xwpf.usermodel.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;

public class WordTableRenderer {

    private static final Pattern PATTERN = Pattern.compile("\\\\\\\\{\\\\\\\\{([^}]+)\\\\\\\\}\\\\\\\\}");

    public static void render(TextVo vo, String templatePath, String outputPath) throws Exception {
        // 打开Word文件
        XWPFDocument doc = new XWPFDocument(new FileInputStream(templatePath));
        // 获取所有表格
        List<XWPFTable> tables = doc.getTables();

        for (XWPFTable table : tables) {
            // 获取表格的所有行
            List<XWPFTableRow> rows = table.getRows();

            for (XWPFTableRow row : rows) {
                // 获取行的所有单元格
                List<XWPFTableCell> cells = row.getTableCells();

                for (XWPFTableCell cell : cells) {
                    // 获取单元格的内容
                    String content = cell.getText();
                    // 匹配占位符
                    Matcher matcher = PATTERN.matcher(content);

                    while (matcher.find()) {
                        // 获取属性值
                        String replacement = getProperty(vo, matcher.group(1));
                        // 替换占位符
                        content = content.replace(matcher.group(), replacement);
                    }

                    // 清空原有内容并添加新内容
                    cell.removeParagraph(0);
                    XWPFParagraph paragraph = cell.addParagraph();
                    XWPFRun run = paragraph.createRun();
                    run.setText(content);
                }
            }
        }

        // 保存Word文件
        FileOutputStream out = new FileOutputStream(outputPath);
        doc.write(out);
        out.close();
        doc.close();
    }

    private static String getProperty(TextVo vo, String key) {
        // 根据属性名获取属性值
        switch (key) {
            case "firstName": return vo.getFirstName();
            case "lastName": return vo.getLastName();
            case "age": return String.valueOf(vo.getAge());
            default: return "";
        }
    }
}

请注意,此示例仅用于演示目的。您需要根据实际需求进行修改和定制。希望这可以帮助您解决问题!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/740697
  • 这篇博客也不错, 你可以看下2个方式快速解决:Word背景图片怎么设置
  • 除此之外, 这篇博客: POI Word 图表、柱状图、条形图、折线图、饼图中的 4、poi Word生成图表-饼图 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    package test;
    
    import java.io.FileOutputStream;
    
    import org.apache.poi.util.Units;
    import org.apache.poi.xddf.usermodel.chart.ChartTypes;
    import org.apache.poi.xddf.usermodel.chart.LegendPosition;
    import org.apache.poi.xddf.usermodel.chart.XDDFCategoryDataSource;
    import org.apache.poi.xddf.usermodel.chart.XDDFChartData;
    import org.apache.poi.xddf.usermodel.chart.XDDFChartLegend;
    import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory;
    import org.apache.poi.xddf.usermodel.chart.XDDFNumericalDataSource;
    import org.apache.poi.xwpf.usermodel.XWPFChart;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    
    /**
     * poi Word生成图表-饼图
     */
    public class CreateWordXDDFChart2 {
    
    	public static void main(String[] args) throws Exception {
    		try (XWPFDocument document = new XWPFDocument()) {
    
    			// create the chart
    			XWPFChart chart = document.createChart(15 * Units.EMU_PER_CENTIMETER, 10 * Units.EMU_PER_CENTIMETER);
    
    			// 标题
    			chart.setTitleText("地区排名前七的国家");
    			// 标题是否覆盖图表
    			chart.setTitleOverlay(false);
    
    			// 图例位置
    			XDDFChartLegend legend = chart.getOrAddLegend();
    			legend.setPosition(LegendPosition.TOP_RIGHT);
    
    			// CellRangeAddress(起始行号,终止行号, 起始列号,终止列号)
    			// 分类轴标数据,
    			// XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 6));
    			XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(new String[] { "俄罗斯", "加拿大", "美国", "中国", "巴西", "澳大利亚", "印度" });
    			// 数据1,
    			// XDDFNumericalDataSource<Double> values = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6));
    			XDDFNumericalDataSource<Integer> values = XDDFDataSourcesFactory.fromArray(new Integer[] { 17098242, 9984670, 9826675, 9596961, 8514877, 7741220, 3287263 });
    			// XDDFChartData data = chart.createData(ChartTypes.PIE3D, null, null);
    			XDDFChartData data = chart.createData(ChartTypes.PIE, null, null);
    			// 设置为可变颜色
    			data.setVaryColors(true);
    			// 图表加载数据
    			data.addSeries(countries, values);
    
    			// 绘制
    			chart.plot(data);
    
    			// 打印图表的xml
    			// System.out.println(chart.getCTChart());
    
    			// Write the output to a file
    			try (FileOutputStream fileOut = new FileOutputStream("CreateWordXDDFChart.docx")) {
    				document.write(fileOut);
    			}
    		}
    	}
    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^