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

2024-02-23

我正在使用 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 查看的结果通过 MS Excel 查看 https://i.stack.imgur.com/krrYl.png

正如您所看到的,样式/格式在第 43 个单元格之后丢失。

但是,当我通过 XLS Viewer Free(来自 Microsoft Store)或 Google Sheets(在线)等其他应用程序打开同一文件时,样式/格式仍然存在并且显示良好。通过免费 XLS 查看器查看 https://i.stack.imgur.com/NYL46.png 通过 Google 表格查看 https://i.stack.imgur.com/sG6Kx.png

谁能告诉我这里发生了什么事吗?

我的代码中遗漏了什么吗?

MS Excel 中是否有任何隐藏设置导致此问题?

谢谢。


使用以下命令为每个单元格创建单元格样式并不是一个好主意apache poi。在 Excel 中,单元格样式存储在工作簿级别。如果可能的话,工作表和单元格共享单元格样式。

所有 Excel 版本中不同单元格样式的最大计数都有限制。二进制的限制*.xls小于 OOXML 的值*.xlsx.

限制本身并不是造成结果的唯一原因。但 Excel 似乎对工作簿中 50 个完全相同的单元格样式不太满意。这些都是内存浪费,因为所有 50 个单元格共享相同的样式,因此只需要一种共享样式。

解决方案是:

在单元格创建循环之外的工作簿级别上创建单元格样式,并且仅将样式设置为循环中的单元格。

Example:

 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 https://poi.apache.org/apidocs/dev/org/apache/poi/ss/util/CellUtil.html可以使用。这个有一个方法CellUtil.setCellStyleProperties它能够为单元格设置特定的样式属性。仅当需要时,才会在工作簿级别创建新的单元格样式。如果已经存在,则使用当前的单元格样式。

Example:

 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();
  }
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Python - 使用点列表从网格 NetCDF 中提取数据,无需 for 循环

    以下示例使用东风的 Unidata 样本 netCDF 数据集 可以从这里下载的 https www unidata ucar edu software netcdf examples sresa1b ncar ccsm3 example
  • 使用 Javascript 的 Chromeless 播放器中的全屏选项?

    我正在使用 Youtube Javascript API 来开发 chromeless 播放器 你能告诉我如何在播放器上使用 Javascript 添加 开发 全屏控制 吗 YouTube api 中当前不存在此内容 相反 您可以使用 ja
  • 如何每年自动更改年龄

    我写了这个程序 但我有一个变量 年龄 我该如何做才能不必每年改变狗的年龄 换句话说 它应该自动改变 你应该保存生日 而不是保存年龄 这样可以在需要时计算年龄
  • ng2-charts + 如何自定义X轴标签的位置?

    我在用着https valor software com ng2 charts https valor software com ng2 charts 用于生成以下图表 Expected Graph Actual Graph Right n
  • Jest&material-ui:如何测试特定图标的存在?

    我最近将一个应用程序迁移到我喜欢的 mui v4 还完成了更新我们使用 jest enzyme 运行的测试套件 例如我现在喜欢mount代替shallow 一个问题是我找不到一种方法来测试图标的存在 在撰写本文时 我正在使用所有最新版本的m
  • 如何在进程结束后自动关闭`qemu`的执行?

    我想要的是qemu打开并显示输出后的窗口运行后自动关闭pintOS 就像我运行命令时一样pintos run alarm multiple in tcshshell qemu 显示过程开始 然后一些alarm notifications然后
  • 无法找到 ASP.NET CodeDom 提供程序错误

    我在服务器上部署时遇到 ASP NET 错误 无法找到 CodeDom 提供程序类型 Microsoft CodeDom Providers DotNetCompilerPlatform CSharpCodeProvider Microso
  • 如何使用 LaunchDaemons (launchd) 启动 Program.app?

    我放置了以下内容com apple test plist文件夹中的文件 系统 库 LaunchDaemons
  • 跨服务器SQL

    我想将数据从一台服务器的数据库移植到另一台服务器的数据库 这两个数据库都位于不同的 mssql 2005 服务器上 复制可能不是一个选项 因为目标数据库是按 时间间隔 从头开始生成的 我最好会做类似的事情 insert from db1 t
  • 如何使用 Razor 引擎在 MVC 5 项目上添加日期选择器 Bootstrap 3?

    我需要一些关于如何安装的指南日期选择器 http eternicode github io bootstrap datepicker 使用 Razor 引擎的 MVC 5 项目上的 Bootstrap 3 我找到了这个链接here http
  • Matplotlib Figsize 不受尊重[重复]

    这个问题在这里已经有答案了 我想用 matplotlib 绘制一个正方形图 也就是说 我希望整个图形是正方形的 当我使用以下代码时 生成的图像的宽度仍然比高度大一点 为什么 matplotlib 不尊重我提供的 Figsize import
  • 当我们有客户端会话时,为什么需要 JWT?

    据我所知 JWT 是无状态令牌 它存储有关客户端声明的签名信息 并通过授权 HTTP 标头传递到服务器 我的问题是 当我们已经有了客户端会话时 为什么还需要 JWT https github com mozilla node client
  • 将数字转换为时间

    如何将数字 1 33408564814814 转换为时间 32 01 05 如果您确实想要结果作为字符串 您可以使用如下函数 set serveroutput on format wrapped declare function days
  • HDFS 文件系统的 URL

    我在 HDFS 中有一些数据 user Cloudera Test 我可以通过运行很好地查看记录hdfs dfs cat Test 现在同一个文件 我需要在 scala 中将其读取为 RDD 我在 scala shell 中尝试了以下操作
  • 如何在pyspark中将DenseMatrix转换为spark DataFrame?

    除了以下使用 Scala 的示例之外 我没有找到任何 pyspark 代码将矩阵转换为 Spark 数据帧 有谁知道如何使用 python 代替 如何将 mllib 矩阵转换为 Spark 数据帧 https stackoverflow c
  • Activity.finish() 已调用,但 Activity 仍加载在内存中

    当我在调试器上运行我的应用程序时 我得到主线程和 3 个活页夹线程 单击按钮 我拨打电话Activity finish 看起来它会在 UI 关闭并返回主屏幕时结束 Activity 但是 在调试器中 它仍然将主线程和 3 个绑定器线程显示为
  • 如何在AWS Lambda中加载npm模块?

    我使用基于 Web 的编辑器创建了多个 Lambda 函数 到目前为止 一切都很好 我现在想开始使用模块扩展这些模块 例如 Promise 的 Q 我不知道如何将模块发送到 Lambda 以便我的函数可以使用它们 我已读完在 AWS Lam
  • 在项目中使用同一 DLL 的不同版本

    在我的项目中我必须使用不同版本的AWSSDKdll的 为了做到这一点我采取了帮助这个帖子 https stackoverflow com questions 2460542 using different versions of the s
  • SQL 将字符串(日期或文本)转换为日期

    我有一个数据库 其中有一列名为stringNextDue包含日期 英国格式 和文本 例如 逾期 已完成 等数据 我正在尝试创建一个视图 显示从现在起一个月内到期的课程 WHERE CONVERT DATETIME mt stringNext
  • Excel 97-2003 (.xls) 中的单元格样式丢失或不显示

    我正在使用 Apache POI 库将数据导出到 Excel 我已经尝试了所有最新版本 3 17 4 1 2 和 5 2 1 我在使用 Excel 97 xls 格式时遇到与单元格样式相关的问题 在一定数量的列之后 单元格样式会以某种方式丢