移动xlsx文件的行

时间:2014-03-07 11:23:49

标签: java excel apache-poi

我正在通过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方法?

2 个答案:

答案 0 :(得分:0)

来自Apache poi documentation

  

HSSF是POI Project的Excel '97(-2007)文件格式的纯Java实现。 XSSF是POI项目的Excel 2007 OOXML(.xlsx)文件格式的纯Java实现。

您无法将XSSFxls文件一起使用。

答案 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)

最后一行删除可能会导致问题...因此,对于这种情况,您应该使用删除行