2009-06-15 3 views
1

코드는 실행되지만 내 Excel 문서는 손상됩니다. 어떤 도움이라도 대단히 감사하게 될 것입니다! 나는 this을 참고로 사용했다.Open XML SDK 2.0을 사용하여 문자열 배열을 Excel 문서에 행으로 삽입

public void AddRow(string fileName, string[] values) { 
     using (SpreadsheetDocument doc = 
      SpreadsheetDocument.Open(fileName, true)) { 
      SharedStringTablePart sharedStringPart = 
       GetSharedStringPart(doc); 

      WorksheetPart worksheetPart = 
       doc.WorkbookPart.WorksheetParts.First(); 
      uint rowIdx = AppendRow(worksheetPart); 

      for (int i = 0; i < values.Length; ++i) { 
       int stringIdx = InsertSharedString(values[i], 
        sharedStringPart); 

       Cell cell = InsertCell(i, rowIdx, worksheetPart); 
       cell.CellValue = new CellValue(stringIdx.ToString()); 
       cell.DataType = new EnumValue<CellValues>(
        CellValues.SharedString); 

       worksheetPart.Worksheet.Save(); 
      } 
     } 
    } 

    private SharedStringTablePart GetSharedStringPart(
     SpreadsheetDocument doc) { 
     if (doc.WorkbookPart. 
      GetPartsCountOfType<SharedStringTablePart>() > 0) 
      return doc.WorkbookPart. 
       GetPartsOfType<SharedStringTablePart>().First(); 
     else 
      return doc.WorkbookPart. 
       AddNewPart<SharedStringTablePart>(); 
    } 

    private uint AppendRow(WorksheetPart worksheetPart) { 
     SheetData sheetData = worksheetPart.Worksheet. 
      GetFirstChild<SheetData>(); 

     uint rowIndex = (uint)sheetData.Elements<Row>().Count(); 

     Row row = new Row() { RowIndex = rowIndex }; 
     sheetData.Append(row); 

     return rowIndex; 
    } 

    private int InsertSharedString(string s, 
     SharedStringTablePart sharedStringPart) { 
     if (sharedStringPart.SharedStringTable == null) 
      sharedStringPart.SharedStringTable = 
       new SharedStringTable(); 

     int i = 0; 

     foreach (SharedStringItem item in 
      sharedStringPart.SharedStringTable. 
      Elements<SharedStringItem>()) { 
      if (item.InnerText == s) 
       return i; 
      ++i; 
     } 

     sharedStringPart.SharedStringTable.AppendChild(
      new Text(s)); 
     sharedStringPart.SharedStringTable.Save(); 

     return i; 
    } 

    private Cell InsertCell(int i, uint rowIdx, 
     WorksheetPart worksheetPart) { 
     SheetData sheetData = worksheetPart.Worksheet. 
      GetFirstChild<SheetData>(); 
     string cellReference = AlphabetMap.Instance[i] + rowIdx; 

     Cell cell = new Cell() { CellReference = cellReference }; 
     Row row = sheetData.Elements<Row>().ElementAt((int)rowIdx); 

     row.InsertAt(cell, i); 
     worksheetPart.Worksheet.Save(); 
     return cell; 
    } 

답변

2

아, 찾았습니다. InsertSharedString 방법에서,

sharedStringPart.SharedStringTable.AppendChild(
     new Text(s)); 

같아야

sharedStringPart.SharedStringTable.AppendChild(
     new SharedStringItem(new Text(s))); 
관련 문제