Java 创建新单元格时,复制以前的单元格';Apache POI中的s样式。。?

Java 创建新单元格时,复制以前的单元格';Apache POI中的s样式。。?,java,apache-poi,Java,Apache Poi,在我的java类中,我声明了如下单元格: HSSFCell cell = null; 我在很多地方使用这个单元格来创建一个单元格并设置值和样式。比如: cell = row.createCell(1); cell.setCellValue("1234.00"); setCellStyle(currency, cell, workbook); cell = row.createCell(2); setCellValue("2445.0

在我的java类中,我声明了如下单元格:

HSSFCell cell = null;
我在很多地方使用这个单元格来创建一个单元格并设置值和样式。比如:

cell = row.createCell(1);               
cell.setCellValue("1234.00");
setCellStyle(currency, cell, workbook);

cell = row.createCell(2);               
setCellValue("2445.00");
现在,令人惊讶的是,第一个单元格的数据格式正在应用于第二个单元格。 有人知道吗? 我希望第二个牢房的风格是没有的。第一个单元格的样式应该与setCellStyle()方法应用的数据格式一致。 但是,实际上我得到的是两个单元格值,都是setCellStyle()方法应用的数据格式

setCellStyle()方法:


现在,您已经更新了帖子以显示您的
setCellStyle
方法,我可以看到问题所在。每个
单元格
都以默认的
单元格样式
开始,并且它们都共享相同的默认
单元格样式
。当您为第一个
单元格调用
setCellStyle
时,您正在更改为所有单元格共享的默认
CellStyle
。这意味着您创建的任何其他单元格(未设置
CellStyle
)都有您的更改。此外,当您调用自己的
setCellStyle
时,它将再次更改默认单元格样式

相反,使用创建一个新的
CellStyle
,只有该
单元格才会有

如果要将多个单元设置为同一单元样式,则应

从工作簿中创建新的单元格样式非常重要,否则最终可能会修改内置样式,不仅影响此单元格,还影响其他单元格


HSSFRow中没有
createCell(String)
方法。@rgetman我的错误,编辑了什么是
CUSTOM\u STYLE\u和\u DATA\u格式
?您是否使用format->format Cells验证Excel中的数据格式?@rgetman感谢您的快速响应。最初我使用“自定义样式和数据格式”只是为了让用户了解我需要什么。但这看起来还不够。因此,我展示了实际的代码。我有一个excel报告文件,其中有许多工作表,每个工作表包含太多的行和列。并且列的数据类型不同,需要很多样式(需要以不同格式格式化的数字列、根据货币名称格式化的货币值、一些字符串粗体和一些不粗体、一些有背景色、一些需要斜体等等)。我正按照你在回答中说的那样做。但是我尝试应用一些常见的东西,例如使用common方法来应用数据格式。因此,如果我在一个工作表中有20列,有5种不同的行,并且一行中的每个单元格都需要根据行类型进行格式化,那么到目前为止,我唯一的解决方案就是分别创建每个所需的样式并使用。我想知道这是我们处理ApachePOI的方式吗?在您遇到工作簿中单元格样式数量的限制之前,这种方式是有效的。但我在Apache POI中创建了许多具有复杂单元格样式的电子表格,尽管根据需要重新创建单元格样式可能更简单,即使它与您已经创建的单元格样式重复,但最好在任何处理之前创建一次单元格样式,然后根据需要引用它们。因此,如果我的工作表需要40种不同的样式,我需要创建40种不同的样式,并在工作簿中的任何需要的地方使用,而无需在运行时修改这些样式?如果我需要200种不同的款式呢?我是apache poi的新手,所以想知道是的。但是,如果需要,您可以懒洋洋地创建它们。但是,如果我知道我有200种不同的样式可以在任意点动态应用,那么我将创建某种缓存对象,它将
具有所需特征的字符串映射到
CellStyle
对象。在缓存未命中时创建新的
CellStyle
,在缓存命中时使用现有的。
public void setCellStyle(String currency, HSSFCell cell, HSSFWorkbook workbook){

        HSSFCellStyle cellStyle = cell.getCellStyle();//I am using cell.getStyle() because the default cell style is not null for a HSSFCell

        HSSFDataFormat dataFormat = workbook.createDataFormat();

        if("GBP".equalsIgnoreCase(currency)){
            cellStyle.setDataFormat(dataFormat.getFormat("[$£-809]#,##0_);[Red]([$£-809]#,##0)"));                 
        }else (){
            cellStyle.setDataFormat(dataFormat.getFormat("$#,##0_);[Red]($#,##0)")); 
        }
}
HSSFCellStyle cellStyle = workbook.createCellStyle();