首页 > 解决方案 > 在 Excel 工作表的列末尾写入 excel 数据

问题描述

我想在列的末尾添加值,但是如果我运行该类,它会覆盖 excel

JAVA,阿帕奇POI:

    // Blank workbook
    XSSFWorkbook workbook = new XSSFWorkbook();
    // Create a blank sheet
    XSSFSheet sheet = workbook.createSheet("MyPolicies");
    // Iterate over data and write to sheet
    Set<Integer> keyset = data.keySet();
    int rownum = 0;
    for (Integer key : keyset) {
        // this creates a new row in the sheet
        Row row = sheet.createRow(rownum++);
        Object[] objArr = data.get(key);
        int cellnum = 0;
        for (Object obj : objArr) {

            // this line creates a cell in the next column of that row
            Cell cell = row.createCell(cellnum++);
            if (obj instanceof String) {
                cell.setCellValue((String) obj);
            }

            else if (obj instanceof Integer)
                cell.setCellValue((Integer) obj);
        }
    }
    try {
        // this Writes the workbook
        FileOutputStream out = new FileOutputStream(new File("extract.xlsx"));
        workbook.write(out);
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

Excel 每次都会覆盖,并且仅添加新数据。注意:如果两个ID相同,我们需要在同一行添加第二个地图数据

标签: javaapache-poi

解决方案


每次都替换您的文档的原因是您的文档是workbook空白的。workbook.write(out)意味着您将工作簿中的所有内容写入一个位置(extract.xlsx),而不是您将工作簿的数据写入文件!

您应该做的是打开您要编辑的工作簿:

FileInputStream xlsFile = new FileInputStream("extract.xls");
XSSFWorkbook workbook = new XSSFWorkbook(xlsFile);

...获取最后一行或最后一列

XSSFSheet sheet = workbook.getSheetAt(0);
int lastRow = sheet.getLastRowNum();

...并从那里写入您的数据。然后,和以前一样,您可以使用workbook.write(out)来保存您的工作簿。


推荐阅读