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 は、このタイプのシナリオとより一貫性があります。

とにかく、列幅に少し「ごまかし要因」を追加する方法は、私たちが提案できる最善の回避策です. これは「ハック」ですが、2 つの異なる環境と 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 に答える