Невозможно удалить первую строку листа Excel - PullRequest
0 голосов
/ 15 января 2019

Я хочу полностью удалить первую строку моего листа Excel. Однако каждый раз, когда я запускаю свой код, он полностью стирает мой лист, и каждая строка становится пустой.

Заранее благодарю за помощь.

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

String exportPath = "C:\\Users\\User\\Downloads\\export.xlsx";

FileInputStream inputStream = new FileInputStream(new File(exportPath));
Workbook export = WorkbookFactory.create(inputStream);
Sheet exportSheet = export.getSheetAt(0);

int lastNum = exportSheet.getLastRowNum();
exportSheet.removeRow(exportSheet.getRow(0));
exportSheet.shiftRows(1, lastNum, -1);

inputStream.close();
FileOutputStream outputStream = new FileOutputStream(exportPath);
export.write(outputStream);
export.close();
outputStream.close();

Мне нужно удалить первую строку моего листа.

1 Ответ

0 голосов
/ 16 января 2019

В apache poi 4.0.1, shiftRows не корректирует ссылки на ячейки. Если строка 1 сдвинута вверх, то ссылки в ячейках остаются r = "A2", r = "B2", ... Но они должны быть скорректированы с учетом новой строки: r = "A1", r = "B1" , ...

Эта ошибка появляется только в XSSF (Office Open XML, *.xlsx). Бинарный файл HSSF (BIFF, *.xls) не имеет этой проблемы.

Пример:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import java.io.*;

class ExcelDeleteShiftRows {

 public static void main(String[] args) throws Exception {

  String filePath = "SAMPLE.xlsx";

  FileInputStream inputStream = new FileInputStream(filePath);
  Workbook workbook = WorkbookFactory.create(inputStream);
  Sheet sheet = workbook.getSheetAt(0);

  int lastNum = sheet.getLastRowNum();
  Row row0 = sheet.getRow(0);
  if (row0 != null) sheet.removeRow(row0);

  sheet.shiftRows(1, lastNum, -1); 
  // After that the sheet is corrupted. The shiftRows does not adjusting references of the cells.
  // If row 1 is shifted up, then reference in the cells remain r="A2", r="B2", ...
  // But they must be adjusted to the new row though: r="A1", r="B1", ...

  // This corrects this. But of course it is unperformant.
  if (sheet instanceof XSSFSheet) {
   for (Row row : sheet) {
    long rRef = ((XSSFRow)row).getCTRow().getR();
    for (Cell cell : row) {
     String cRef = ((XSSFCell)cell).getCTCell().getR();
     ((XSSFCell)cell).getCTCell().setR(cRef.replaceAll("[0-9]", "") + rRef);
    }
   }
  }

  FileOutputStream outputStream = new FileOutputStream(filePath);
  workbook.write(outputStream);
  outputStream.close();
  workbook.close();

 }
}

Пожалуйста, отправьте сообщение об ошибке в apache poi, чтобы исправление было исправлено непосредственно командой разработчиков apache poi. Этот полный пример вместе с коротким SAMPLE.xlsx является достаточно коротким, чтобы быть помещенным в качестве примера, чтобы показать проблему.

...