将数据插入扩展名为 .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/