由于该单元格包含电子邮件地址,因此无法使用Apache POI删除行

时间:2019-02-28 01:27:20

标签: java apache-poi

我正在使用Apache POI 3.17打开xlsx电子表格,读取row =1(行= 0是应保留在其中的标题),将值存储在我的对象中,然后删除row =1

enter image description here

我希望删除后,row = 2将变成row = 1,而last row将变成last row -1。这是我的代码:

    private static void removeRow (String pathToExcel ) throws InvalidFormatException {

        try {

            FileInputStream file = new FileInputStream(pathToExcel);

            Workbook workbook = WorkbookFactory.create(file);
            Sheet sheet = workbook.getSheetAt(0);
            int lastRowNum = sheet.getLastRowNum();
            sheet.shiftRows( 2, lastRowNum, -1);

            file.close();

            FileOutputStream outFile =new FileOutputStream(new File(pathToExcel));
            workbook.write(outFile);
            outFile.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) throws InvalidFormatException {
        removeRow(PATH_TO_EXCEL);
    }

删除行= 1时,我得到

Exception in thread "main" java.lang.IllegalArgumentException: Invalid CellReference: D3:D21
at org.apache.poi.ss.util.CellReference.separateRefParts(CellReference.java:395)
at org.apache.poi.ss.util.CellReference.<init>(CellReference.java:113)
at org.apache.poi.xssf.usermodel.XSSFSheet.shiftRows(XSSFSheet.java:3024)
at org.apache.poi.xssf.usermodel.XSSFSheet.shiftRows(XSSFSheet.java:2966)
at Sandbox.ExcelReader.removeRow(ExcelReader.java:177)

我不确定为什么会抱怨无效的CellReference吗?

谢谢。

更新:我发现了这个问题,很明显POI不喜欢包含电子邮件地址格式testing@testing.com的整个D列,一旦删除了整个D列,POI就不会抛出异常了。我想知道为什么它不喜欢电子邮件地址格式。电子表格必须包含电子邮件地址。

更新了2次(在Axel建议之后)

这不会引发任何异常,但也不会删除该行。运行此方法后,我的电子表格将保持运行该方法之前的状态。

    private static void removeRow(String pathToExcel) throws IOException, InvalidFormatException {

        try {
            FileInputStream file = new FileInputStream(pathToExcel);
            Workbook workbook = WorkbookFactory.create(file);
            Sheet sheet = workbook.getSheetAt(0);

            int rowIndex = 1;
            int lastRowNum = sheet.getLastRowNum();
                Row row = sheet.getRow(rowIndex);
            if (row != null) {
                System.out.println(row.getCell(3).getRichStringCellValue()); //For Testing
                System.out.println(row.getCell(4).getRichStringCellValue()); //For Testing
                sheet.removeRow(row);
                sheet.shiftRows(rowIndex + 1, lastRowNum, -1);
            }

            if (rowIndex == lastRowNum) {
                System.out.println("Last Row");
                Row removingRow = sheet.getRow(rowIndex);
                if (removingRow != null) {
                    sheet.removeRow(removingRow);
                }
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:1)

问题不是这样的电子邮件地址,而是这些单元格中具有链接的事实。链接中有引用,UserName期间更新这些引用失败。可以将其称为错误。但是删除第2行(行索引1)的更好方法是首先删除行的内容,然后再将其他行上移。 Email也可以正确删除链接引用。

shiftRows

使用removeRow对我有用。注意... int lastRowNum = sheet.getLastRowNum(); Row row = sheet.getRow(1); if (row != null) sheet.removeRow(row); sheet.shiftRows(2, lastRowNum, -1); ... 在使用apache poi 3.17时还有其他问题。参见Impossible to delete first row of Excel sheet