C# OpenXML SDK 基于字体大小的列宽

C# OpenXML SDK Column width based on font size

所以基本上我正在尝试修复列的宽度,我正在使用以下代码,

private double GetWidth(string text)
    {
        //width = Truncate([{Number of Characters} * {Maximum Digit Width} + {5 pixel padding}]/{Maximum Digit Width}*256)/256
        var width = Math.Truncate((text.Length * _maxDigitWidth + 5) / _maxDigitWidth * 256) / 256;
        return width < _minCellWidth ? _minCellWidth : width;
    }

代码的工作就像首先在特定列中找到最大的文本内容,然后根据该文本的长度计算列的宽度。 上面的代码适用于特定的字体大小,例如当字体大小为 11 时。并且 _maxDigitWidth = 7.

所以问题是当我将字体大小增加到 16 或以上时,上面的代码没有计算出正确的宽度。

This is the result what I am getting

And this is the result what I need

同样在我的代码中,我也可以像这样传递 fontSize

private double GetWidth(string text, double longestCellWidth)
    {
        //width = Truncate([{Number of Characters} * {Maximum Digit Width} + {5 pixel padding}]/{Maximum Digit Width}*256)/256
        var width = Math.Truncate((text.Length * _maxDigitWidth + 5) / _maxDigitWidth * 256) / 256;
        return width < _minCellWidth ? _minCellWidth : width;
    }

请帮我解决问题。

提供的代码部分不足以提供有用的答案,但我会尽力帮助您,因为它与 OpenXML SDK 相关。

您的代码没有根据字体大小更改列宽,因为在计算列宽时,您没有考虑字体大小。

您正在根据文本长度计算宽度。

您的代码在 calibri 字体大小为 11 之前都可以正常工作。对于字体大小大于 11 且字体系列 Calibri 的单元格宽度的动态大小,您可以使用此代码。

    private double GetWidth(string text, double longestCellWidth)
    {
        if (longestCellWidth <= 11)
        {
            var width = Math.Truncate(Convert.ToDouble((text.Length * 7 + 5)) / 7 * 256) / 256;
            return width;
        }
        else
        {
            var width = Math.Truncate(Convert.ToDouble((text.Length * 7 + 5)) / 7 * 256) / 256;
            var lengthAdjustment = width + text.Length - 4;
            var sizeAdjustment = lengthAdjustment + longestCellWidth / 3;
            return sizeAdjustment;
        }
    }

下面是代码的解释。我观察到

when we increase the text length by 1, our width is supposed to increase by 1.

And, for every 3 points increase in our font size, our width is supposed to be increased by 1.

我在代码中实现了观察,并用不同的例子对其进行了测试。它当然不是“最有效的解决方案”,但做得很好!随意根据您的需要进行更改。