首页 > 解决方案 > 为什么我的 Excel 表格在打开文件时使用 OpenXml 以编程方式创建并引发错误?

问题描述

编辑:为了我的项目的需要,我将使用 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修复文件后,我再次尝试解压缩,Excel添加到Table2的内容也添加到了Table1/Table3,所以我真的不知道为什么这个Table2会阻止这个文件正常打开。
我还尝试删除 Table2 并将 Table1/Table3 保持原样(仅更改 id)并且它运行良好,所以我很确定我的问题确实来自 Table2。

那么,我的问题从何而来?我的错误是什么,我错过了什么?

任何提示都会受到赞赏,因为 OpenXml 对我来说很新。

标签: c#excelopenxmlopenxml-table

解决方案


推荐阅读