2016-10-17 4 views
0

Ich versuche, die Breite einiger Excel-Spalten zu ändern. Ich habe alles versucht, aber wir halten leere Excel-Dokumente bekommen, meine Excel-Datei funktioniert ohne diesen Zusatz fein:OpenXML Benutzerdefinierte Spaltenbreite funktioniert nicht

Columns columns = new Columns(); 

columns.Append(new Column() { Min = 1, Max = 3, Width = 20, CustomWidth = true }); 
columns.Append(new Column() { Min = 4, Max = 4, Width = 30, CustomWidth = true }); 

wsPart.Worksheet.Append(columns); 

Aber sobald ich hinzufügen diese like this user suggested, muß ich meine Excel-Datei reparieren, und es wird leer. Ich erhalte diesen Fehler: "Ersetzter Teil: /xl/worksheets/sheet.xml Teil mit XML-Fehler. Ladefehler. Zeile 1, Spalte 0. ". Und die 'reparierte' Datei ist leer.

Mein Code ist im Grunde das gleiche wie das von der MSDN example

ich viele verschiedene Möglichkeiten zum Ändern der Spaltenbreite versucht haben, so dass ich denke, das Problem liegt woanders. Ich kann nicht herausfinden, was falsch ist.

EDIT: Voll Code

_document = SpreadsheetDocument.Create(newFileName, SpreadsheetDocumentType.Workbook); 

_workbookPart = _document.AddWorkbookPart(); 
_workbookPart.Workbook = new Workbook(); 

WorksheetPart worksheetPart = _workbookPart.AddNewPart<WorksheetPart>(); 
worksheetPart.Worksheet = new Worksheet(new SheetViews(new SheetView { WorkbookViewId = 0, ShowGridLines = new BooleanValue(false) }), new SheetData()); 

_document.WorkbookPart.Workbook.AppendChild(new Sheets()); 

Sheet sheet = new Sheet { Id = _document.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" }; 
_workbookPart.Workbook.Sheets.Append(sheet); 


WorkbookStylesPart stylesPart = _workbookPart.AddNewPart<WorkbookStylesPart>(); 
stylesPart.Stylesheet = CreateStylesheet(); 
stylesPart.Stylesheet.Save(); 

Columns columns = new Columns(); 

columns.Append(new Column() { Min = 1, Max = 3, Width = 20, CustomWidth = true }); 
columns.Append(new Column() { Min = 4, Max = 4, Width = 30, CustomWidth = true }); 

worksheetPart.Worksheet.Append(columns); 

_sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); 
+0

Sie müssen das Blatt speichern, nachdem Sie die Spaltenbreite geändert haben. – rach

+0

Ich habe das getan, hat nicht geholfen – Litrico

+0

Können Sie bitte alle Ihren Code posten? Das OpenXml-Schema definiert eine Reihenfolge für die Elemente - ich nehme an, Sie fügen nur die 'Spalten' an der falschen Stelle relativ zu anderen Elementen hinzu ... – petelids

Antwort

3

Die Reihenfolge der Elemente ist aus leicht. Die Columns sollte vor der SheetData statt nach platziert werden. Der relevante Teil des XML-Schemas für ein Arbeitsblatt ist:

<xsd:complexType name="CT_Worksheet"> 
    <xsd:sequence> 
    <xsd:element name="sheetPr" type="CT_SheetPr" minOccurs="0" maxOccurs="1"/> 
    <xsd:element name="dimension" type="CT_SheetDimension" minOccurs="0" maxOccurs="1"/> 
    <xsd:element name="sheetViews" type="CT_SheetViews" minOccurs="0" maxOccurs="1"/> 
    <xsd:element name="sheetFormatPr" type="CT_SheetFormatPr" minOccurs="0" maxOccurs="1"/> 
    <xsd:element name="cols" type="CT_Cols" minOccurs="0" maxOccurs="unbounded"/> 
    <xsd:element name="sheetData" type="CT_SheetData" minOccurs="1" maxOccurs="1"/> 

Code zu beheben Sie könnten entweder die SheetData von Ihrer new Worksheet Linie entfernen und die SheetData nach den Columns hinzufügen:

worksheetPart.Worksheet = new Worksheet(new SheetViews(new SheetView { WorkbookViewId = 0, ShowGridLines = new BooleanValue(false) })); 

//....code omitted for brevity 

Columns columns = new Columns(); 

columns.Append(new Column() { Min = 1, Max = 3, Width = 20, CustomWidth = true }); 
columns.Append(new Column() { Min = 4, Max = 4, Width = 30, CustomWidth = true }); 

worksheetPart.Worksheet.Append(columns); 
worksheetPart.Worksheet.Append(new SheetData()); 

ODER Sie könnte den new Worksheet Code unverändert lassen und die InsertBefore Methode verwenden, wenn die Columns hinzugefügt wird, um sie vor dem SheetData einzufügen:

Eine andere Sache zu beachten - Sie sollten die SpreadsheetDocument.Create in einer using-Anweisung wickeln. Dadurch werden alle Ressourcen bereinigt und die Datei am Ende Ihrer Änderungen für Sie gespeichert. Zum Beispiel:

using (var _document = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook)) 
{ 
    //all your OpenXml code here... 
} 
+0

Vielen Dank ! Ich habe vergessen, dass ich die Blattdaten dort oben hinzufüge. Ich kann das Benutzerteil nicht machen, weil ich das Excel dynamisch baue, aber es funktioniert jetzt perfekt! – Litrico

+0

Ausgezeichnet, froh, dass ich @Litrico helfen konnte. – petelids

Verwandte Themen