2017-09-15 6 views
1

Ich erstelle eine XLSX mit OpenXML SDK-Datei und ich bin eine benutzerdefinierte Spaltenbreite Angabe:Benutzerdefinierte Spaltenbreite in OpenXML vs MS Excel

using (SpreadsheetDocument spreadsheet = SpreadsheetDocument.Create("Book1.xlsx", SpreadsheetDocumentType.Workbook)) 
{ 
    WorkbookPart workbookPart = spreadsheet.AddWorkbookPart(); 
    workbookPart.Workbook = new Workbook(); 

    WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); 
    worksheetPart.Worksheet = new Worksheet(); 

    spreadsheet.WorkbookPart.Workbook.AppendChild<Sheets>(
     new Sheets(
      new Sheet() { Id = spreadsheet.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" })); 

    worksheetPart.Worksheet.Append(
     new Columns(
      new Column() { Min = 1, Max = 1, Width = 15, CustomWidth = true }), 
     new SheetData()); 

    workbookPart.Workbook.Save(); 
} 

Aber wenn ich die resultierende „Mappe1 öffnen .xlsx“Datei in MS Excel und prüfen sie den Wert der Spalte, es zeigt:

Breite: 14,29 (105 Pixel)

auch, wenn ich gesetzt der Wert der Spalte mit MS Excel:

Breite: 15 (110 Pixel)

Und dann diesen Wert mit OpenXML SDK las ich ~ 15,711 bekommen.
Die Frage ist warum, warum ist es anders?

+0

Ich habe ein paar Fragen dazu in SO gelesen. Dies scheint ein Fehler im SDK zu sein. Ich bin noch nicht auf eine Lösung für dieses Problem gestoßen – Zac

+0

Können Sie mir Links zu einigen dieser Abfragen senden, so dass ich sie auschecken kann? Ich konnte sie nicht finden, ich sehe nur Beiträge, die sich auf die Definition der Spaltenbreite beziehen und sich auf die automatische Anpassung beziehen. Ich bin mir auch nicht sicher, ob dies ein Fehler in SDK oder ein Fehler in MS Excel ist, weil intern die XLSX-Datei den richtigen Wert innerhalb (15) gespeichert hat, aber MS Excel zeigt diesen Wert mit einem leichten Anstieg (~ 15.711) . Wenn überhaupt, dann scheint mir das ein Fehler in MS Excel zu sein. – NixonUposseen

Antwort

1

Die Differenz kann aufgrund mehrerer Variablen auftreten, die berücksichtigt werden, wenn MS Excel die Spaltenbreite berechnet (was beim Laden und bei Änderung geschieht); Die Schriftarteneinstellungen des Normalstils, die DPI-Einstellungen des Geräts, die Linealeinheit des MS Excel usw.

In Bezug auf die von JimSnyder bereitgestellte Formel ist zu beachten, dass MS Excel eine etwas andere Spaltenbreitenberechnung als die vom Standard angegebene aufweist here.

1

Dies ist von Vincent Tan Buch SpreadsheetOpenXmlFromScratch:

// This is taken from the documentation for Column.Width in help file for Open XML SDK 
// Truncate([{Number of Characters} * {Maximum Digit Width} + {5 pixel padding}]/{Maximum Digit Width} * 256)/256 
fTruncWidth = Math.Truncate((sILT.ToCharArray().Count() * fMaxDigitWidth + 5.0)/fMaxDigitWidth * 256.0)/256.0; 

Die Formel sollte die Breite, die Sie benötigen. Warum es anders ist, würde ich am besten die Schriftpunkte in Fensterpixel umwandeln.