C # Open XML: мы обнаружили проблему с некоторым контентом.Недавно добавленный лист не показывает никаких данных - PullRequest
0 голосов
/ 07 декабря 2018

Ниже приведен код, который используется для ДОБАВИТЬ нового листа в уже существующую электронную таблицу.

Я передаю список во входных данных, этот T имеет только 2 свойства "code"и" описание ".Я перебираю каждое из свойств T и помещаю их в листовые данные и, наконец, сохраняю электронную таблицу.

private static void PutInExcel(List<RulesEngineOutput> output)
    {
        using (SpreadsheetDocument document = SpreadsheetDocument.Open(@"C:\ATP\Sprints\PA\RE\IO.xlsx", true))
        {


            // Add a blank WorksheetPart.
            WorksheetPart newWorksheetPart = document.WorkbookPart.AddNewPart<WorksheetPart>();
            newWorksheetPart.Worksheet = new Worksheet(new SheetData());

            Sheets sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>();
            string relationshipId = document.WorkbookPart.GetIdOfPart(newWorksheetPart);

            // Get a unique ID for the new worksheet.
            uint sheetId = 1;
            if (sheets.Elements<Sheet>().Count() > 0)
            {
                sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
            }

            // Give the new worksheet a name.
            string sheetName = "NewRole" + sheetId;

            // Append the new worksheet and associate it with the workbook.
            Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
            sheets.Append(sheet);

            SheetData sheetData = newWorksheetPart.Worksheet.AppendChild(new SheetData());
            // Constructing header
            Row row = new Row();

            row.Append(
                ConstructCell("Code", CellValues.String),
                ConstructCell("Description", CellValues.String));

            // Insert the header row to the Sheet Data
            sheetData.AppendChild(row);


            foreach (var reItem in output)
            {
                row = new Row();

                row.Append(
                    ConstructCell(reItem.Code.ToString(), CellValues.Number),
                    ConstructCell(reItem.Description, CellValues.String)
                    );

                sheetData.AppendChild(row);
            }


            newWorksheetPart.Worksheet.Save();
            document.WorkbookPart.Workbook.Save();
            document.Save();

        }

    }

Проблема в том, что все происходит без ошибок, я имею в виду, что я вижу добавленный рабочий лист в окне отладки,я тоже все сохраняю, но когда я открываю эту электронную таблицу, я вижу сообщение об ошибке

Мы обнаружили проблему с некоторым содержанием

и, наконец, листы отображаются безлюбое содержание, как показано ниже:

Чистый лист с именем листа

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

позже я сделал 2 изменения (см. Комментарии в приведенном ниже коде или сравните его с оригиналом) - я сделал это, потому что xml выдавал ошибку, поэтому я обнаружил, что преобразование кода в число является причиной ошибки изXML.Кроме того, Алан Х предложил попробовать и исключить новые SheetData () , переданные внутри листа, поэтому я использовал пустой конструктор по умолчанию.

private static void PutInExcel(List<RulesEngineOutput> output)
    {
        using (SpreadsheetDocument document = SpreadsheetDocument.Open(@"C:\ATP\Sprints\PA\RE\IO.xlsx", true))
        {


            // Add a blank WorksheetPart.
            WorksheetPart newWorksheetPart = document.WorkbookPart.AddNewPart<WorksheetPart>();
            newWorksheetPart.Worksheet = new Worksheet(); // Change 1

            Sheets sheets = document.WorkbookPart.Workbook.GetFirstChild<Sheets>();
            string relationshipId = document.WorkbookPart.GetIdOfPart(newWorksheetPart);

            // Get a unique ID for the new worksheet.
            uint sheetId = 1;
            if (sheets.Elements<Sheet>().Count() > 0)
            {
                sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
            }

            // Give the new worksheet a name.
            string sheetName = "NewRole" + sheetId;

            // Append the new worksheet and associate it with the workbook.
            Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
            sheets.Append(sheet);

            SheetData sheetData = newWorksheetPart.Worksheet.AppendChild(new SheetData());
            // Constructing header
            Row row = new Row();

            row.Append(
                ConstructCell("Code", CellValues.String), // Change 2
                ConstructCell("Description", CellValues.String));

            // Insert the header row to the Sheet Data
            sheetData.AppendChild(row);


            foreach (var reItem in output)
            {
                row = new Row();

                row.Append(
                    ConstructCell(reItem.Code.ToString(), **CellValues.String**),
                    ConstructCell(reItem.Description, CellValues.String)
                    );

                sheetData.AppendChild(row);
            }


            newWorksheetPart.Worksheet.Save();
            document.WorkbookPart.Workbook.Save();
            document.Save();


        }

        //string csv = String.Join(",", output.Select(x => x.ToString()).ToArray());


    }
0 голосов
/ 07 декабря 2018

Мне кажется, проблема в том, что вы объявляете листовые данные, поскольку листовые данные уже должны существовать.

try

SheetData sheetData = newWorksheetPart.Worksheet.GetFirstChild<SheetData>();
...