基于Apache POI的Java Word收据表格:创建n行m列表格方法问询
使用Apache POI生成Word动态表格(n行m列)
在Apache POI中操作Word表格的核心类是XWPFTable,以下是创建任意行列数表格的具体实现,完全贴合你开发收据的场景:
核心实现逻辑
- 基于已初始化的
XWPFDocument实例,调用createTable(int rows, int cols)直接生成指定行列数的空白表格 - 遍历表格的行(
XWPFTableRow)和单元格(XWPFTableCell),填充对应数据 - 可选:通过底层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
相关产品推荐
相关产品推荐

