2010-06-24 11 views
5

Sto usando openxml per creare un report excel. Openxml opera su un file excel del modello utilizzando intervalli denominati.openxml - inserimento di una riga, spostamento di altre

Il client richiede una riga di totali alla fine dell'elenco di righe. Sembra una richiesta ragionevole !!

Tuttavia, la tabella di dati che sto restituendo dal db può contenere un numero qualsiasi di righe. Utilizzando le righe del modello e 'InsertBeforeSelf', la riga dei miei totali viene sovrascritta.

La mia domanda è, utilizzando openxml, come posso inserire righe nel foglio di calcolo, facendo sì che la riga dei totali venga spostata verso il basso ogni volta che viene inserita una riga?

Saluti ...

risposta

7

Supponendo che si sta utilizzando l'SDK 2.0, ho fatto qualcosa di simile utilizzando questa funzione:

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

Non sono sicuro di come stavi con InsertBeforeSelf prima , quindi forse questo non è un gran miglioramento, ma questo ha funzionato per me. Stavo pensando che potresti semplicemente usare la riga dei tuoi totali come riga di riferimento. (La parte commentata è per se avessi delle righe dopo la tua riga di riferimento che volevi mantenere. Ho apportato alcune modifiche, ma proviene principalmente da questo thread: http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/thread/65c9ca1c-25d4-482d-8eb3-91a3512bb0ac)

Dato che restituisce la nuova riga, puoi usare quell'oggetto quindi modificare i valori della cella con i dati dal database. Spero che questo sia almeno un po 'utile a chiunque cercando di fare questo ...

+0

grazie mille! Stavo cercando questo !!!! –

+0

Tenere presente che le celle di unione vengono mantenute in un oggetto separato. Se si desidera mantenere il formato unione corretto, è necessario aggiornare i riferimenti. Si prega di controllare http://stackoverflow.com/a/11455088/1099945 – gyosifov

2

[Può qualcuno con più punti si prega di mettere questo testo come un commento per la risposta del M_R_H.]

La soluzione che ha dato M_R_H aiutato io, ma introduce un nuovo bug al problema. Se si utilizza il metodo CreateRow specificato così com'è, se una delle righe spostate/rimesse riferimenti contiene formule, il file CalcChain.xml (nel pacchetto) verrà interrotto. Ho aggiunto il seguente codice alla soluzione CreateRow proposta. E ancora non risolve il problema, perché, credo che questo codice è solo fissa il momento-essere-copiato di riferimento consecutive:

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

Qual è il modo corretto per risolvere/aggiornamento CalcChain.xml?

PS: SheetData può essere ottenuto dal foglio di lavoro come:

worksheet.GetFirstChild<SheetData>();