2012-06-01 16 views
5

Uso Spreadsheetgear para generar un libro de Excel.¿Cómo obtener SpreadsheetGear.IRange.AutoFit() da el ancho correcto a cada columna?

Mi libro de trabajo es muy simple:

  • insertar cadenas en las células
  • La primera línea está en negrita
  • dibujo bordes alrededor de las cabeceras y entre las columnas.

Al final del proceso, llamo al myRange.Columns.AutoFit(), luego guardo el libro de trabajo.

Cuando lo abro con Excel, la función de autoajuste es casi buena, pero todavía pierde alrededor de 1,2 unidades de ancho en cada columna.

¿Esto es un error en la implementación de AutoFit() o me falta algo?

Respuesta

6

De hecho, le pregunté a SpreadsheetGear sobre esto ya que estaba desarrollando mi implementación hace unos 6 meses. Mencioné que b/c su AutoFit() no encajaba exactamente bien, que tenía que agregar un "factor de dulce de azúcar" a cada columna después de la autosizing. La respuesta de soporte fue esencialmente que era una discrepancia conocida con Excel, que no clasifican como un error. Esto es lo que tenían que decir a mí:

La razón de columnas de auto-ajuste ligeramente off entre SpreadsheetGear y Excel es que las medidas de fuente que nos brinda la NET y GDI + difieren de los utilizados en Excel. Debido a que las dimensiones de las columnas están vinculadas a las fuentes utilizadas en el libro de trabajo y, por lo tanto, a las métricas de fuentes, no es posible, por desgracia, intentar hacer coincidir exactamente exactamente Excel. Hacemos todo lo posible para que coincida con Excel, pero es imposible hacer coincidir exactamente en todos los casos.

Curiosamente, Excel es bastante inconsistente con sus cálculos de métricas de fuentes; intente utilizar SpreadsheetGear para crear un libro de trabajo con largas tiradas de texto, tal vez agregando 40-50 caracteres "a" a una celda. Ahora guarde ese libro de trabajo en el disco y ábralo en Excel 2007 o 2010, use su control deslizante de zoom en la esquina inferior derecha para acercar y alejar en diferentes puntos y tenga en cuenta que el texto se mueve un poco en relación con el ancho de la columna. SpreadsheetGear es mucho más consistente con este tipo de escenario.

Independientemente, su método de agregar un poco de "factor de dulce de azúcar" a los anchos de columna es la mejor solución que podemos sugerir. Es "hackish", pero simplemente no hay nada que podamos hacer para mejorarlo, ya que se trata de dos entornos diferentes y una métrica inconsistente en Excel.

Y aquí está el "fudge factor" que utiliza para ensanchar las columnas según sea necesario:

ws.UsedRange.Columns.AutoFit() 
For col As Integer = 0 To ws.UsedRange.ColumnCount - 1 
    ws.Cells(1, col).ColumnWidth *= 1. 
Next 

En C#

ws.UsedRange.Columns.AutoFit() 
for (int col = 0; col < ws.UsedRange.ColumnCount; col++) 
    ws.Cells[1, col].ColumnWidth *= 1.15; 
+0

de todos modos yo sospechaba algo así sin estar seguro Gracias por aclarar esto.. –

2

Es posible que desee actualizar SpreadsheetGear a la última versión. Instalé SpreadsheetGear 2008 y tuve muchos problemas con AutoFit(). Lea el registro de cambios para SpreadsheetGear2010 http://www.spreadsheetgear.com/downloads/whatsnew.aspx y verá que varias refactizaciones de AutoFit han sucedido en esta versión.

+0

Esto resuelve muchos problemas, pero no la mía: = (, TX –

1

Sobre la base de la respuesta de @Stephen ...Excel tiene un límite de ancho de columna de 255, por lo que hizo esto:

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; 
     } 
    } 
Cuestiones relacionadas