2012-06-01 4 views
5

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

Мои Workbook очень просто:

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

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

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

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

ответ

6

Я на самом деле попросил 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; 
+0

я подозревал что-то подобное, не будучи уверенным, спасибо за очистку это.. –

2

Возможно, вы захотите обновить электронную таблицу до последней версии. Я установил SpreadsheetGear 2008, и у меня было много проблем с AutoFit(). Прочтите журнал изменений для SpreadsheetGear2010 http://www.spreadsheetgear.com/downloads/whatsnew.aspx, и вы увидите, что в этом выпуске произошло несколько рефакторингов AutoFit.

+0

Это решает многие проблемы, но не мой: = (Тх любом случае –

1

Основываясь на ответ от @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; 
     } 
    } 
Смежные вопросы