2015-03-30 5 views
-1

я новые вопросы создания, так вот я иду = DApache POI SXSSFSheet.getRow() возвращает нулевое ложноположительный

У меня есть все мои данные, хранящиеся в SXSSFWorkbook и я пытаюсь добавить формулу информацию перед записью и сохранить файл, все работает нормально, но когда я открываю файл, есть несколько пустых ячеек, где должна быть формула, я обнаружил, что 176 строк возвращают NULL, вот почему я не могу создать ячейки формулы в первых 176 строках, thats нечетная часть, потому что есть данные по этим строкам, после строки 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.-

Ну решение это немного сложно, требует больше кода и процессорного времени, сначала вы должны знать, что клетки будут (число, строка, пустой, формула и т.д.) , затем создайте всю свою ячейку, используя XSSFCell или HSSFCell или новый универсальный SS-сервер, затем создайте свои ячейки внутри Temp-листа, внесите все изменения, которые вам понадобятся, чтобы окончательно перебрать этот лист и заполнить SXSSFSheet.

еще одно

Spreadsheet API Feature Summary , как вы можете видеть, я не могу оценить формулы, но в моем коде я делаю весь процесс, и я знаю, что уже не будет сохранять формула оценивали, вот почему я использовал wb.setForceFormulaRecalculation(true);, поэтому другое решение - это только цифры, что означает оценку и выполнение всей математики с помощью java, а затем сохранение простых чисел.

Cheers.

+0

Что произойдет, если вы попробуете его только с XSSF? Может ли это быть артефактом SXSSF, который обычно добавляется? – Gagravarr

+0

Спасибо за ваш быстрый ответ, у XSSF есть большой объем памяти, и мне нужна эта программа, чтобы быть безупречной, вот почему я пытаюсь использовать SXSSF для создания файлов, кстати, как я сказал, что проблема возникает только в первых 176 строках, поэтому я не может понять, что происходит. – Aosi

+0

Увеличьте размер своей кучи и попробуйте с XSSF. Это скажет вам, есть ли проблема с этим одним файлом, или если это ошибка SXSSF. – Gagravarr

ответ

-1

Посмотрите на SXSSFSheet.setRandomAccessWindowSize(int), это свойство задает количество строк в памяти.