Почему моя таблица Excel программно создается с ошибками OpenXml при открытии файла? - PullRequest
0 голосов
/ 27 февраля 2019

РЕДАКТИРОВАТЬ: Для нужд моего проекта я буду работать с пакетом EPPlus (благодаря комментарию Цахи Ашера), который идеально вписывается в то, что нам нужно для работы с Excel и обертывания OpenXML.
Моя проблема для этого проекта так решена, но мне все еще довольно любопытно ответить на мой вопрос, поэтому не стесняйтесь отвечать, буду очень признателен.

Я работаюв проекте, где мне нужно сгенерировать файл Excel, а затем отправить его по электронной почте.
Чтобы у нас были проблемы с тем, чтобы Interop работал сейчас, мы используем OpenXML для создания наших файлов Excel, так что это довольно ново для нашей команды (1месяц или что-то в этом роде).

У меня не так много проблем с созданием файла, который представляет собой простой документ с 3 таблицами из двух столбцов.
Проблема заключается в том, что при попытке открытьранее сгенерированный файл .xslx, у меня появилось всплывающее окно, которое говорит мне:

Мы обнаружили проблему с некоторым содержимым в 'file.xlsx'.Вы хотите, чтобы мы попытались восстановить столько, сколько мы можем?Если вы доверяете источнику этой книги, нажмите «Да».

Если я нажму «Да», файл будет восстановлен и будет отображаться точно так, как я хотел бы, с сообщением:

Восстановленные записи: Таблица из /xl/tables/table2.xml part (Таблица)

Вот краткий код, в котором я создаю эту таблицу:

SpreadsheetDocument xl = SpreadsheetDocument.Create(pathID, SpreadsheetDocumentType.Workbook);
WorkbookPart wbp = xl.AddWorkbookPart();
WorksheetPart wsp = wbp.AddNewPart<WorksheetPart>();
Workbook wb = new Workbook();
DocumentFormat.OpenXml.Spreadsheet.FileVersion fv = new DocumentFormat.OpenXml.Spreadsheet.FileVersion();
fv.ApplicationName = "Microsoft Office Excel";
Worksheet ws = new Worksheet();
SheetData sd = new SheetData();

WorkbookStylesPart wbsp = wbp.AddNewPart<WorkbookStylesPart>();
wbsp.Stylesheet = CreateStylesheet();
wbsp.Stylesheet.Save();

Columns columns = new Columns();
columns.Append(CreateColumnData(1, 1, 110));
columns.Append(CreateColumnData(2, 2, 20));
ws.Append(columns);

// Insert data in cells

ws.Append(sd);
wsp.Worksheet = ws;
wsp.Worksheet.Save();
Sheets sheets = new Sheets();
Sheet sheet = new Sheet();

CultureInfo ciCurr = CultureInfo.CurrentCulture;
sheet.Name = "Week " + ciCurr.Calendar.GetWeekOfYear(now.AddDays(-7),
  CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
sheet.SheetId = 1;
sheet.Id = wbp.GetIdOfPart(wsp);
sheets.Append(sheet);
wb.Append(fv);
wb.Append(sheets);

TableParts tableParts = new TableParts() { Count = (UInt32Value)3U };
tableParts.Append(new TablePart() { Id = "rId1" });
tableParts.Append(new TablePart() { Id = "rId2" });
tableParts.Append(new TablePart() { Id = "rId3" });

wsp.Worksheet.Append(tableParts);

// First Table creation, exactly same as 2nd except column names

// Beginning of second table creation
TableDefinitionPart tableDefinitionPart2 = wsp.AddNewPart<TableDefinitionPart>("rId2");
var tableDimension2 = "A" + _savedIndex1 + ":B" + (_savedIndex1 + 4);
Table table2 = new Table()
    {
        Id = (UInt32Value)2U,
        Name = "Table2",
        DisplayName = "Table2",
        Reference = tableDimension2,
        TotalsRowShown = false,
    };

TableColumns tableColumns2 = new TableColumns() { Count = (UInt32Value)2U };

TableColumn tableColumn12 = new TableColumn() { Id = (UInt32Value)1U, Name = "Product Name" };
TableColumn tableColumn22 = new TableColumn() { Id = (UInt32Value)2U, Name = "Total qty" };

tableColumns2.Append(tableColumn12);
tableColumns2.Append(tableColumn22);

TableStyleInfo tableStyleInfo2 = new TableStyleInfo()
    {
        Name = "TableStyleLight1",
        ShowFirstColumn = false,
        ShowLastColumn = false,
        ShowRowStripes = true,
        ShowColumnStripes = false,
    };

table2.Append(tableColumns2);
table2.Append(tableStyleInfo2);
tableDefinitionPart2.Table = table2;
// End of second table creation

// Third Table creation, exactly same as 2nd except column names

xl.WorkbookPart.Workbook = wb;
xl.WorkbookPart.Workbook.Save();
xl.Close();

Я уже пытался выполнить прямой поиск в файлах xml, разархивировав .xlxs, но я не заметил каких-либо различий между таблицами Table2 и Table1 / Table3.
Даже после того, как Excel восстановил файл, я попытался снова разархивировать, и то, что Excel добавил в Table2, было также добавлено в Table1 / Table3, поэтому я действительно не догадываюсь, почему этот Table2 останавливает этот файл для правильного открытия.
Я также пытался удалить Table2 и оставил Table1 / Table3, как они есть (только изменить идентификатор), и это сработало отлично, поэтому я уверен, что моя проблема действительно исходит из Table2.

Итак, откуда моя проблема?В чем мои ошибки и что я пропустил?

Любой намек будет полезен, так как OpenXml для меня довольно нов.

...