为什么打开文件时以编程方式创建带有OpenXml的Excel表?

时间:2019-02-27 09:03:30

标签: c# excel openxml openxml-table

  

编辑:对于我的项目,我将使用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对我来说还很陌生,因此任何提示都将不胜感激。

0 个答案:

没有答案