如何用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
相关产品推荐
相关产品推荐

