Java apache poi何时覆盖Excel格式,何时不覆盖?

Java apache poi何时覆盖Excel格式,何时不覆盖?,java,excel,apache-poi,Java,Excel,Apache Poi,我想使用ApachePOI生成一个Excel,在其中我可以显示大约2000条记录,其中每条记录包含一个日期和一个值 我希望这个Excel格式正确,为单元格背景着色,并应用适当的数字格式 我可以完成这两项任务,但我不能像我希望的那样高效地进行格式化 我尝试过的三种应用格式的方法如下:所有三种方法都涉及使用预格式化的Excel模板。然而,问题是在Excel中要做多少格式化(以及如何应用格式化)以及在Java中要做多少 方法1: 在Excel中格式化一行,并使用Java代码复制格式化。例如: Row

我想使用ApachePOI生成一个Excel,在其中我可以显示大约2000条记录,其中每条记录包含一个日期和一个值

我希望这个Excel格式正确,为单元格背景着色,并应用适当的数字格式

我可以完成这两项任务,但我不能像我希望的那样高效地进行格式化

我尝试过的三种应用格式的方法如下:所有三种方法都涉及使用预格式化的Excel模板。然而,问题是在Excel中要做多少格式化(以及如何应用格式化)以及在Java中要做多少

方法1: 在Excel中格式化一行,并使用Java代码复制格式化。例如:

Row existingRow = mySheet.getRow(4);
Cell existingCell = existingRow.getCell(0);
CellStyle currentStyle = existingCell.getCellStyle();

for (int w = 0; w < refData.size(); w++) {
    MyValues aa = refData.get(w);
    Row r = CellUtil.getRow(w + 4, mySheet);
    CellUtil.getCell(r, 0).setCellValue(aa.getMarketDate());
    if (w>0) {
         CellUtil.getCell(r, 0).setCellStyle(currentStyle);
    }
Row existingRow=mySheet.getRow(4);
Cell existingCell=existingRow.getCell(0);
CellStyle currentStyle=existingCell.getCellStyle();
对于(int w=0;w0){
CellUtil.getCell(r,0).setCellStyle(currentStyle);
}
方法2:在Excel中选择包含所需格式的单元格,粘贴到我需要的区域(2000行),然后使用Apache POI填写数据

方法3:使用Excel将格式应用于列,然后使用Apache POI填写数据

第三种方法对我来说更可取,因为(a)当我可以在Excel中预先格式化时,我不需要开始编程Java代码[注意,我的实际问题包括几十列,而不仅仅是一列](b)在工作簿使用的内存方面,对列应用格式是非常有利的

唯一的问题是,当Apache POI写入复制和粘贴格式的单元格时,这些单元格显示良好。当它写入已将格式应用于列的单元格时,则在粘贴之前删除格式


有没有办法解决这个问题?我假设没有,因为Apache POI是通过单独考虑每一行来工作的。例如,要将格式应用于列,需要将格式单独应用于列中的每个单元格

一种方法是在打开wor时使用VBA宏将格式应用于列kbook

Private Sub Workbook_Open()
   'column formatting
End Sub

然而,这显然有一个缺点,即用户需要启用宏。您需要从“guide”单元格中读取样式,并将其应用到列中。这样,新单元格将获得其样式

(在你开始写值之前一次)

Row-guideRow=mySheet.getRow(0);
对于(int ii=0;ii
另一种方法是从预格式化的模板excel加载,填充并保存到所需位置。您好@Ravinder。我的3个建议解决方案都涉及使用预格式化模板。我已编辑了我的问题以使其更清晰。谢谢
Row guideRow = mySheet.getRow(0);
for (int ii = 0 ; ii < row.getNumColumns; ++ii) {
  CellStyle currentStyle = row.getCell(ii).getCellStyle();
  mySheet.setDefaultColumnStyle(ii, currentStyle);
}