OpenXml Doc SDK 2.0 не производит данные таблицы данных в выводе - PullRequest
1 голос
/ 02 февраля 2012

Я использую Open XML doc для создания электронной таблицы, ее вывода в поток памяти и возврата с сервера. Однако выходные данные не включают содержимое DataSheet / Worksheet. Я пробовал различные примеры из разных URL, включая VB.NET. Все они не включают в себя содержимое из DataSheet. Однако, если я распечатываю содержимое рабочего листа отдельно, используя свойство Worksheet.OuterXml, оно отображается правильно. Он не печатается как часть свойства Workbook.OuterXml. Пример кода и вывод приведены ниже.

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>

Ответы [ 2 ]

1 голос
/ 24 июля 2012

Вы должны закрыть электронную таблицу.Вызов рекурсивного закрытия вызывает сохранение всех дочерних элементов.

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

Вместо того, чтобы пытаться создать электронную таблицу с нуля, рассмотрите возможность использования ClosedXML иливзгляните на крошечную библиотеку электронных таблиц, которую я написал .В частности, обратите внимание на SheetDataIndexer и SharedStringTableIndexer .Я постоянно работаю над этими примерами, поскольку в своей собственной работе я довольно много манипулирую OpenXML.

1 голос
/ 26 марта 2012

У меня была похожая проблема, и я исправил ее, вызвав spreadSheet.Close () после вызова spreadSheet.WorkbookPart.Workbook.Save ().

...