2017-06-11 32 views
1

打開我的OpenXML創建的電子表格時出現錯誤。錯誤如下。已修復記錄:已創建工作表中的單元格信息

修理記錄:XL /工作表/ sheet.xml部分小區信息

private void SavexlsExcelFile(String fullPathName) 
    { 
     using (SpreadsheetDocument document = SpreadsheetDocument.Create(fullPathName, SpreadsheetDocumentType.Workbook)) 
     { 

      WorkbookPart workbookPart = document.AddWorkbookPart(); 
      workbookPart.Workbook = new Workbook(); 

      worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); 
      worksheetPart.Worksheet = new Worksheet(); 

      Columns columns = new Columns(); 

      worksheetPart.Worksheet.AppendChild(columns); 

      Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets()); 

      Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet" }; 
      sheets.Append(sheet); 

      workbookPart.Workbook.Save(); 

      sheetData = worksheetPart.Worksheet.AppendChild(new SheetData()); 


      List<List<string>> dataRow = new List<List<string>>(); 
      List<String> dtRow = new List<String>(); 

      Row row = new Row(); 

      for (int i = 0; i < dataGridView1.RowCount; i++) 
      { 
       for (int j = 0; j < dataGridView1.ColumnCount; j++) 
       { 
        if (i == 0) 
        { 
         Cell dataCell = new Cell(); 
         dataCell.DataType = CellValues.String; 
         CellValue cellValue = new CellValue(); 

         cellValue.Text = dataGridView1.Columns[j].Name; 
         dataCell.StyleIndex = 2; 
         dataCell.Append(cellValue); 
         row.AppendChild(dataCell); 
         //dataColumn.Add(dataGridView1.Columns[j].Name); 
        } 
        dtRow.Add(dataGridView1.Rows[i].Cells[j].Value.ToString()); 
       } 
      } 

      dataRow.Add(dtRow); 
      sheetData.AppendChild(row); 

      row = new Row(); 

      foreach (List<string> datarow in dataRow) 
      { 
       row = new Row(); 
       foreach(string dtrow in datarow) 
       { 
        row.Append(ConstructCell(dtrow, CellValues.String, 2)); 
       } 
       sheetData.AppendChild(row); 
      } 
      worksheetPart.Worksheet.Save(); 
     } 
    } 
    private Cell ConstructCell(string value, CellValues dataType, uint styleIndex = 0) 
    { 
     return new Cell() 
     { 
      CellValue = new CellValue(value), 
      DataType = new EnumValue<CellValues>(dataType), 
      StyleIndex = styleIndex 
     }; 
    } 

回答

0

這裏有兩個問題,我可以看到。首先是你使用Columns是不正確的。如果您希望控制諸如列的寬度之類的東西,則應該使用Columns。要正確使用Columns,您需要添加子元素Column。例如(從here拍攝):

Columns columns = new Columns(); 

columns.Append(new Column() { Min = 1, Max = 3, Width = 20, CustomWidth = true }); 
columns.Append(new Column() { Min = 4, Max = 4, Width = 30, CustomWidth = true }); 

在您的樣品,你可以只刪除以下兩行

Columns columns = new Columns(); 
worksheetPart.Worksheet.AppendChild(columns); 

第二個問題是您正在使用的StyleIndex;該樣式不存在於您的文檔中,因爲您尚未添加它。最簡單的方法就是完全刪除StyleIndex

當調試這樣的文件時,總是值得看看OpenXml Productivity Tool。您可以在工具中打開生成的文件並驗證它以查看您的文件中存在哪些錯誤。

+0

非常感謝您的回覆。我用這種方法解決了這個問題。 –

+0

Hi @ SJ.Lee如果這個或任何答案已經解決了您的問題,請點擊複選標記考慮[接受它](https://meta.stackexchange.com/q/5234/179419)。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。沒有義務這樣做。 – petelids

0

在Excel中的所有文本被存儲在共享字符串表下。你需要在共享字符串表中插入字符串:

string text = dataGridView1.Columns[j].Name; 
cell.DataType = CellValues.SharedString; 

if (!_spreadSheet.WorkbookPart.GetPartsOfType<SharedStringTablePart>().Any()) 
{ 
    _spreadSheet.WorkbookPart.AddNewPart<SharedStringTablePart>(); 
} 

var sharedStringTablePart = _spreadSheet.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First(); 
if (sharedStringTablePart.SharedStringTable == null) 
{ 
    sharedStringTablePart.SharedStringTable = new SharedStringTable(); 
} 
//Iterate through shared string table to check if the value is already present. 
foreach (SharedStringItem ssItem in sharedStringTablePart.SharedStringTable.Elements<SharedStringItem>()) 
{ 
    if (ssItem.InnerText == text) 
    { 
     cell.CellValue = new CellValue(ssItem.ElementsBefore().Count().ToString()); 
     SaveChanges(); 
     return; 
    } 
} 
// The text does not exist in the part. Create the SharedStringItem. 
var item = sharedStringTablePart.SharedStringTable.AppendChild(new SharedStringItem(new Text(text))); 
cell.CellValue = new CellValue(item.ElementsBefore().Count().ToString()); 
+0

非常感謝您的回覆。 –

相關問題