如何用Java等非VBA语言程序化操作Excel完成模板数据交互?
Java实现Excel模板填充与表格导出方案
这类需求在日常开发中很常见,下面基于Apache POI(功能全面,适配复杂模板)和Alibaba EasyExcel(高效处理大数据量)给出具体实现方案:
一、核心依赖(Maven)
Apache POI + OpenCSV(处理CSV)
<dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version> </dependency> <dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.6</version> </dependency> </dependencies>
Alibaba EasyExcel
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> </dependency>
二、Apache POI实现步骤
1. 打开模板工作簿
FileInputStream templateStream = new FileInputStream("template.xlsx"); XSSFWorkbook workbook = new XSSFWorkbook(templateStream);
2. 读取CSV并填充工作表
读取CSV数据
List<String[]> csvData = new ArrayList<>(); try (CSVReader reader = new CSVReader(new FileReader("data.csv"))) { String[] row; while ((row = reader.readNext()) != null) { csvData.add(row); } }
处理工作表(替换/新建)
- 替换现有工作表数据:清空原有行后写入新数据
XSSFSheet targetSheet = workbook.getSheet("目标工作表"); // 清空原有数据(保留表头可调整循环起始值) for (int i = targetSheet.getLastRowNum(); i >= 0; i--) { targetSheet.removeRow(targetSheet.getRow(i)); } // 写入CSV数据 for (int rowIdx = 0; rowIdx < csvData.size(); rowIdx++) { XSSFRow row = targetSheet.createRow(rowIdx); String[] rowData = csvData.get(rowIdx); for (int colIdx = 0; colIdx < rowData.length; colIdx++) { row.createCell(colIdx).setCellValue(rowData[colIdx]); } }
- 删除后新建工作表
// 删除原有工作表 int sheetIndex = workbook.getSheetIndex("旧工作表"); if (sheetIndex != -1) { workbook.removeSheetAt(sheetIndex); } // 新建工作表并写入数据 XSSFSheet newSheet = workbook.createSheet("新工作表"); // 写入逻辑同上面的循环
3. 将数据转为Excel表格(Tables)
Excel表格支持筛选、格式化等功能,POI直接支持创建:
// 定义表格数据区域(从第一行第一列到最后一行最后一列) CellReference start = new CellReference(newSheet.getRow(0).getCell(0)); CellReference end = new CellReference(newSheet.getRow(csvData.size()-1).getCell(csvData.get(0).length-1)); AreaReference tableArea = new AreaReference(start, end, SpreadsheetVersion.EXCEL2007); // 创建表格并配置 XSSFTable excelTable = newSheet.createTable(); excelTable.setName("DataTable_" + newSheet.getSheetName()); excelTable.setDisplayName("数据表格"); excelTable.setArea(tableArea);
4. 保存导出
try (FileOutputStream outputStream = new FileOutputStream("final_output.xlsx")) { workbook.write(outputStream); } // 关闭资源 workbook.close(); templateStream.close();
三、EasyExcel简化实现(适合大数据量)
EasyExcel封装了模板填充和批量写入逻辑,代码更简洁:
// 1. 读取CSV数据(可自定义读取逻辑转换为Map/实体类) List<Map<String, Object>> dataList = new ArrayList<>(); // 省略CSV读取转换为Map的步骤... // 2. 填充模板并导出(支持直接生成表格,需在模板中定义表格占位) EasyExcel.write("output_easy.xlsx") .withTemplate("template.xlsx") .sheet("目标工作表") // 填充数据 .doFill(dataList);
其他语言方案参考
如果用Python,openpyxl库可以实现类似逻辑:读取模板、操作工作表、创建Excel表格,代码量同样不大,适合快速脚本开发。
内容的提问来源于stack exchange,提问作者Jacek Antek
相关产品推荐
相关产品推荐

