根据Excel模板,指定单元格坐标填充数据

java 复制代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 根据Excel模板,指定单元格坐标填充数据
 * @author HK 2025年12月30日
 *
 */
public class ExcelFiller {

    /**
     * 根据模板文件生成新 Excel 文件,并填充指定单元格的值
     *
     * @param templatePath 模板文件路径
     * @param cellData      单元格坐标 -> 值的映射(如 "A1": "Hello", "B2": 123)
     * @param outputFilePath 输出文件路径
     * @return 是否成功
     */
    public static boolean fillExcel(String templatePath, Map<String, Object> cellData, String outputFilePath) {
        try (FileInputStream fis = new FileInputStream(templatePath);
             Workbook workbook = new XSSFWorkbook(fis)) {

            // 获取第一个 Sheet(可扩展为指定 sheet)
            Sheet sheet = workbook.getSheetAt(0);

            // 遍历需要填充的数据
            for (Map.Entry<String, Object> entry : cellData.entrySet()) {
                String cellAddress = entry.getKey();
                Object value = entry.getValue();

                // 解析单元格坐标,如 "A1" -> row 0, column 0
                int rowIdx = Integer.parseInt(cellAddress.replaceAll("[^0-9]", ""));
                int colIdx = cellAddress.charAt(0) - 'A';

                Row row = sheet.getRow(rowIdx);
                if (row == null) {
                    row = sheet.createRow(rowIdx);
                }

                Cell cell = row.getCell(colIdx);
                if (cell == null) {
                    cell = row.createCell(colIdx);
                }

                // 根据值类型设置单元格内容
                if (value instanceof String) {
                    cell.setCellValue((String) value);
                } else if (value instanceof Integer) {
                    cell.setCellValue((Integer) value);
                } else if (value instanceof Double) {
                    cell.setCellValue((Double) value);
                } else if (value instanceof Boolean) {
                    cell.setCellValue((Boolean) value);
                } else if (value instanceof Date) {
                    cell.setCellValue((Date) value);
                } else {
                    cell.setCellValue(value.toString());
                }
            }

            // 保存到新文件
            try (FileOutputStream fos = new FileOutputStream(outputFilePath)) {
                workbook.write(fos);
            }

            return true;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    // 示例:测试方法
    public static void main(String[] args) {
        String templatePath = "D:\\template.xlsx";
        String outputFilePath = "D:\\output-file.xlsx";

        // 数据集合:单元格坐标 -> 值
        Map<String, Object> cellData = new HashMap<String, Object>();
        cellData.put("A1", "Hello");
        cellData.put("B2", "123");

        boolean result = fillExcel(templatePath, cellData, outputFilePath);
        if (result) {
            System.out.println("Excel 填充成功,已保存到: " + outputFilePath);
        } else {
            System.out.println("Excel 填充失败!");
        }
    }
}

测试Demo,创建一个空Excel,执行上述代码

相关推荐
_日拱一卒40 分钟前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
隔窗听雨眠1 小时前
Nginx网关响应慢排查手记
java·服务器·nginx
智慧物业老杨1 小时前
智慧物业合同周期管理系统:从风险预警到智能交接的全流程数智化落地方案
java·人工智能·python
源码宝2 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
JAVA社区2 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展
金銀銅鐵2 小时前
[Java] 如何理解 class 文件中方法的 descriptor?
java·后端
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【63】AI Agent 长期记忆
java·人工智能·spring
憧憬成为java架构高手的小白3 小时前
苍穹外卖--day09
java·spring boot·百度
学代码的真由酱3 小时前
Java多用户一对一网页聊天室-测试报告
java·开发语言·功能测试·测试
Jasonakeke3 小时前
SpringBoot自动配置原理揭秘
java·spring boot·后端