我是新创造的问题,所以这里是我去= 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评估和完成所有数学运算,然后保存普通数字。
干杯。
答案 0 :(得分:-1)
看看SXSSFSheet.setRandomAccessWindowSize(int)
,此属性设置将在内存中的行数。