Невозможно удалить строку, используя Apache POI, потому что ячейка содержит адрес электронной почты - PullRequest
0 голосов
/ 28 февраля 2019

Я использую 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)

Я не уверен, почему он жалуется на Invalid CellReference?

Благодарю.

Обновлено: Я обнаружил проблему, очевидно, POI не нравится весь столбец D, который содержит формат адреса электронной почты testing@testing.com, после удаления всего столбца D POI небросить исключение больше.Мне интересно, почему он не любит формат адреса электронной почты.Электронная таблица должна содержать адрес электронной почты.

Обновлено 2 (после предложения Акселя) :

Это не вызовет никаких исключений, но и не удалит строку.После запуска этого метода моя таблица остается такой же, какой была до запуска этого метода.

    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 голосов
/ 28 февраля 2019

Проблема не в адресе электронной почты как таковом, а в том, что в этих ячейках есть ссылки.Ссылки имеют ссылки, и обновление этих ссылок не выполняется, пока shiftRows.Можно назвать это ошибкой.Но лучший подход к удалению строки 2 (индекс строки 1) - сначала удалить содержимое строки, а затем сместить другие строки вверх.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.Примечание apache poi 4.0.1 имеет другие проблемы, используя shiftRows.См. Невозможно удалить первую строку листа Excel .

...