2014-10-08 103 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