2010-06-24 29 views
5

Używam openxml do tworzenia raportu Excel. Openxml działa na pliku Excela z użyciem nazwanych zakresów.openxml - wstawianie wiersza, przenoszenie innych

Klient wymaga wiersza podsumowań na końcu listy wierszy. Brzmi jak rozsądna prośba !!

Jednak tabela danych, którą wracam z bazy danych, może zawierać dowolną liczbę wierszy. Korzystanie z wierszy szablonu i "InsertBeforeSelf" powoduje, że mój wiersz podsumowań jest nadpisywany.

Moje pytanie brzmi, używając openxml, jak wstawić wiersze do arkusza kalkulacyjnego, powodując przesunięcie wiersza sumy w dół za każdym razem, gdy wstawiany jest wiersz?

Pozdrawiam ...

Odpowiedz

7

Zakładając, że używasz SDK 2.0, zrobiłem coś podobnego przy użyciu tej funkcji:

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

Nie jestem pewien, jak się to robi z InsertBeforeSelf przed , więc może to nie jest żadna poprawa, ale dla mnie to zadziałało. Myślałem, że możesz użyć wiersza sumy jako wiersza odniesienia. (Skomentowana część dotyczy tego, czy po wierszu referencyjnym były wiersze, które chciałbyś zachować. Wprowadziłem pewne modyfikacje, ale w większości pochodzą one z tego wątku: http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/thread/65c9ca1c-25d4-482d-8eb3-91a3512bb0ac)

Ponieważ zwraca nowy wiersz, możesz użyć następnie obiekt, aby edytować wartości komórek za pomocą danych z bazy danych. Mam nadzieję, że to przynajmniej w pewnym stopniu pomocne dla każdego, kto próbuje to zrobić ...

+0

Dziękuję bardzo! Szukałem tego !!!! –

+0

Należy pamiętać, że komórki scalania są przechowywane w osobnym obiekcie. Jeśli chcesz zachować poprawny format scalania, powinieneś zaktualizować swoje referencje. Sprawdź http://stackoverflow.com/a/11455088/1099945 – gyosifov

2

[Czy ktoś z większą liczbą punktów należy umieścić ten tekst jako komentarz do M_R_H za Odpowiedź.]

Rozwiązanie, które M_R_H dał pomógł mnie, ale wprowadza nowy błąd do problemu. Jeśli używasz podanej metody CreateRow, jeśli którykolwiek z przenoszonych/ponownie przywoływanych wierszy ma formuły, plik CalcChain.xml (w pakiecie) zostanie uszkodzony. Dodałem następujący kod do proponowanego rozwiązania CreateRow. To nadal nie rozwiązuje problemu, ponieważ myślę, że ten kod jest ustalenie tylko odniesienie wiersza aktualnie bycia-skopiowane:

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

Co to jest właściwy sposób, aby naprawić/aktualizacji CalcChain.xml?

PS: SheetData można zdobyć z arkusza jako:

worksheet.GetFirstChild<SheetData>(); 
Powiązane problemy