是否有可能使用.Net或OpenXml框架计算Excel列的宽度,而不使用System.Drawing对象Graphics和Bitmap?

我正在开发一个类,它允许用户在运行中使用OpenXML api创buildExcel电子表格,我需要计算列宽,以便自动适应列中最宽的单元格。

我有以下代码来计算每列的宽度(使用从这里和本教程中的公式):

private double CalculateColumnWidth(int textLength) { var font = new System.Drawing.Font("Calibri", 11); float digitMaximumWidth = 0; using(var graphics = Graphics.FromImage(new Bitmap(200, 200))) { for(var i = 0; i < 10; ++i) { var digitWidth = graphics.MeasureString(i.ToString(), font).Width; if (digitWidth > digitMaximumWidth) digitMaximumWidth = digitWidth; } } return Math.Truncate((textLength * digitMaximumWidth + 5.0) / digitMaximumWidth * 256.0) / 256.0; } 

这工作得很好,唯一的问题是:有什么办法摆脱位图和graphics对象,我真的不需要计算Excel的列宽? 为什么graphics对象需要这样做? Thx提前

“列宽度是以普通样式的字体呈现的数字0,1,2,…,9的最大数字宽度的字符数量来测量的,有4个像素的边距填充(每边两个)加上1网格线的像素填充参考: http : //msdn.microsoft.com/en-us/library/documentformat.openxml.spreadsheet.column.aspx

您需要计算每个数字的宽度0 – 10,并确定哪些宽度最大。 在.Net中完成这个简单的方法是在System.Drawing.Graphics中使用MeasureString,它的一个构造函数需要一个有效的位图。 如果你的主进程包含一个窗口,即你是一个桌面Windows应用程序,你可以使用下面的代码构buildgraphics对象:

 Graphics graphics = Graphics.FromHwnd(Process.GetCurrentProcess().MainWindowHandle) 

也可以使用WPF的System.Windows.Media部分中的类:http://stackoverflow.com/questions/1528525/alternatives-to-system-drawing-for-use-with-asp-net