Я на самом деле попросил SpreadsheetGear поддержать это, поскольку я строил свою реализацию около 6 месяцев назад. Я упомянул, что 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;
я подозревал что-то подобное, не будучи уверенным, спасибо за очистку это.. –