我使用Spreadsheetgear生成Excel工作簿。
我的工作簿非常简单:
在流程结束时,我调用myRange.Columns.AutoFit()
,然后保存工作簿。
当我用Excel打开它时,自动调整功能几乎不错,但它仍然会错过每列中大约1.2个宽度单位。
这是AutoFit()
实施中的错误还是我错过了什么?
答案 0 :(得分:8)
我实际上在6个月前构建我的实现时,实际上已经向SpreadsheetGear提供了支持。我提到b / c他们的AutoFit()不完全正确,我必须在自动调整后为每个列添加一个“软糖因子”。 支持者的回应基本上是与Excel的已知差异,他们不将其归类为错误。以下是他们对我说的话:
在SpreadsheetGear和Excel之间略微关闭自动调整列的原因是.NET和GDI +提供给我们的字体指标与Excel中使用的字体指标不同。因为列维度与工作簿中使用的字体相关联,因此字体度量标准,不幸的是,尝试完全匹配Excel是不可能的。我们尽力匹配Excel,但在所有情况下都不可能完全匹配它们。
有趣的是,Excel实际上与字体度量计算非常不一致;尝试使用SpreadsheetGear创建一个包含长文本的工作簿,可能会向单元格添加40-50个“a”字符。现在将该工作簿保存到磁盘并在Excel 2007或2010中打开它,使用右下角的缩放滑块在不同的点放大和缩小,并注意文本相对于列宽相当多地移动。 SpreadsheetGear与这种情况更加一致。
无论如何,您在列宽上添加一点“软糖因子”的方法是我们建议的最佳解决方法。它是“hackish”但是我们无法改进它,因为你在处理两个不同的环境和Excel本身的不一致指标。
这是我用来根据需要扩大列的“软糖因素”:
ws.UsedRange.Columns.AutoFit()
For col As Integer = 0 To ws.UsedRange.ColumnCount - 1
ws.Cells(1, col).ColumnWidth *= 1.
Next
在C#中
ws.UsedRange.Columns.AutoFit()
for (int col = 0; col < ws.UsedRange.ColumnCount; col++)
ws.Cells[1, col].ColumnWidth *= 1.15;
答案 1 :(得分:2)
您可能希望将SpreadsheetGear升级到最新版本。我安装了SpreadsheetGear 2008,我在AutoFit()上遇到了很多问题。阅读SpreadsheetGear2010 http://www.spreadsheetgear.com/downloads/whatsnew.aspx的更新日志,您将看到此版本中发生了多次AutoFit重构。
答案 2 :(得分:1)
基于@Stephen的答案... Excel的列宽限制为255,所以我这样做了:
private static void AutoFitColumns(SpreadsheetGear.IWorksheet worksheet)
{
worksheet.UsedRange.Columns.AutoFit();
const int ExcelMaximumColumnWidth = 255;
const double OneHundredFifteenPercent = 1.15;
for (var i = 0; i < worksheet.UsedRange.ColumnCount; i++)
{
var cell = worksheet.Cells[1, i];
var width = cell.ColumnWidth * OneHundredFifteenPercent;
if (width > ExcelMaximumColumnWidth)
width = ExcelMaximumColumnWidth;
cell.ColumnWidth = width;
}
}