2017-10-02 4 views
1

open xmlを使用して行を複製して挿入しようとすると、現在問題が発生しています。openxmlを使用して特定の行の前にクローン行を追加することができません。VS2017のC#

私は、srcRowIdxとrefRowが同じインデックスである場合、挿入された行でその行をクローンし、Excelシートを正常に保存できることに気付きました。ただし、srcRowIdxとrefRowが異なる場合は、Excelシートが破損します。なぜこれがそうだと私に啓発できる人?

public Row CopyLine(SpreadsheetDocument excelDoc, string sheetName, int srcRowIdx, int refRow) 
      { 
       var worksheetPart = GetWorksheetPart(excelDoc, sheetName); 
       var sheetData = worksheetPart.Worksheet.Descendants<SheetData>().First(); 
       var srcRow = GetRow(worksheetPart, srcRowIdx); 
       var clonedRow = (Row)srcRow.CloneNode(true); 
       var rowRef = GetRow(worksheetPart, refRow); 

       //Update all indexes to index+1 
       IEnumerable<Row> rows = sheetData.Descendants<Row>().Where(r => r.RowIndex.Value >= refRow); 
       foreach (Row row in rows) 
       { 
        var clonedRowIndex = Convert.ToUInt32(row.RowIndex.Value + 1); 

        foreach (Cell cell in row.Elements<Cell>()) 
        { 
         // Update the references for reserved cells. 
         string cellReference = cell.CellReference.Value; 
         cell.CellReference = 
          new StringValue(cellReference.Replace(row.RowIndex.Value.ToString(), clonedRowIndex.ToString())); 
        } 
        // Update the row index. 
        row.RowIndex = new UInt32Value(clonedRowIndex); 
       } 

       sheetData.InsertBefore(clonedRow, rowRef); 

       worksheetPart.Worksheet.Save(); 
       return clonedRow; 
      } 
+0

スプレッドシートへのリンクを投稿すると、より良い結果が得られます。 – Taterhead

+0

これは、https://drive.google.com/file/d/0BxwJ_UygiRkKTlR4ZGM3VHdteDQ/view?usp=sharing –

+0

を使用しているテンプレートのリンクです。検証エラー:https://drive.google.com/file/d/ 0BxwJ_UygiRkKOHBEWHcwZXkyUlk/view?usp = sharing –

答えて

0

OK - ライン4であるため、srcとREF列が等しいとき、この作品理由は次のとおりです。

var clonedRow = (Row)srcRow.CloneNode(true); 

あなたがrowIndexにまたはこのクローン化された行のCellReferencesのいずれかを変更することはありません。したがって、常にsrcのインデックスにとどまります。

srcとrefが等しい場合、クローンノードのRowIndexとCellReferencesは正常で、後のすべての行が1だけインクリメントされ、Excelはこれを正しく検証します。たとえば、srcとrefが24の場合、クローンノードCellReferencesは24に留まり、CellReferences 24以降のすべての行は1だけインクリメントされ、シートは順番に並べられます。

ただし、srcが24でrefが27の場合を考えてください。行23は、23の行のインデックスを持っており、23

  • 行24のCellReferences有する細胞はCellReferencesと行24のインデックスとセルを有する行23 :)
  • から始まる

    • (:その後、あなたのシートの行がオフになっています24
    • 行25には行インデックス25があり、セルにはCellReferen 25
    • 列26のCESは、26の行インデックスを有し、26
    • 列27のCellReferences有する細胞は
    • 列28は、28の行インデックスを有するのCellReferencesととセルの行インデックスを有しますそして、のCellReferencesとセル28

    (など)

    Excelがこれを開いて検証すると、それは行27にチョークやヨーヨー場合はあなたのためにそれを削除します

    あなたはそれを聞かせてください。

    この問題を解決するには、clonedRowのRowIndexおよびCellReferencesをターゲット行番号に更新する必要があります。あなたは本当に近いです。

  • +0

    私はあまりにも私がclonedRow.RowIndex.Value =(uint)refRowを追加したと思った。行の前にsheetData.InsertBefore(clonedRow、rowRef);私はまだ同じエラーが発生しています –

    +0

    良い最初のステップ。私はあなたもする必要があると思うクローンされた行のセルをループし、そのインデックスにも一致するCellReferencesを更新するコードを追加します。 – Taterhead

    関連する問題