2010-06-24 49 views
5

我正在使用openxml創建一個excel報告。 openxml使用命名範圍對模板excel文件進​​行操作。openxml - 插入一行,移動他人

客戶端在行列表末尾需要一個總計行。聽起來像一個合理的要求!

但是,我從數據庫返回的數據表可以包含任意數量的行。使用模板行和'InsertBeforeSelf',我的總計行被覆蓋。

我的問題是,如何使用openxml將行插入到電子表格中,導致每次插入行時總計行被向下移動?

問候......

回答

7

假設你正在使用SDK 2.0,我做了類似的東西使用此功能:

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

我不知道你怎麼用InsertBeforeSelf之前做,所以也許這不是一個很大的改進,但這對我來說很有用。我以爲你可以使用總計行作爲參考行。 (註釋掉的部分是因爲如果你在你想維護的參考行之後有行,我做了一些修改,但它主要來自這個線程:http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/thread/65c9ca1c-25d4-482d-8eb3-91a3512bb0ac

由於它返回新行,所以可以使用該對象然後用來自數據庫的數據編輯單元值。我希望這至少在一定程度有助於任何人試圖做到這一點...

+0

太謝謝你了!我正在尋找這個! – 2011-06-09 07:50:48

+0

請注意,合併單元格保存在單獨的對象中。如果你想保持正確的合併格式,你應該更新他們的引用。請檢查http://stackoverflow.com/a/11455088/1099945 – gyosifov 2014-06-12 07:43:43

2

[有人能與更多的點,請把這段文字作爲M_R_H的答案評論]

是M_R_H都給幫助解決方案我,但引入了一個新的問題。如果您按原樣使用給定的CreateRow方法,如果任何正在移動/重新引用的行具有公式,CalcChain.xml(在包中)將會被破壞。 我將下面的代碼添加到建議的CreateRow解決方案中。它仍然不能解決問題,因爲,我覺得這個代碼僅固定當前存在複製的行引用:

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

什麼是修復/更新CalcChain.xml的正確方法?

PS:SheetData可以從您的工作表將得到如下:

worksheet.GetFirstChild<SheetData>();