2012-06-01 8 views
5

I Spreadsheetgear verwenden, um eine Excel-Arbeitsmappe zu erstellen.Wie bekomme ich SpreadsheetGear.IRange.AutoFit() die richtige Breite zu jeder Spalte geben?

My Arbeitsbuch ist sehr einfach:

  • I Strings Einfügen in Zellen
  • Die erste Zeile ist Bold
  • I zeichnen Ränder um die Kopf- und zwischen den Säulen.

Am Ende des Prozesses, ich rufe myRange.Columns.AutoFit(), dann speichere ich die Arbeitsmappe.

Wenn ich es mit Excel öffne, ist die Autofit fast schon gut, aber es fehlen immer noch etwa 1,2 Breite Einheiten in jeder Spalte.

Ist dies ein Fehler in AutoFit() Implementierung oder fehle ich etwas?

Antwort

6

Ich fragte tatsächlich SpreadsheetGear Unterstützung darüber, wie ich meine Implementierung vor etwa 6 Monaten baute. Ich erwähnte, dass b/c ihr AutoFit() nicht genau passierte, dass ich nach der Autosizing einen "Fudge-Faktor" zu jeder Spalte hinzufügen musste. Die Antwort des Support war im Wesentlichen, dass es eine bekannte Diskrepanz zu Excel war, die sie nicht als Fehler klassifizieren. Hier ist, was sie hatten mich zu sagen:

Der Grund für die Auto-fit Spalten leicht sein off zwischen SpreadsheetGear und Excel ist, dass die Font-Metriken zu uns zur Verfügung gestellt von .NET und GDI + von denen abweichen, die in Excel. Da die Spaltenbemaßungen mit den in der Arbeitsmappe verwendeten Schriftarten und damit mit den Zeichenkettendiagrammen verknüpft sind, ist es leider nicht möglich, Excel genau zu vergleichen. Wir tun unser Bestes, um Excel zu vergleichen, aber es ist unmöglich, sie in allen Fällen genau zu vergleichen.

Interessanterweise ist Excel tatsächlich ziemlich inkonsistent mit ihren Font-Metrik-Berechnungen; Versuchen Sie es mit SpreadsheetGear, um eine Arbeitsmappe mit langen Textfolgen zu erstellen, die möglicherweise 40-50 "a" -Zeichen zu einer Zelle hinzufügt. Speichern Sie diese Arbeitsmappe jetzt auf der Festplatte und öffnen Sie sie in Excel 2007 oder 2010. Verwenden Sie den Zoom-Schieberegler in der rechten unteren Ecke, um an verschiedenen Stellen ein- und auszuzoomen, und beachten Sie, dass sich der Text relativ zur Spaltenbreite verschiebt. SpreadsheetGear ist mit dieser Art von Szenario viel konsistenter.

Unabhängig davon, Ihre Methode, einen kleinen "Fudge-Faktor" zu den Spaltenbreiten hinzuzufügen, ist die beste Problemumgehung, die wir vorschlagen können. Es ist "hackish", aber es gibt einfach nichts, was wir tun können, um es zu verbessern, da Sie mit zwei verschiedenen Umgebungen und einer inkonsistenten Metriken in Excel selbst zu tun haben.

Und hier ist der "Fudge-Faktor", die ich verwendet, um die Spalten je nach Bedarf zu erweitern:

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

In C#

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

ich so etwas vermutet, ohne sicher zu sein, Dank dieses für Ausräumen.. –

2

Sie können SpreadsheetGear auf die neueste Version aktualisieren. Ich hatte SpreadsheetGear 2008 installiert und hatte viele Probleme mit AutoFit(). Lesen Sie das Changelog für SpreadsheetGear2010 http://www.spreadsheetgear.com/downloads/whatsnew.aspx und Sie werden feststellen, dass in dieser Version mehrere AutoFit-Refactoring-Vorgänge aufgetreten sind.

+0

Diese vielen Fragen löst, aber nicht von mir: = (tx sowieso –

1

Aufbauend auf die Antwort von @Stephen ...Excel verfügt über eine Spaltenbreite Grenze von 255, also tat ich dies:

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