РЕДАКТИРОВАТЬ: Для нужд моего проекта я буду работать с пакетом 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 для меня довольно нов.