我正在使用Apache POI 3.17打开xlsx电子表格,读取row =1
(行= 0是应保留在其中的标题),将值存储在我的对象中,然后删除row =1
。
我希望删除后,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();
}
}
答案 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。