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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 16:48:57