【问题标题】:Can not accurately set Excel column width Apache POI无法准确设置 Excel 列宽 Apache POI
【发布时间】:2021-11-26 19:09:20
【问题描述】:

这是我的代码 (Java)

sheet.setColumnWidth(0, 100 * 256);

我希望生成的 excel 的第 1 列的宽度为100。但是 excel 中的实际宽度是 99.22 。搜索引擎没有给出合理的解释,谁能帮忙。

【问题讨论】:

  • @AxelRichter 我试了一下,但没有得到预期的结果,还是谢谢
  • 使用默认 Excel 和默认字体 Calibri 11 为我工作。如果我设置 int widthExcel = 100;,我得到的第一列的宽度正好是 100。你试过什么?你得到什么结果?什么apache poi版本?什么Excel版本?使用什么默认字体?

标签: java apache-poi


【解决方案1】:

在 Excel 中,列宽 100 表示默认字体和默认字体大小的 100 个默认字符适合单元格。因此,宽度 100 究竟是如何随默认字体和默认字体大小而变化的。默认字体和默认字体大小由“主页”选项卡中“样式”组中给出的单元格样式“正常”给出。

在存储中,Excel 存储具有额外填充的宽度。所以 coulmn widt 100 不完全存储为 100 而是存储为 100 + 填充。但是对于不同的默认字体和使用的默认字体大小,填充也不同。

使用XSSF(Office Open XML 格式)的 Apache POI 将字体 Calibri 和字体大小 11 作为默认值。这些也是 Excel 使用的默认值。所以 Apache POI 的Units.DEFAULT_CHARACTER_WIDTH 是默认字体的默认字符宽度,大小为 11。

所以使用以下列宽设置:

...
   int widthExcel = 100;
   int width256 = (int)Math.round((widthExcel*Units.DEFAULT_CHARACTER_WIDTH+5f)/Units.DEFAULT_CHARACTER_WIDTH*256f);
   sheet.setColumnWidth(0, width256);
...

如果 Excel 在单元格样式 Normal 中使用字体 Calibri 和字体大小 11 作为默认值,则应在 Excel 中将列宽设置为 100。

使用其他默认值,计算中的Units.DEFAULT_CHARACTER_WIDTH 必须替换为其他默认字符宽度。

【讨论】:

    【解决方案2】:

    我修改了我的代码(我从这里得到它https://blog.csdn.net/ab411919134/article/details/17606399):

    sheet.setColumnWidth(0, (int) ((100 + 0.73) * 256));
    

    帖子提到应该是0.72,但0.73对我来说是正确的

    这个excel列宽符合预期,但还是不知道为什么

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多