无法准确设置Excel列宽Apache POI



这是我的代码(Java(

sheet.setColumnWidth(0, 100 * 256);

我希望生成的excel的第1列的宽度为100。但excel中的实际宽度是99.22。搜索引擎没有提供一个合理的解释,可以帮助任何人。

在Excel中,列宽100表示默认字体和默认字体大小的100个默认字符适合单元格。因此,宽度100的具体值随默认字体和默认字体大小而变化。默认字体和默认字体大小由"主页"选项卡"样式"组中的单元格样式"正常"给定。

在存储器中,Excel存储具有额外填充的宽度。因此,coulln-widt 100并不是精确地存储为100,而是存储为100+填充。但是,不同的默认字体和使用的默认字体大小的填充也不同。

使用XSSF(Office Open XML格式(的Apache POI将字体Calibri和字体大小11作为默认值。这些也是Excel使用的默认值。所以ApachePOI的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中使用宋体和font-size11作为默认值,则应在Excel中将列宽设置为恰好100。

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

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

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

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

这个excel列宽符合预期,但我仍然不知道为什么

最新更新