gpt4 book ai didi

java - Excel 97-2003 (.xls) 中的单元格样式丢失或不显示

转载 作者:行者123 更新时间:2023-12-04 20:08:20 25 4
gpt4 key购买 nike

我正在使用 Apache POI 库将数据导出到 Excel。我已经尝试了所有最新版本(3.17、4.1.2 和 5.2.1)。
我对与单元格样式相关的 Excel 97 (.xls) 格式有疑问。在一定数量的列之后,单元格样式会以某种方式丢失(或不显示)。
这是我的示例代码:

private void exportXls() {
try (
OutputStream os = new FileOutputStream("test.xls");
Workbook wb = new HSSFWorkbook();) {
Sheet sh = wb.createSheet("test");
Row r = sh.createRow(0);
for (int i = 0; i < 50; i++) {
Cell c = r.createCell(i);
c.setCellValue(i + 1);

CellStyle cs = wb.createCellStyle();
cs.setFillBackgroundColor(IndexedColors.WHITE.index);
cs.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cs.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());
c.setCellStyle(cs);
}
wb.write(os);
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
MS Excel 2019 查看的结果
Viewed by MS Excel
如您所见,样式/格式在第 43 个单元格之后丢失。
但是,当我通过 XLS Viewer Free(来自 Microsoft Store)或 Google Sheets(在线)等其他应用程序打开相同的文件时,样式/格式仍然存在并且显示良好。
Viewed by XLS Viewer Free
Viewed by Google Sheets
谁能告诉我这里发生了什么?
我错过了代码中的某些内容吗?
MS Excel 中是否有任何隐藏设置会导致此问题?
谢谢你。

最佳答案

使用apache poi 为每个单元格创建单元格样式不是一个好主意。 .单元格样式存储在 Excel 中的工作簿级别。如果可能,工作表和单元格共享单元格样式。
在所有 Excel 版本中,不同单元格样式的最大数量都有限制。二进制 *.xls 的限制小于 OOXML *.xlsx 的值.
限制本身不能成为你得到结果的唯一原因。但似乎 Excel 对工作簿中 50 种完全相同的单元格样式不太满意。这些都是内存浪费,因为所有 50 个单元格都共享相同的样式,因此只需要一种共享样式。
解决方案是:
在单元格创建循环之外的工作簿级别上创建单元格样式,并且仅将样式设置为循环中的单元格。
例子:

 private static void exportXlsCorrect() {
try (
OutputStream os = new FileOutputStream("testCorrect.xls");
Workbook wb = new HSSFWorkbook();) {

CellStyle cs = wb.createCellStyle();
cs.setFillBackgroundColor(IndexedColors.WHITE.index);
cs.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cs.setFillForegroundColor(IndexedColors.LIGHT_BLUE.getIndex());

Sheet sh = wb.createSheet("test");
Row r = sh.createRow(0);
for (int i = 0; i < 50; i++) {
Cell c = r.createCell(i);
c.setCellValue(i + 1);

c.setCellStyle(cs);
}
wb.write(os);
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
有时在创建单元之前实际上不可能知道所有可能需要的单元样式。那么 CellUtil可以使用。这有一个方法 CellUtil.setCellStyleProperties它能够为单元格设置特定的样式属性。只有在需要时才会在工作簿级别创建新的单元格样式。如果已经存在,则使用当前的单元格样式。
例子:
 private static void exportXlsUsingCellUtil() {
try (
OutputStream os = new FileOutputStream("testUsingCellUtil.xls");
Workbook wb = new HSSFWorkbook();) {

Sheet sh = wb.createSheet("test");
Row r = sh.createRow(0);
for (int i = 0; i < 50; i++) {
Cell c = r.createCell(i);
c.setCellValue(i + 1);

java.util.Map<java.lang.String,java.lang.Object> properties = new java.util.HashMap<java.lang.String,java.lang.Object>();
properties.put(org.apache.poi.ss.util.CellUtil.FILL_BACKGROUND_COLOR, IndexedColors.WHITE.index);
properties.put(org.apache.poi.ss.util.CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.LIGHT_BLUE.getIndex());
properties.put(org.apache.poi.ss.util.CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
org.apache.poi.ss.util.CellUtil.setCellStyleProperties(c, properties);

}
wb.write(os);
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}

关于java - Excel 97-2003 (.xls) 中的单元格样式丢失或不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71412798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com