2010-06-24 7 views
5

Ich benutze openxml, um einen Excel-Bericht zu erstellen. Der openxml arbeitet mit einer Template-Excel-Datei, die benannte Bereiche verwendet.openxml - Einfügen einer Zeile, Verschieben anderer

Der Client benötigt eine Summenzeile am Ende der Zeilenliste. Klingt wie eine vernünftige Anfrage !!

Die Datentabelle, die ich aus der DB zurückgeben kann jedoch eine beliebige Anzahl von Zeilen enthalten. Mit Schablonenzeilen und 'InsertBeforeSelf' wird meine Summenzeile überschrieben.

Meine Frage ist, mit Hilfe von Openxml, wie kann ich Zeilen in die Tabelle einfügen, wodurch die Summenzeile jedes Mal nach unten verschoben wird, wenn eine Zeile eingefügt wird?

Grüße ...

Antwort

7

Vorausgesetzt, dass Sie das SDK 2.0, verwenden habe ich etwas ähnlich mit dieser Funktion:

private static Row CreateRow(Row refRow, SheetData sheetData) 
    { 
     uint rowIndex = refRow.RowIndex.Value; 
     uint newRowIndex; 
     var newRow = (Row)refRow.Clone(); 

     /*IEnumerable<Row> rows = sheetData.Descendants<Row>().Where(r => r.RowIndex.Value >= rowIndex); 
     foreach (Row row in rows) 
     { 
      newRowIndex = System.Convert.ToUInt32(row.RowIndex.Value + 1); 

      foreach (Cell cell in row.Elements<Cell>()) 
      { 
       string cellReference = cell.CellReference.Value; 
       cell.CellReference = new StringValue(cellReference.Replace(row.RowIndex.Value.ToString(), newRowIndex.ToString())); 
      } 

      row.RowIndex = new UInt32Value(newRowIndex); 
     }*/ 

     sheetData.InsertBefore(newRow, refRow); 
     return newRow; 
    } 

Ich bin nicht sicher, wie Sie es mit InsertBeforeSelf taten vor Vielleicht ist das keine große Verbesserung, aber das hat für mich funktioniert. Ich dachte, Sie könnten einfach Ihre Summenzeile als Referenzzeile verwenden. (Der auskommentierte Teil ist für, wenn Sie Zeilen nach Ihrer Referenzzeile hatten, die Sie pflegen wollten. Ich machte einige Änderungen, aber es kommt meistens aus diesem Thread: http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/thread/65c9ca1c-25d4-482d-8eb3-91a3512bb0ac)

Da es die neue Zeile zurückgibt, können Sie verwenden Dieses Objekt bearbeitet dann die Zellenwerte mit den Daten aus der Datenbank. Ich hoffe, das ist zumindest etwas hilfreich für jeden, der versucht, dies zu tun ...

+0

Vielen Dank: SheetData wie aus Ihrem Arbeitsblatt bekommen werden! Ich habe das gesucht !!! –

+0

Beachten Sie, dass die Zusammenführungszellen in einem separaten Objekt aufbewahrt werden. Wenn Sie das korrekte Zusammenführungsformat beibehalten möchten, sollten Sie ihre Referenzen aktualisieren. Bitte überprüfen Sie http://StackOverflow.com/a/11455088/1099945 – gyosifov

2

[Kann jemand mit mehr Punkten bitte auf die Antwort des M_R_H diesen Text als Kommentar setzen.]

Die Lösung, die M_R_H hilft gab ich, aber führt einen neuen Fehler in das Problem ein. Wenn Sie die angegebene CreateRow-Methode so verwenden, wie sie ist, wird die CalcChain.xml (im Paket) beschädigt, wenn eine der Zeilen, auf die verschoben/erneut referenziert wird, Formeln enthält. Ich habe der vorgeschlagenen CreateRow-Lösung den folgenden Code hinzugefügt. Es ist noch nicht das Problem zu beheben, weil ich dieser Code denke nur die aktuell Ergehens kopierten Reihe Referenzbefestigung:

if (cell.CellFormula != null) { 
    string cellFormula = cell.CellFormula.Text; 
    cell.CellFormula = new CellFormula(cellFormula.Replace(row.RowIndex.Value.ToString(), newRowIndex.ToString())); 
} 

Was ist der richtige Weg ist CalcChain.xml zu reparieren/aktualisieren?

PS:

worksheet.GetFirstChild<SheetData>();