编辑:对于我的项目,我将使用EPPlus软件包(感谢Tsahi Asher的评论),该软件包非常适合我们处理Excel和包装OpenXML的需求。
我这个项目的问题已经解决了,但是我对问题的答案仍然很好奇,所以随时回答,将不胜感激。
我正在一个项目中,我必须生成一个Excel文件,然后通过电子邮件将其发送。
为了让我们暂时无法使用Interop,我们使用OpenXML创建Excel文件,因此对于我们的团队来说,这是一个全新的功能(1个月左右)。
创建文件没有太多问题,这是一个包含两列3个表的简单文档。
问题是当我尝试打开先前生成的.xslx文件时,弹出了告诉我:
我们在'file.xlsx'中发现了一些内容问题。您是否希望我们尽力恢复原状?如果您信任此工作簿的来源,请单击“是”。
如果我单击“是”,它将修复文件,并完全按照我的意愿显示,并显示一条消息:
已修复的记录:/xl/tables/table2.xml部分中的表(表)
这是我创建此表的简短代码:
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();
我已经尝试通过解压缩.xlxs直接搜索xml文件,但是我没有注意到此Table2和Table1 / Table3之间有任何区别。
即使在Excel修复文件后,我也尝试再次解压缩,并且添加到Table2的Excel也添加到了Table1 / Table3,所以我真的不知道为什么这个Table2阻止了此文件的正常打开。
我还尝试删除了Table2并保留了Table1 / Table3的位置(仅更改ID),并且效果很好,所以我很确定我的问题确实出在Table2。
那么,我的问题来自哪里?我的错误是什么,我错过了什么?
由于OpenXml对我来说还很陌生,因此任何提示都将不胜感激。