Как получить 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.