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

如何用Java向同一Excel文件的多个Sheet写入数据并解决覆盖问题

问题根因
  • 每次调用call方法时,开头执行的FileOutputStream fileOut = new FileOutputStream(filename); fileOut.close();会直接清空已有的Excel文件,第一次写入的内容直接被删除
  • 每次都会创建全新的XSSFWorkbook实例,不会读取原有文件里的sheet数据,新实例中仅包含本次新增的单个sheet
  • 最终写入时会用仅含本次sheet的新workbook完全覆盖原文件,所以运行结束后只会保留最后一次调用生成的sheet2
修复代码

调整逻辑为:调用方法时先判断目标文件是否存在,存在则读取已有内容生成workbook实例,不存在再新建实例,在已有workbook的基础上追加新sheet后再写入保存,修改后代码如下:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

public class ExcelWriteTest {
    public static void call(Map<String, String[]> dataListLMS_IPS, String sheet)
    {
        try {
            String filePath = "C:\\Users\\PATIV25\\Downloads\\APEX UPEX.xlsx";
            File excelFile = new File(filePath);
            XSSFWorkbook workbook;
            // 读取已有文件或新建文件
            if (excelFile.exists()) {
                FileInputStream fis = new FileInputStream(excelFile);
                workbook = new XSSFWorkbook(fis);
                fis.close();
            } else {
                workbook = new XSSFWorkbook();
            }
            // 新增sheet,这里加判断避免重名报错
            if(workbook.getSheet(sheet) != null) {
                throw new Exception("已存在同名Sheet:" + sheet);
            }
            XSSFSheet spreadsheet = workbook.createSheet(sheet);
            XSSFRow row;
            Set<String> keyid = dataListLMS_IPS.keySet();
            int rowid = 0;
            CellStyle style = workbook.createCellStyle();
            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            for (String key : keyid) {
                row = spreadsheet.createRow(rowid++);
                String[] i = dataListLMS_IPS.get(key);
                int cellid = 0;
                int a = 0;
                for (String obj : i) {
                    Cell cell = row.createCell(cellid++);
                    cell.setCellValue(obj);
                    if (rowid != 1) {
                        if (i[2].equals(i[6]) && i[3].equals(i[7])) {
                            style.setFillForegroundColor(IndexedColors.BRIGHT_GREEN.getIndex());
                            cell.setCellValue(obj);
                            if (a == 2 || a == 3 || a == 6 || a == 7)
                                cell.setCellStyle(style);
                            a++;
                        }
                    }
                }
            }
            FileOutputStream out = new FileOutputStream(excelFile);
            workbook.write(out);
            out.close();
            workbook.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public static void main(String[] arg) throws Exception {
        Map<String, String[]> data = new LinkedHashMap<>();
        data.put("A", new String[]{"ACC NO: ", "REPORT TYPE", "PAYMENTID", "AMOUNT", "REPORT TYPE", "PAYMENTID", "AMOUNT", "RESULT"});
        data.put("v", new String[]{"ACC NO: ", "REPORT TYPE", "PAYMENTID", "AMOUNT", "REPORT TYPE", "PAYMENTID", "AMOUNT", "RESULT"});
        call(data, "sheet1");
        call(data, "sheet2");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:54:03