如何获得SpreadsheetGear.IRange.AutoFit()为每列提供正确的宽度?

时间:2012-06-01 17:47:48

标签: spreadsheetgear

我使用Spreadsheetgear生成Excel工作簿。

我的工作簿非常简​​单:

  • 我在单元格中插入字符串
  • 第一行是Bold
  • 我在标题和列之间绘制边框。

在流程结束时,我调用myRange.Columns.AutoFit(),然后保存工作簿。

当我用Excel打开它时,自动调整功能几乎不错,但它仍然会错过每列中大约1.2个宽度单位。

这是AutoFit()实施中的错误还是我错过了什么?

3 个答案:

答案 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;
        }
    }