【问题标题】:Apache POI autosizing a percent formatted cellApache POI 自动调整百分比格式的单元格
【发布时间】:2014-04-19 03:14:43
【问题描述】:

我在自动调整单元格大小时遇到​​了一些问题。在我的程序相应地填充和格式化每个单元格后,它会自动调整单元格大小以使其看起来在视觉上可以接受。问题是,当单元格被格式化为百分比时,它会自动调整单元格的大小,而不考虑存在“%”字符的事实,因此我们最终会在单元格上得到####,直到您展开单元格。有没有办法在考虑额外的 '%' 字符的同时自动调整它的大小?

编辑:

所以这就是发生的情况,无论出于何种原因,左侧的 VAR 已正确自动调整大小,但右侧的 VAR 没有。

EDIT2:

我注意到这种情况仅在单元格值为 0.00% 时发生,因此具有 #### 的 VAR 列中的所有值都是 0,而 VAR 左列中的一些值是非零。

【问题讨论】:

    标签: java excel apache-poi


    【解决方案1】:

    虽然这可能不是一个理想的解决方案,但一种可能性是获取要插入单元格的字符串的大小(即“50.00%”= 6 的大小),并根据手动设置单元格宽度那个。

    【讨论】:

    • 我也考虑过这个解决方案,但我不得不绕道而行,这样做似乎是错误的。但是,如果 apache poi 没有提供这样做的方法,那么这似乎是我唯一的选择:(
    【解决方案2】:

    恐怕这在 Apache POI 中不受支持,因为它在尝试计算列宽时忽略了自定义单元格格式(它只考虑字体特征和旋转,但不考虑 DataFormat)。

    作为一种解决方法,您可以尝试编写自定义 autoSizeColumn 方法作为对当前实现的方法的修改,即:

       public void autoSizeColumn(Sheet sheet, int column, int plusMinusChars) {
            double width = SheetUtil.getColumnWidth(sheet, column, false);
    
            if (width != -1) {
                width += plusMinusChars;
                width *= 256;
                int maxColumnWidth = 255*256; // The maximum column width for an individual cell is 255 characters
                if (width > maxColumnWidth) {
                    width = maxColumnWidth;
                }
                sheet.setColumnWidth(column, (int)(width));
            }
    
        } 
    

    然后你可以用一个额外的'%'字符来调用它来打印出来:

    //4th column autosized + 1 character in width to accomodate for '%'
    autoSizeColumn(sheet, 3, 1);
    

    【讨论】:

    • Apache POI 确实在自动调整大小时尝试考虑应用于单元格的格式,请参阅around line 154 of SheetUtil
    • 这只是部分正确,而 getCellWidth 函数正确使用格式化程序,getColumnWidth 函数强制它成为默认(空白)之一(参见第 203 行)。我相信这个决定是基于DataFormat可以通过单元格的数据格式、默认的行数据格式或列数据格式来定义的事实,这将使应用格式的整个决策过程相当复杂。
    • A DataFormatter 对象仍会根据单元格所属的 Workbook 查找格式字符串,因此您误解了第 203 行。请注意,仍然可能存在错误,但是它应该工作...如果您有一个显示问题的测试用例,请将其报告给the Apache POI project!
    • 我明天有测试用例时会提供截图@Gagravarr
    • 我刚刚尝试了 3.10,并且 0 值的 0.00% 格式的列已正确自动调整大小。您能看出您的案例与stackoverflow23114397 unit test 有何不同吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多