You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Apache POI的Java Word收据表格:创建n行m列表格方法问询

使用Apache POI生成Word动态表格(n行m列)

在Apache POI中操作Word表格的核心类是XWPFTable,以下是创建任意行列数表格的具体实现,完全贴合你开发收据的场景:

核心实现逻辑

  1. 基于已初始化的XWPFDocument实例,调用createTable(int rows, int cols)直接生成指定行列数的空白表格
  2. 遍历表格的行(XWPFTableRow)和单元格(XWPFTableCell),填充对应数据
  3. 可选:通过底层XML对象调整表格边框、列宽、文字对齐等样式,优化收据排版

完整代码示例

假设你已完成收据编号等表头开发,以下是添加子表头+动态数据表格的完整逻辑:

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

public class ReceiptGenerator {
    public static void main(String[] args) throws IOException {
        // 初始化Word文档(此处可插入你已完成的表头逻辑)
        XWPFDocument document = new XWPFDocument();
        
        // 示例:添加收据标题
        XWPFParagraph titlePara = document.createParagraph();
        XWPFRun titleRun = titlePara.createRun();
        titleRun.setText("收款收据");
        titleRun.setFontSize(16);
        titleRun.setBold(true);
        titlePara.setAlignment(ParagraphAlignment.CENTER);

        // 示例:添加收据编号
        XWPFParagraph receiptNoPara = document.createParagraph();
        XWPFRun receiptNoRun = receiptNoPara.createRun();
        receiptNoRun.setText("收据编号:REC20240520001");
        receiptNoPara.setAlignment(ParagraphAlignment.RIGHT);

        // ------------------- 核心:创建子表头+动态数据表格 -------------------
        // 定义子表头列名
        String[] subHeaders = {"姓名", "联系地址", "联系电话", "收款金额"};
        // 模拟动态业务数据(n行数据)
        List<String[]> dataRows = new ArrayList<>();
        dataRows.add(new String[]{"张三", "北京市朝阳区XX路", "138XXXX1234", "500.00"});
        dataRows.add(new String[]{"李四", "上海市浦东新区XX街", "139XXXX5678", "800.00"});
        dataRows.add(new String[]{"王五", "广州市天河区XX巷", "137XXXX9012", "1200.00"});

        // 创建表格:子表头1行 + 数据n行 = 总行数;列数为子表头长度(m列)
        int totalRows = 1 + dataRows.size();
        int totalCols = subHeaders.length;
        XWPFTable table = document.createTable(totalRows, totalCols);

        // 设置表格全局样式(可选)
        table.setWidth("100%");
        // 统一设置单元格边框与列宽
        for (XWPFTableRow row : table.getRows()) {
            for (XWPFTableCell cell : row.getTableCells()) {
                CTTcPr cellPr = cell.getCTTc().addNewTcPr();
                // 均分列宽
                CTTblWidth cellWidth = cellPr.addNewTcW();
                cellWidth.setW(BigInteger.valueOf(5000 / totalCols));
                // 添加单元格边框
                CTTcBorders borders = cellPr.addNewTcBorders();
                borders.addNewTop().setVal(STBorder.SINGLE);
                borders.addNewBottom().setVal(STBorder.SINGLE);
                borders.addNewLeft().setVal(STBorder.SINGLE);
                borders.addNewRight().setVal(STBorder.SINGLE);
            }
        }

        // 填充子表头
        XWPFTableRow headerRow = table.getRow(0);
        for (int i = 0; i < subHeaders.length; i++) {
            XWPFTableCell cell = headerRow.getCell(i);
            cell.setText(subHeaders[i]);
            // 表头文字加粗居中
            XWPFParagraph para = cell.getParagraphs().get(0);
            para.setAlignment(ParagraphAlignment.CENTER);
            XWPFRun run = para.getRuns().get(0);
            run.setBold(true);
        }

        // 填充动态数据行
        for (int i = 0; i < dataRows.size(); i++) {
            XWPFTableRow dataRow = table.getRow(i + 1);
            String[] rowData = dataRows.get(i);
            for (int j = 0; j < rowData.length; j++) {
                XWPFTableCell cell = dataRow.getCell(j);
                cell.setText(rowData[j]);
                // 数据单元格居中对齐
                XWPFParagraph para = cell.getParagraphs().get(0);
                para.setAlignment(ParagraphAlignment.CENTER);
            }
        }

        // 生成Word文件
        try (FileOutputStream out = new FileOutputStream("receipt.docx")) {
            document.write(out);
        }
        document.close();
    }
}

关键API说明

  • XWPFDocument.createTable(int rows, int cols):直接生成指定行列数的空白表格
  • XWPFTableRow.getCell(int index):获取当前行指定位置的单元格
  • XWPFTableCell.setText(String text):设置单元格显示文本
  • 通过CTTcPr、CTTblWidth等底层XML对象,可精细化调整表格样式(边框、列宽、缩进等)

内容的提问来源于stack exchange,提问作者Smokem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:12:37