6

我使用 Spreadsheetgear 生成 Excel 工作簿。

我的工作簿很简单:

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

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

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

这是AutoFit()实现中的错误还是我遗漏了什么?

4

3 回答 3

10

实际上,在大约 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;
于 2012-11-02T18:09:45.940 回答
3

基于@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;
        }
    }
于 2017-01-12T22:54:38.160 回答
2

您可能需要将 SpreadsheetGear 升级到最新版本。我已经安装了SpreadsheetGear 2008,但我在使用AutoFit() 时遇到了很多问题。阅读 SpreadsheetGear2010 的变更日志http://www.spreadsheetgear.com/downloads/whatsnew.aspx,您会看到此版本中发生了几次 AutoFit 重构。

于 2012-10-19T19:55:46.210 回答