我正在通过POI读取包含一些行的Excel文件。如果文件的行正确保存在数据库中,我必须删除该文件的行。
直到几天前,我正在使用.xls文件(HSSFSheet),一切正常。 Removing a row from a HSSFSHEET
现在我需要更多的.xls文件的256列,然后我将其更改为XSSFSheet。但是当我使用它时,我收到了这个错误:
java.lang.RuntimeException: not implemented yet
at org.apache.poi.xssf.usermodel.XSSFEvaluationWorkbook.getExternalSheetIndex(XSSFEvaluationWorkbook.java:117)
at org.apache.poi.ss.formula.FormulaParser.createAreaRefParseNode(FormulaParser.java:613)
at org.apache.poi.ss.formula.FormulaParser.parseRangeable(FormulaParser.java:508)
at org.apache.poi.ss.formula.FormulaParser.parseRangeExpression(FormulaParser.java:266)
at org.apache.poi.ss.formula.FormulaParser.parseSimpleFactor(FormulaParser.java:1117)
at org.apache.poi.ss.formula.FormulaParser.percentFactor(FormulaParser.java:1077)
at org.apache.poi.ss.formula.FormulaParser.powerFactor(FormulaParser.java:1064)
at org.apache.poi.ss.formula.FormulaParser.Term(FormulaParser.java:1424)
at org.apache.poi.ss.formula.FormulaParser.additiveExpression(FormulaParser.java:1524)
at org.apache.poi.ss.formula.FormulaParser.concatExpression(FormulaParser.java:1508)
at org.apache.poi.ss.formula.FormulaParser.comparisonExpression(FormulaParser.java:1465)
at org.apache.poi.ss.formula.FormulaParser.Arguments(FormulaParser.java:1049)
at org.apache.poi.ss.formula.FormulaParser.function(FormulaParser.java:934)
at org.apache.poi.ss.formula.FormulaParser.parseNonRange(FormulaParser.java:556)
at org.apache.poi.ss.formula.FormulaParser.parseRangeable(FormulaParser.java:427)
at org.apache.poi.ss.formula.FormulaParser.parseRangeExpression(FormulaParser.java:266)
at org.apache.poi.ss.formula.FormulaParser.parseSimpleFactor(FormulaParser.java:1117)
at org.apache.poi.ss.formula.FormulaParser.percentFactor(FormulaParser.java:1077)
at org.apache.poi.ss.formula.FormulaParser.powerFactor(FormulaParser.java:1064)
at org.apache.poi.ss.formula.FormulaParser.parseUnary(FormulaParser.java:1129)
at org.apache.poi.ss.formula.FormulaParser.parseSimpleFactor(FormulaParser.java:1102)
at org.apache.poi.ss.formula.FormulaParser.percentFactor(FormulaParser.java:1077)
at org.apache.poi.ss.formula.FormulaParser.powerFactor(FormulaParser.java:1064)
at org.apache.poi.ss.formula.FormulaParser.Term(FormulaParser.java:1424)
我正在使用这些POI依赖项:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.7</version>
</dependency>
我看到了Shift rows exception。
在这篇文章中,你说POI的最后一个版本还没有实现该方法。
这是我的代码。
public void import(){
Workbook wb = WorkbookFactory.create(new ByteArrayInputStream(byteUploaded));
List<Row> rowsToRemoved = new ArrayList<Row>();
Sheet mySheet = wbUploaded.getSheetAt(0);
for(Row row: mySheet){
try{
MyDTO dto = checkRow(row);
importService.save(dto);
rowsToRemoved.add(row);
}catch(Exception e){
//do something
}
}
deleteRowSavedFromSheet(mySheet,rowsToRemoved);
}
public void deleteRowSavedFromSheet(Sheet sheet, List<Row> rowsToRemoved ) {
for(Row row : rowsToRemoved){
sheet.removeRow(row);
int lastRowNum=sheet.getLastRowNum();
if(rowIndex>=0&&rowIndex<lastRowNum){
sheet.shiftRows(rowIndex+1,lastRowNum, -1); //here i get the exception
}
if(rowIndex==lastRowNum){
Row removingRow=sheet.getRow(rowIndex);
if(removingRow!=null){
sheet.removeRow(removingRow);
}
}
}
rowsToRemoved.clear();
}
如何使用shift方法?
答案 0 :(得分:0)
HSSF是POI Project的Excel '97(-2007)文件格式的纯Java实现。 XSSF是POI项目的Excel 2007 OOXML(.xlsx)文件格式的纯Java实现。
您无法将XSSF
与xls
文件一起使用。
答案 1 :(得分:0)
如果您没有连续的行,请使用以下方法
public static void deleteRowSavedFromSheet(Sheet sheet, List<Row> rowsToRemoved){
for(Row row : rowsToRemoved){
sheet.shiftRows(row.getRowNum()+1, sheet.getLastRowNum(), -1);
}
}
如果您有连续的行,只需使用
即可sheet.shiftRows(lastIndexOfRowToRemove +1, LastIndexOfSheet, -CountOfRowsToRemove)
最后一行删除可能会导致问题...因此,对于这种情况,您应该使用删除行