2017-10-02 7 views
1

open xml을 사용하여 행을 복제하고 삽입하려고 할 때 현재 문제가 있습니다.openxml을 사용하여 특정 행 앞에 복제 행을 추가 할 수 없습니다. VS2017의 C#

아래 코드에서 srcRowIdx와 refRow가 동일한 인덱스 인 경우 삽입 된 행으로 행을 복제하고 엑셀 시트를 성공적으로 저장할 수 있습니다. 그러나 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 - SRC에와 심판 행이 동일한 경우이 작동 이유 때문에 라인 4에 있습니다

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

당신이 rowIndex에 또는이 복제 된 행의 CellReferences을 변경하지 않습니다. 그래서 항상 src의 인덱스에 머물러 있습니다.

src와 ref가 같으면 복제 노드의 RowIndex 및 CellReferences는 ok이고 이후의 모든 행은 1 씩 증가합니다. Excel에서이를 올바르게 확인합니다. 예를 들어, src와 ref가 24 일 때, 복제 된 노드 CellReferences는 24에 머무르고, 모든 행 CellReferences 24와 up은 1만큼 증가하므로 시트가 순서대로 있습니다.

그러나 src가 24이고 ref가 27 인 경우를 생각해보십시오. 복제 된 행은 인덱스가 24 인 RowIndex와 CellReferences를 가지고 있습니다. 이것을 27 번째 자리에 삽입하고 그 뒤의 모든 행을 1 씩 증가 시키면, 다음 시트 행이 꺼져 있습니다

  • 는 (행 23 행 23 :
  • 시작했다 행 (23)의 지수와 23
  • 행 (24)의 CellReferences와 세포는 한 행 (24)의 지수와 CellReferences와 세포 24
  • 행 25는 행 인덱스가 25이고 CellReferen 25
  • 행 (26)의 CES는 행 (26)의 색인 및 24
  • 행 28 CellReferences 26
  • 행 CellReferences 24 27 가지고 행 인덱스와 셀 셀이 28 행 인덱스가 과의 CellReferences와 세포 28

(등)

엑셀이를 열고 유효성을 검사 할 때,이 행 (27)에 초크 및 요하는 경우 당신을 위해 그것을 제거

너.

이 문제를 해결하려면 clonedRow RowIndex 및 CellReferences를 대상 행 번호로 업데이트해야합니다. 그래서 당신은 진짜 가깝습니다.

+0

너무 많이 생각해서 clonedRow.RowIndex.Value = (uint) refRow;를 추가했습니다. 전에 sheetData.InsertBefore (clonedRow, rowRef); 하지만 난 여전히 같은 오류가 발생하고있다 –

+0

좋은 첫 번째 단계. 나는 또한 당신이 필요하다고 생각 복제 된 행 '셀을 통해 루프 코드를 추가하고 해당 색인도 일치하도록 CellReferences를 업데이 트하십시오. – Taterhead