2012-02-02 55 views
1

我使用Open XML文档创建电子表格并将其输出到内存流中并从服务器返回。但是,输出不包括DataSheet/Worksheet内容。我尝试了各种不同的网址,包括VB.NET的。它们都不包括DataSheet中的内容。但是,如果我使用Worksheet.OuterXml属性分别打印工作表的内容,则会正确显示它。它不被打印为Workbook.OuterXml属性的一部分。示例代码和输出如下所示。OpenXml Doc sdk 2.0不生成输出中的DataSheet数据

private MemoryStream testSpreadsheetOutputAsStream() 
    { 
     MemoryStream outStream = new MemoryStream(); 
     using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Create(outStream, SpreadsheetDocumentType.Workbook)) 
     { 
      // create the workbook 
      spreadSheet.AddWorkbookPart(); 
      spreadSheet.WorkbookPart.Workbook = new Workbook();  // create the worksheet 
      spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>(); 
      spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet = new Worksheet(); 

      // create sheet data 
      spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.AppendChild(new SheetData()); 

      // create row 
      spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.First().AppendChild(new Row()); 

      // create cell with data 
      spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.First().First().AppendChild(
        new Cell() { CellValue = new CellValue("101") }); 

      // save worksheet 
      spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.Save(); 

      // create the worksheet to workbook relation 
      spreadSheet.WorkbookPart.Workbook.AppendChild(new Sheets()); 
      spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>().AppendChild(new Sheet() 
      { 
       Id = spreadSheet.WorkbookPart.GetIdOfPart(spreadSheet.WorkbookPart.WorksheetParts.First()), 
       SheetId = 1, 
       Name = "test" 
      }); 

      spreadSheet.WorkbookPart.Workbook.Save(); 

      System.Diagnostics.Debug.WriteLine(spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.OuterXml); 
      System.Diagnostics.Debug.WriteLine(spreadSheet.WorkbookPart.Workbook.OuterXml); 
     } 
     return outStream; 

    } 

输出窗口的输出如下。

Worksheet output <x:worksheet xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><x:sheetData><x:row><x:c><x:v>101</x:v></x:c></x:row></x:sheetData></x:worksheet> 

Workbook output 

<x:workbook xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><x:sheets><x:sheet name="test" sheetId="1" r:id="R0ed99ee34c894367" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" /></x:sheets></x:workbook> 
+0

我想这是正确的,当工作表的内容没有出现在工作簿xml中。这可能只是因为它只包含对工作表的引用,并且它们中的每一个的内容都存储在不同的部分中,所以您的文件似乎没问题。您是否尝试过打开它并查看它是否包含您输入的数据? – 2012-02-02 19:56:18

回答

1

我也有类似的问题,并通过调用spreadSheet.WorkbookPart.Workbook.Save后调用spreadSheet.Close()固定它()。

1

您必须关闭电子表格。一个调用关闭递归调用保存所有的子项。

http://msdn.microsoft.com/en-us/library/documentformat.openxml.packaging.openxmlpackage.close

,而不是试图从头开始创建电子表格,可以考虑使用ClosedXML或微小的电子表格库,我wrote的看一看。具体来说,请注意SheetDataIndexerSharedStringTableIndexer。我一直在研究这些示例,因为我在自己的工作中做了很多的OpenXML操作。