2014-10-08 99 views
0

我一直在爲我的xlsx文件創建工作表。添加第一張工作表不是問題,但是當我想要第二張工作表時,導出的xlsx似乎已損壞。誰能指出我做錯了什麼? 注意:我已經嘗試調用'workbookpart,Workbook.Save();'創建第一個工作簿後,但沒有所需的結果。導出到Excel(OpenXML)導致無法讀取的內容

protected void export_Click(object sender, EventArgs e) 
{ 
    ExportToExcel(@"D:\dev\Dotnet4\Excel\test.xlsx"); 
} 

private void ExportToExcel(string filepath) 
{ 
    SpreadsheetDocument spreadsheetDocument; 
    WorkbookPart workbookpart; 
    CreateSpreadsheet(filepath, out spreadsheetDocument, out workbookpart); 

    CreateWorksheet(spreadsheetDocument, workbookpart, "My sheet 1"); 
    CreateWorksheet(spreadsheetDocument, workbookpart, "My sheet 2"); 

    workbookpart.Workbook.Save(); 

    // Close the document. 
    spreadsheetDocument.Close(); 
} 

private static void CreateWorksheet(SpreadsheetDocument spreadsheetDocument, WorkbookPart workbookpart, string worksheetName) 
{ 
    // Add a WorksheetPart to the WorkbookPart. 
    WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>(); 
    worksheetPart.Worksheet = new Worksheet(new SheetData()); 

    // Add Sheets to the Workbook. 
    Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook. 
     AppendChild<Sheets>(new Sheets()); 

    // Append a new worksheet and associate it with the workbook. 
    Sheet sheet = new Sheet() 
    { 
     Id = spreadsheetDocument.WorkbookPart. 
      GetIdOfPart(worksheetPart), 
     SheetId = 1, 
     Name = worksheetName 
    }; 
    sheets.Append(sheet); 
} 

private static void CreateSpreadsheet(string filepath, out SpreadsheetDocument spreadsheetDocument, out WorkbookPart workbookpart) 
{ 
    // Create a spreadsheet document by supplying the filepath. 
    // By default, AutoSave = true, Editable = true, and Type = xlsx. 
    spreadsheetDocument = SpreadsheetDocument. 
     Create(filepath, SpreadsheetDocumentType.Workbook); 

    // Add a WorkbookPart to the document. 
    workbookpart = spreadsheetDocument.AddWorkbookPart(); 
    workbookpart.Workbook = new Workbook(); 
} 

回答

0

我認爲你有兩個小問題:

  1. SheetId是要添加哪些是無效的兩片相同的。
  2. 您每次呼叫CreateWorksheet時都會添加一個新的Sheets元素,但XML中只能有一個這樣的元素(有許多Sheet,但不是很多Sheets!)。

要解決1您可以使用sheets.ChildElements的計數。由於這是0第一次和第二次,你需要添加1它。如果你喜歡,你可以把它作爲參數CreateWorksheet;只要他們從1開始並且不同,它並不重要。

要解決2,您可以對WorkbookSheets屬性執行空檢查,並且只有在它不存在時纔會創建該屬性。

下面應該做你以後的事情。

private static void CreateWorksheet(SpreadsheetDocument spreadsheetDocument, WorkbookPart workbookpart, string worksheetName) 
{ 
    // Add a WorksheetPart to the WorkbookPart. 
    WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>(); 
    worksheetPart.Worksheet = new Worksheet(new SheetData()); 

    // Add Sheets to the Workbook. 
    if (spreadsheetDocument.WorkbookPart.Workbook.Sheets == null) 
    { 
     //spreadsheetDocument.WorkbookPart.Workbook.Sheets = new Sheets(); 
     spreadsheetDocument.WorkbookPart.Workbook 
             .AppendChild<Sheets>(new Sheets()); 
    } 

    Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.Sheets; 

    // Append a new worksheet and associate it with the workbook. 
    Sheet sheet = new Sheet() 
    { 
     Id = spreadsheetDocument.WorkbookPart. 
      GetIdOfPart(worksheetPart), 
     SheetId = (UInt32)sheets.ChildElements.Count + 1, 
     Name = worksheetName 
    }; 
    sheets.Append(sheet); 
} 

最後一點是,SpreadsheetDocument器具IDisposable所以應該使用後廢棄。

+0

謝謝你的回答。我在發帖後幾分鐘就發現了你的第一個註解。你提到的第二個問題似乎確實是問題。修復後,這工作就像一個魅力。 – 2014-10-09 06:52:36