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.
我在代码中实现了观察,并用不同的例子对其进行了测试。它当然不是“最有效的解决方案”,但做得很好!随意根据您的需要进行更改。
所以基本上我正在尝试修复列的宽度,我正在使用以下代码,
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.
我在代码中实现了观察,并用不同的例子对其进行了测试。它当然不是“最有效的解决方案”,但做得很好!随意根据您的需要进行更改。