java - 使用 Apache-POI 编写工作簿后出现问题

标签 java excel apache-poi

将数据插入扩展名为 .xlsm 的 Excel 模板工作表后遇到问题。该代码有效。它正确地复制了有问题的数据,但是当我尝试运行一个获取导入数据的特定宏时,它无法识别所有行,只能识别前两行。

但是,如果我复制并粘贴第二列中的任何单元格,例如如果我在 B2 中复制 B2 并执行宏,它会识别插入的行总数。你能帮助我吗?我希望我说得清楚。

这是我的功能代码

public String generarExcelSalida(String codCampaña,JDateChooser fechaParametro,String tfOutFolder){
String fileName="Modelo Caida "+codCampaña+".xlsm";
String exitFilePath=tfOutFolder+"\\"+fileName;
FileInputStream fileIn=null;
FileOutputStream fileOut=null;
SimpleDateFormat dParam=new SimpleDateFormat("dd/MM/yyyy");
String dateParam = dParam.format(fechaParametro.getDate()).toString();
ResultSet rs=DBManager.ConsultaCaida(dateParam, codCampaña);
try {
    // Here I'm opening my template file
    fileIn=new FileInputStream(FileManagement.carpetaTemplate+"\\Template_Caidas.xlsm");

    XSSFWorkbook workbook=new XSSFWorkbook(OPCPackage.open(fileIn));
    XSSFSheet sheet9=workbook.getSheet("BASE_DATOS");

    int i=1; // This parameter is used to getRow(i)
    while(rs.next()){
        XSSFRow row = sheet9.getRow(i);

        XSSFCell cell1=row.getCell(0);
        XSSFCell cell2=row.getCell(1);
        XSSFCell cell3=row.getCell(2);
        XSSFCell cell4=row.getCell(3);
        XSSFCell cell5=row.getCell(4);
        XSSFCell cell6=row.getCell(5);
        //Writing de ResultSet values on Sheet "BASE_DATOS"
        cell1.setCellValue(rs.getString("Producto Comercial"));
        cell2.setCellValue(rs.getInt("Nro Certificados"));
        cell3.setCellValue(rs.getString("DefEstado"));
        cell4.setCellValue(rs.getDate("Año-Mes Venta"));
        cell5.setCellValue(rs.getDate("Año-Mes Inicio Vigencia"));
        cell6.setCellValue(rs.getDate("AM Estado"));
        i++;// next Sheet.row

        }

    fileOut=new FileOutputStream(exitFilePath);
    //writing the workbook in a new file, it is like SAVE AS
    workbook.write(fileOut);
    if(fileOut!=null) fileOut.close();
    if(fileIn!=null) fileIn.close();
} catch (IOException | InvalidFormatException | SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
//return the path of the new file
return exitFilePath;
}

这是宏的代码

Private Sub Base_Datos()
Dim Numero_Registro As Integer
Dim Celda As Range
Dim Columna, Fila As Integer

Sheets("BASE_DATOS").Select

' Busqueda del limite de Filas
Fila = Range("Numero_Registro") + 1

' Busqueda del limite de Columnas
Set Celda = Range("1:1").Find("BAJAS")
Columna = Celda.Column

With Range("a1")
' Copiar Pegar
Range(.Cells(2, Columna), .Cells(2, 100)).Select
Selection.Copy

Range(.Cells(3, Columna), .Cells(Fila, 100)).Select
Selection.PasteSpecial Paste:=xlFormulas

End With
End Sub

最佳答案

因此,从您的评论来看,问题在于所需的重新计算,因为宏依赖于使用 COUNTA 来计算填充单元格的单元格值。

两种可能的解决方案:

首先:在保存工作簿之前,您可以使用 FormulaEvaluator 来评估 apache poi 中的公式:

...
    //writing the workbook in a new file, it is like SAVE AS
    XSSFFormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
    evaluator.evaluateAll();
    workbook.write(fileOut);
...

这可能会失败,具体取决于公式的类型。

如果使用evaluateAll()失败,您至少可以使用COUNTA公式计算单元格。这应该不会失败,因为 apache poi 支持 COUNTA 函数。

阅读Formula Evaluation了解如何做。

第二:您可以强制 Excel 在打开文件时进行重新计算:

...
    //writing the workbook in a new file, it is like SAVE AS
    workbook.setForceFormulaRecalculation(true);
    workbook.write(fileOut);
...

这可能会导致打开文件时的处理时间较长。

关于java - 使用 Apache-POI 编写工作簿后出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41775540/

相关文章:

java - Spring 数据 - JPA,缺少 ID

java - 尝试在 Optaplanner 中添加一个值(使用 Drools)

java - 对象可以在构造函数中声明实例变量吗?

java - 使用 JSF2 和 RichFaces 导出到 XLS

java - 如何使用 apache poi 删除 Excel 中的单元格内容

excel - 如何使用 excel vba 代码更改盒须图中系列的颜色?

vba - 存储#VALUE! #NUM! #引用!在变量中

VBA - 根据单元格值更改多个工作表选项卡的颜色

java - Excel POI API 更改单元格值

java - 上传并读取文件