Вставка WorkSheet с Open XML — нечитаемое содержимое

Когда я следую этому руководству:

http://msdn.microsoft.com/en-us/library/cc881781.aspx

чтобы открыть документ Excel и вставить пустой рабочий лист, конечным результатом будет сообщение «Excel обнаружил нечитаемое содержимое в ... Вы хотите восстановить содержимое этой книги ...». Если я восстановлю все вставленные листы пустыми (даже если я добавлю содержимое программно)

После переименования xlsx в .zip и его изучения видно, что рабочие листы созданы и содержимое добавлено.

У кого-нибудь есть похожие проблемы? Это может быть что-то с не созданием отношений между вновь созданными частями...


person Gomiunik    schedule 30.11.2010    source источник
comment
Я скопировал пример C# из нижней части учебника, и у меня он работал нормально. Не могли бы вы опубликовать свой код?   -  person Chris Spicer    schedule 30.11.2010


Ответы (1)


Это сообщение об ошибке означает, что XML, из которого состоит ваш документ Excel, не соответствует XML-схеме и недействителен. Вы можете использовать Open XML SDK 2.0 Инструмент повышения производительности, чтобы узнать, где находится проблема.

Я также скопировал код из нижней части вашей ссылки и заставил его работать, как сказал Крис в своем комментарии. Ваш код выглядит так, как показано ниже?

// Open the document for editing.
using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true)) 
{
    // Add a blank WorksheetPart.
    WorksheetPart newWorksheetPart = 
       spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
    newWorksheetPart.Worksheet = new Worksheet(new SheetData());

    Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
    string relationshipId = 
       spreadSheet.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 = "Sheet" + sheetId;

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

    string docName = @"C:\Users\Public\Documents\Sheet7.xlsx";
    InsertWorksheet(docName);
}

// Given a document name, inserts a new worksheet.
public static void InsertWorksheet(string docName)
{
    // Open the document for editing.
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
    {
        // Add a blank WorksheetPart.
        WorksheetPart newWorksheetPart = spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
        newWorksheetPart.Worksheet = new Worksheet(new SheetData());

        Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
        string relationshipId = spreadSheet.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 = "Sheet" + sheetId;

        // Append the new worksheet and associate it with the workbook.
        Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
        sheets.Append(sheet);
    }
}
person amurra    schedule 30.11.2010
comment
Да спасибо. Я переделал весь код с нуля. Мой пример был немного сложнее — создание листов в цикле for. Похоже, проблема заключалась в использовании одной и той же переменной для вновь созданных листов, и все это испортилось из-за неправильных идентификаторов отношений. - person Gomiunik; 02.12.2010