Apache POI SXSSFSheet.getRow()返回null false positive

时间:2015-03-30 01:28:47

标签: java excel apache-poi sax xssf

我是新创造的问题,所以这里是我去= D

我将所有数据都存储在SXSSFWorkbook中,并且我在写入之前尝试添加一些公式信息并保存文件,一切正常但是当我打开文件时,有一些空白单元格,公式应该是,我发现176行返回NULL,这就是为什么我不能在前176行创建公式单元格,这就是奇数部分,因为这些行上有数据,在176行之后,公式似乎没问题,做了工作和其他一切工作,更新,创建,添加更多行并保存。

所以这里有一些代码= D。

   private void fillWorkBook(Vector tableData, String path) throws FileNotFoundException, IOException, InvalidFormatException{
        //this.xlsxWorkbook.setSheetName(0, "Proshop");
       SXSSFWorkbook wb = new SXSSFWorkbook(500);
       wb.setMissingCellPolicy(Row.CREATE_NULL_AS_BLANK);
       this.createHeader(wb);
       if(this.checkFile(path)){
            File f = new File(path); 
            OPCPackage pkg = pkg = OPCPackage.open(f);
            this.xlsxWorkbook = new XSSFWorkbook(pkg);
            Vector oldData = this.createDataVectorXLSX(0);
            for(int i = 5; i >= 0; i--)
                oldData.removeElementAt(i);
            for(int i = 0; i < 7; i++)
                oldData.removeElementAt(oldData.size()-1);
            this.fillWithTableData(wb, oldData);
            pkg.close();
            //System.out.println(path);

       } else {
           //System.out.println("nuevo archivo - fillWorkData");//tableData.toString());
       }
       this.fillWithTableData(wb, tableData);
       this.createFooter(wb);
       this.setColumnWidth(wb.getSheetAt(0));
       this.setCombinedCells(wb.getSheetAt(0));
       //sheet.shiftRows(5, 6, 10);
                                        //col, fil
       wb.getSheetAt(0).createFreezePane(0, 6);

       this.addImage(wb);
       this.createFormulaData(wb);
       wb.setForceFormulaRecalculation(true);
       this.createDataSalida(wb, path);

}


private void createFormulaData(SXSSFWorkbook wb) {
        XSSFSheet sheetXLSX = null;
        sheetXLSX = (SXSSFSheet) wb.getSheetAt(0);
        Row row;
        float marcaImpuesto[] = ViewController.factores;
        ViewController.factores = null;
        int cells = 0;
        for ( int i = 6; i <= sheetXLSX.getLastRowNum(); i ++ ){
          row = sheetXLSX.getRow( i );
          if(row != null){
           if(cells < row.getLastCellNum())
            cells = row.getLastCellNum();
           for ( int j = 0; j < cells; j++ ){
            Cell cell = row.getCell(j, Row.CREATE_NULL_AS_BLANK);
            switch(j){
                case 9:
                    cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                    cell.setCellFormula(""+CellReference.convertNumToColString(j-4)+(i+1)+"*"+marcaImpuesto[3]);
                    break;
                case 8:
                    cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                    cell.setCellFormula(""+CellReference.convertNumToColString(j-3)+(i+1)+"*"+marcaImpuesto[2]);
                    break;
                case 7:
                    cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                    cell.setCellFormula(""+CellReference.convertNumToColString(j-2)+(i+1)+"*"+marcaImpuesto[1]);
                    break;
                case 6:
                    cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
                    cell.setCellFormula(""+CellReference.convertNumToColString(j-1)+(i+1)+"*"+marcaImpuesto[0]);
                    break;
                case 5: 
                    cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                    break;
                default:
                    //cell.setCellType(Cell.);
                    break;
            }

          }

         } }
    }

UPDATE .-

解决方案有点复杂,需要更多代码和CPU时间,首先你需要知道单元格是什么(数字,字符串,空,公式等),然后使用XSSFCell创建所有单元格或者HSSFCell或新的通用SS用户模型,然后在临时表中创建您的单元格,进行所有需要的更改,最终迭代该工作表并填充SXSSFSheet。

还有一件事

Spreadsheet API Feature Summary 你可以看到我无法评估公式,但在我的代码中我正在做所有的过程,我知道它已经不会保存评估的公式,这就是为什么我使用wb.setForceFormulaRecalculation(true);所以另一个解决方案它只写数字,这意味着用java评估和完成所有数学运算,然后保存普通数字。

干杯。

1 个答案:

答案 0 :(得分:-1)

看看SXSSFSheet.setRandomAccessWindowSize(int),此属性设置将在内存中的行数。