首先我们需要确定 Excel 如何进行转换(因为我们在 Excel 应用程序中手动更改大小):
//Use 7d to promote to double, otherwise int will truncate.
ExcelWidth = (Pixels - 12) / 7d + 1;//From pixels to inches.
警告:公式不适用于 0(零)宽度或像素。
对于这些情况,请使用“if”语句检查是否为零并返回零。
它也让我陷入了困境。我没有尝试计算每个宽度的像素数,而是查看了每个宽度整数之间的像素差异,发现它始终为 7。例外是 0 到 1 宽度;其中 Width 1.00 有 12 个像素。从那里我能够想出上面的公式,很容易。
现在这些数字在 Excel 世界中仍然有效,但如果您直接在 OpenXml 文档中设置列宽,情况就略有不同了。原因如下:在您链接到的文档中,关于 5 个像素是这样说的:
有 4 个像素的边距填充(每边两个),外加 1 个像素的网格线填充。
现在这意味着 Excel 假设您已将这 5 个像素计入您提供的宽度。当您在 excel 中打开文档并调整列大小时,您会看到宽度比您设置的宽度小 5 个像素。
要对此进行调整,您可以按如下方式更新公式:
//Use 7d to promote to double, otherwise int will truncate.
OpenXmlWidth = (Pixels - 12 + 5) / 7d + 1;//From pixels to inches.
这回答了您问题的标题:
“将 .NET 像素转换为 OpenXML 格式的 Excel 宽度的公式”
如果您想知道如何计算列宽的近似值以根据单个单元格的内容(和字体)自动适应列,那么这是一个完全不同的问题。您提供的 microsoft 链接提供的公式将不起作用。在一个单元格中输入 10 个句点,在另一列中输入 10 个大写字母 M。您将看到自动调整分别为您提供 41 像素和 129 像素。 ms 提供的公式没有考虑单个字符的宽度。换一种说法;他们派你去追逐野鹅。
自动调整列的唯一方法是扫描列中的每一行并根据使用的字符和字体计算文本的宽度。你会使用我发现的here。然后取它的最大值并用 5 填充。在 Web 环境中处理电子表格时,我会避免这种方法,因为您可能会导出数十万行和数十列 - 你明白了。最好的方法是为您的列设置最佳猜测宽度,并培训您的用户如何从 excel 中自动调整。
此致
“普通人”
编辑 - 2011 年 10 月 26 日:
因为我感觉很慷慨,这里有一个示例,说明如何为您的列获取 近似 宽度。我宁愿避免对列中的所有行执行此操作,所以让我们将宽度(默认情况下)基于标题单元格中的值。下面是如何使用我之前链接到的示例来执行此操作。注意:这些是近似值,但足够接近。
using System.Drawing;
using System.Windows.Forms;//Add Reference. Test on webserver first.
Font font = new Font("Calibri", 11.0f, FontStyle.Regular);
string header = "Hello There World!";
int pxBaseline = TextRenderer.MeasureText("__", font).Width;
int pxHeader = TextRenderer.MeasureText("_" + header + "_"), font).Width;
int pxColumnWidth = pxHeader - pxBaseline + 5;//Pad with 5 for Excel.
警告:如果您在使用 OpenXml 的同一位置使用此代码,那么您可能需要删除 System.Drawing 的“使用”并完全限定“字体”和“字体样式” " 作为 System.Drawing.Font 和 System.Drawing.FontStyle。否则您的编译器可能会将这些类误认为属于 DocumentFormat.OpenXml.Spreadsheet 。