如何使用Java SE和Apache POI删除Excel工作簿中Excel表的内容?
答案 0 :(得分:4)
我发现removeSheetAt / createSheet实际上不是一个可以接受的答案,因为你不能将新工作表放到工作簿中的正确位置,而不会遇到WorkSheet.setSheetOrder中的错误
此代码段
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
sheet.removeRow(row);
}
在我的世界中抛出一个ConcurrentModificationException
我不得不求助于
for (int index = crnt.getLastRowNum(); index >= crnt.getFirstRowNum(); index--) {
crnt.removeRow( crnt.getRow(index));
}
答案 1 :(得分:4)
正如之前的评论所述
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
sheet.removeRow(row);
}
此代码向我抛出ConcurrentModificationException。所以,我修改了代码,它工作正常。这是代码:
Sheet sheet = wb.getSheetAt(0);
Iterator<Row> rowIte = sheet.iterator();
while(rowIte.hasNext()){
rowIte.next();
rowIte.remove();
}
答案 2 :(得分:2)
根据您要删除的 内容,您可以删除单个单元格或行。
删除所有行上的完整工作表iterate并将其删除。
Sheet sheet = wb.getSheetAt(0);
for (Row row : sheet) {
sheet.removeRow(row);
}
答案 3 :(得分:2)
我知道这是一个老线程,但我认为我找到了最佳解决方案
我所做的只是创建一个相同类型的新工作簿,并将其保存在我想删除的文件上。
继承代码
private void clearOldFile(){
FileOutputStream out = null;
try{
oldFile = new XSSFWorkbook();
Sheet sheet = oldFile.createSheet("temp data");
out = new FileOutputStream(AbsolutePathForTempExcelFile);
oldFile.write(out);
out.close();
} catch(Exception e){
e.printStackTrace();
}
}
答案 4 :(得分:1)
您可能想要使用HSSFWorkbook.removeSheetAt(index)
。
答案 5 :(得分:1)
我也得到了并发修改异常,也使用了更“现代”的方式:
sheet.forEach(r->sheet.remove(r));
来自@Thirupathi S的基于迭代器的解决方案显然有效,但由于原因我并不确切知道它是创建了Apple的Numbers和OSX预览(以及可能还有其他软件)无法读取的xslx文件。
我怀疑这与迭代器没有删除某些东西有关:removeRow方法的代码比简单的迭代器删除操作更复杂。
使用具有反向索引的旧朴素for循环就像一个魅力:
for (int i = sheet.getLastRowNum(); i >= 0; i--) {
sheet.removeRow(sheet.getRow(i));
}
答案 6 :(得分:0)
我猜这是一个旧线程,但我也得到了ConcurrentModificationException。根据VoiceOfUnreason,我发现这个工作:
while (xlsSheet.getPhysicalNumberOfRows() > 0) {
xlsSheet.removeRow(xlsSheet.getRow(xlsSheet.getLastRowNum()));
}
if (xlsSheet.getDrawingPatriarch() != null) {
xlsSheet.getDrawingPatriarch().clear();
}
答案 7 :(得分:0)
其他迭代器方法似乎有效,但Excel拒绝打开该文件。 这个对我有用:
int rownum;
while ((rownum=sheet.getLastRowNum()) > 0) sheet.removeRow(sheet.getRow(rownum));
答案 8 :(得分:0)
此解决方案适用于我。并且还考虑特殊情况,例如工作表为空白,或者存在firstRow和lastRow之间的空格。
public void cleanSheet(Sheet sheet) {
int numberOfRows = sheet.getPhysicalNumberOfRows();
if(numberOfRows > 0) {
for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {
if(sheet.getRow(i) != null) {
sheet.removeRow( sheet.getRow(i));
} else {
System.out.println("Info: clean sheet='" + sheet.getSheetName() + "' ... skip line: " + i);
}
}
} else {
System.out.println("Info: clean sheet='" + sheet.getSheetName() + "' ... is empty");
}
}
答案 9 :(得分:0)
我不删除和重新创建工作表的原因:保持对工作表作用域名称的引用。
for(int i = sheet.getLastRowNum(); i >= 0; i--)
{
Row row = sheet.getRow(i);
if(row != null)
{
sheet.removeRow(row);
}
}