CCHYPOCRISY 2023-03-28 22:25 采纳率: 60%
浏览 33
已结题

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

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

实现代码

img

word模板

img

正常生成

img

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

  • 写回答

3条回答 默认 最新

  • CCHYPOCRISY 2023-03-30 21:55
    关注

    已解决

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 程序猿-汤姆猫 2023-03-29 09:34
    关注

    以下是使用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 "";
            }
        }
    }
    

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

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-30 05:12
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 帮你找了个相似的问题, 你可以看下: 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);
      			}
      		}
      	}
      }

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       


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

报告相同问题?

问题事件

  • 系统已结题 4月7日
  • 已采纳回答 3月30日
  • 修改了问题 3月28日
  • 修改了问题 3月28日
  • 展开全部

悬赏问题

  • ¥15 求苹果推信imessage批量推信技术
  • ¥15 ubuntu 22.04 系统盘空间不足。隐藏的docker空间占用?(相关搜索:移动硬盘|管理系统)
  • ¥15 利用加权最小二乘法求亚马逊各类商品的价格指标?怎么求?
  • ¥15 c++ word自动化,为什么可用接口是空的?
  • ¥15 Matlab计算100000*100000的矩阵运算问题:
  • ¥50 VB6.0如何识别粘连的不规则的数字图片验证码
  • ¥16 需要完整的这份订单所有的代码,可以加钱
  • ¥15 Stata数据分析请教
  • ¥15 请教如何为VS2022搭建 Debug|win32的openCV环境?
  • ¥15 关于#c++#的问题:c++如何使用websocketpp实现websocket接口调用,求示例代码和相关资料