Как получить SpreadsheetGear.IRange.AutoFit() дать правильную ширину для каждого столбца?

Я использую Spreadsheetgear для создания книги Excel.

Моя Рабочая тетрадь очень проста:

  • Я вставляю строки в ячейках
  • Первая строка выделена жирным шрифтом
  • Я рисую границы вокруг заголовков и между столбцами.

В конце процесса я звоню myRange.Columns.AutoFit()Затем я сохраняю книгу.

Когда я открываю его в Excel, автоподбор почти хорош, но в каждом столбце по-прежнему не хватает около 1,2 единиц ширины.

Это ошибка в AutoFit() реализация или я что-то упустил?

3 ответа

Решение

На самом деле я обратился в службу поддержки SpreadsheetGear, когда строил свою реализацию около 6 месяцев назад. Я упомянул, что b/c их AutoFit() не совсем точно подходил, что мне приходилось добавлять "коэффициент выдумки" в каждый столбец после автоподбора. Ответ службы поддержки в основном заключался в том, что это было известное несоответствие с Excel, которое они не классифицируют как ошибку. Вот что они сказали мне:

Причина, по которой столбцы автоматического подбора немного отличаются между SpreadsheetGear и Excel, заключается в том, что метрики шрифтов, предоставляемые нам.NET и GDI+, отличаются от тех, которые используются в Excel. Поскольку размеры столбцов привязаны к шрифтам, используемым в книге, и, следовательно, к метрикам шрифтов, попытка точно подобрать Excel, к сожалению, невозможна. Мы прилагаем все усилия, чтобы соответствовать Excel, но невозможно точно соответствовать им во всех случаях.

Интересно, что Excel на самом деле весьма несовместим с их вычислениями метрики шрифта; попробуйте с помощью SpreadsheetGear создать рабочую книгу с длинными сериями текста, возможно, добавив в ячейку 40-50 символов "а". Теперь сохраните эту книгу на диск и откройте ее в 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.

Другие вопросы по тегам