我使用 Spreadsheetgear 生成 Excel 工作簿。
我的工作簿很简单:
- 我在单元格中插入字符串
- 第一行是粗体
- 我在标题周围和列之间绘制边框。
在该过程结束时,我调用myRange.Columns.AutoFit()
,然后保存工作簿。
当我用 Excel 打开它时,自动调整几乎很好,但它仍然错过了每列中大约 1.2 个宽度单位。
这是AutoFit()
实现中的错误还是我遗漏了什么?
我使用 Spreadsheetgear 生成 Excel 工作簿。
我的工作簿很简单:
在该过程结束时,我调用myRange.Columns.AutoFit()
,然后保存工作簿。
当我用 Excel 打开它时,自动调整几乎很好,但它仍然错过了每列中大约 1.2 个宽度单位。
这是AutoFit()
实现中的错误还是我遗漏了什么?
实际上,在大约 6 个月前我正在构建我的实现时,我实际上询问了 SpreadsheetGear 的支持。我提到 b/c 他们的 AutoFit() 并不完全正确,我不得不在自动调整大小后为每一列添加一个“软糖因子”。支持人员的回应基本上是,这是与 Excel 的一个已知差异,他们没有将其归类为错误。以下是他们必须对我说的话:
SpreadsheetGear 和 Excel 之间的自动调整列略有不同的原因是 .NET 和 GDI+ 提供给我们的字体指标与 Excel 中使用的不同。由于列尺寸与工作簿中使用的字体相关联,因此字体指标与 Excel 完全匹配是不可能的,不幸的是。我们尽最大努力匹配 Excel,但不可能在所有情况下都完全匹配。
有趣的是,Excel 实际上与他们的字体度量计算非常不一致;尝试使用 SpreadsheetGear 创建一个包含大量文本的工作簿,可能会在一个单元格中添加 40-50 个“a”字符。现在将该工作簿保存到磁盘并在 Excel 2007 或 2010 中打开它,使用右下角的缩放滑块在不同点放大和缩小,并注意文本相对于列宽发生了相当大的移动。SpreadsheetGear 更符合这种情况。
无论如何,您在列宽上添加一点“软糖因子”的方法是我们可以建议的最佳解决方法。这是“骇人听闻的”,但我们根本无法改进它,因为您要处理两种不同的环境以及 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;
基于@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;
}
}
您可能需要将 SpreadsheetGear 升级到最新版本。我已经安装了SpreadsheetGear 2008,但我在使用AutoFit() 时遇到了很多问题。阅读 SpreadsheetGear2010 的变更日志http://www.spreadsheetgear.com/downloads/whatsnew.aspx,您会看到此版本中发生了几次 AutoFit 重构。