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

Java 无法使用Apache POI删除行,因为该单元格包含电子邮件地址,java,apache-poi,Java,Apache Poi,我正在使用Apache POI 3.17打开xlsx电子表格,读取行=1(行=0是应该留在那里的标题),将值存储在我的对象中,然后删除行=1 我希望删除后,row=2将变成row=1,last row将变成last row-1。这是我的密码: private static void removeow(字符串路径Excel)引发InvalidFormatException{ 试一试{ FileInputStream文件=新的FileInputStream(pathToExcel); 工作簿=W

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

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

private static void removeow(字符串路径Excel)引发InvalidFormatException{
试一试{
FileInputStream文件=新的FileInputStream(pathToExcel);
工作簿=WorkbookFactory.create(文件);
工作表=工作簿。getSheetAt(0);
int lastRowNum=sheet.getLastRowNum();
sheet.shiftRows(2,lastRowNum,-1);
file.close();
FileOutputStream outFile=新的FileOutputStream(新文件(pathToExcel));
工作簿。写入(输出文件);
outFile.close();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}

}
问题不在于电子邮件地址本身,而在于这些单元格中有链接。链接有引用,更新这些引用会在
shiftRows
时失败。人们可以称之为bug。但是删除第2行(行索引1)的更好方法是首先删除该行的内容,然后再将其他行上移。
removeRow
也会正确删除链接引用

...
  int lastRowNum = sheet.getLastRowNum();
  Row row = sheet.getRow(1);
  if (row != null) sheet.removeRow(row);
  sheet.shiftRows(2, lastRowNum, -1);
...

这对我来说适用于使用ApachePOI3.17。注意
apachepoi4.0.1
在使用
shiftRows
时存在其他问题。请参阅。

问题不在于电子邮件地址本身,而在于这些单元格中有链接。链接有引用,更新这些引用会在
shiftRows
时失败。人们可以称之为bug。但是删除第2行(行索引1)的更好方法是首先删除该行的内容,然后再将其他行上移。
removeRow
也会正确删除链接引用

...
  int lastRowNum = sheet.getLastRowNum();
  Row row = sheet.getRow(1);
  if (row != null) sheet.removeRow(row);
  sheet.shiftRows(2, lastRowNum, -1);
...

这对我来说适用于使用ApachePOI3.17。注意
apachepoi4.0.1
在使用
shiftRows
时存在其他问题。请参阅。

谢谢阿克塞尔。不幸的是,我仍然看到抛出异常。我在
sheet.removeow(行)之前打印单元格D2&
sheet.shiftRows(1,lastRowNum,-1)。以下是输出:`testing@testing.com线程“main”java.lang.IllegalArgumentException中的异常:org.apache.poi.ss.util.CellReference.separateRefParts(CellReference.java:395)org.apache.poi.ss.util.CellReference中的无效CellReference:D3:D21(CellReference.java:113)@keylogger:我的代码经过测试,适合我。但是您的
工作表中的
行是哪一行?您的
sheet.shiftRows(1,lastRowNum,-1)将第2行(行索引1)上移一次。但这会将第2行转移到第1行。但是第1行是您的标题行吗?在你的问题和我的回答中,它是
sheet.shiftRows(2,lastRowNum,-1)因此第3行(行索引2)被上移一次。在此之前,我删除了第2行(行索引1)。谢谢Axel。我更新了我的方法,并在上面的原始问题中发布。我将
行索引
更改为1、2或3,但没有成功。今天它不再抛出任何异常(不确定原因,因为自上次以来我没有做任何更改),但它也不会删除任何行。我的电子表格保持原样。我这边肯定出了什么问题,但不确定是什么:(@keylogger:你的新代码不会写出更改后的工作簿。它没有
工作簿。请在任何地方写入
。注意:我已经生成了你在屏幕截图中显示的页面,只更改了你在我的答案中显示的第一个代码,它对我有效。啊,当然……忘记了那部分……谢谢阿克塞尔。它现在可以工作了d部分,在执行代码后,我使用Office打开xlsx文件,它抱怨
“我们发现“file.xlsx”中的某些内容有问题。是否希望我们尽可能多地恢复?如果您信任此工作簿的来源,请单击“是”`testing@testing.com线程“main”中出现异常java.lang.IllegalArgumentException:org.apache.poi.ss.util.CellReference.separateRefParts(CellReference.java:395)org.apache.poi.ss.util.CellReference.(CellReference.java:113)@keylogger:My代码已经过测试,对我有效。但是
sheet.removeRow(row)中的
行是什么
?您的
工作表。shiftRows(1,lastRowNum,-1);
将第2行(行索引1)向上移动一次。但这会将第2行移动到第1行。但是第1行是您的标题行?在您的问题和我的回答中是
工作表。shiftRows(2,lastRowNum,-1);
因此第3行(行索引2)向上移动了一次。在此之前,我删除了第2行(行索引1)。谢谢Axel。我更新了我的方法并在上面的原始问题中发布。我将
行索引更改为1、2或3,但没有成功。今天它不会引发任何异常(不确定原因,因为自上次以来我没有做任何更改),但它也不会删除任何行。我的电子表格保持原样。我这边肯定有问题,但不确定是什么:(@keylogger:你的新代码不会写出更改后的工作簿。它没有
工作簿。请在任何地方写入
。注意:我已经生成了你在屏幕截图中显示的页面,只更改了你在我的答案中显示的第一个代码,它对我有效。啊,当然……忘记了那部分……谢谢阿克塞尔。