Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的Excel表格程序是用OpenXml创建的,在打开文件时会抛出错误?_C#_Excel_Openxml_Openxml Table - Fatal编程技术网

C# 为什么我的Excel表格程序是用OpenXml创建的,在打开文件时会抛出错误?

C# 为什么我的Excel表格程序是用OpenXml创建的,在打开文件时会抛出错误?,c#,excel,openxml,openxml-table,C#,Excel,Openxml,Openxml Table,编辑:出于我项目的需要,我将使用EPPlus(感谢Tsahi Asher的评论)软件包,该软件包非常适合我们操作Excel和包装OpenXML所需的内容。 我这个项目的问题已经解决了,但是我仍然对我的问题的答案很好奇,所以请随意回答,我将非常感激 我正在做一个项目,我必须生成一个Excel文件,然后通过电子邮件发送。 为了解决目前互操作的问题,我们正在使用OpenXML创建Excel文件,因此对于我们的团队来说这是一个非常新的任务(1个月左右)。 我在创建该文件时没有太多问题,该文件是一个简单的

编辑:出于我项目的需要,我将使用EPPlus(感谢Tsahi Asher的评论)软件包,该软件包非常适合我们操作Excel和包装OpenXML所需的内容。
我这个项目的问题已经解决了,但是我仍然对我的问题的答案很好奇,所以请随意回答,我将非常感激

我正在做一个项目,我必须生成一个Excel文件,然后通过电子邮件发送。
为了解决目前互操作的问题,我们正在使用OpenXML创建Excel文件,因此对于我们的团队来说这是一个非常新的任务(1个月左右)。

我在创建该文件时没有太多问题,该文件是一个简单的文档,有三个表,共有两列。
问题是,当我尝试打开先前生成的.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();
SpreadsheetDocument xl=SpreadsheetDocument.Create(路径ID,SpreadsheetDocumentType.工作簿);
WorkbookPart wbp=xl.AddWorkbookPart();
工作表部件wsp=wbp.AddNewPart();
工作簿wb=新工作簿();
DocumentFormat.OpenXml.Spreadsheet.FileVersion fv=新的DocumentFormat.OpenXml.Spreadsheet.FileVersion();
fv.ApplicationName=“Microsoft Office Excel”;
工作表ws=新工作表();
SheetData sd=新的SheetData();
Workbookstypespart wbsp=wbp.AddNewPart();
wbsp.Stylesheet=CreateStylesheet();
wbsp.Stylesheet.Save();
Columns=新列();
Append(CreateColumnData(1,1110));
Append(CreateColumnData(2,2,20));
追加(列);
//在单元格中插入数据
ws.Append(sd);
wsp.Worksheet=ws;
wsp.Worksheet.Save();
板材=新板材();
板材=新板材();
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);
附页(页);
wb.Append(fv);
wb.追加(张);
TableParts TableParts=newtableparts(){Count=(uint32值)3U};
Append(newtablepart(){Id=“rId1”});
Append(newtablepart(){Id=“rId2”});
Append(newtablepart(){Id=“rId3”});
wsp.Worksheet.Append(tableParts);
//第一个表创建,与第二个表完全相同,只是列名称不同
//开始创建第二个表
TableDefinitionPart tableDefinitionPart2=wsp.AddNewPart(“rId2”);
var tableDimension2=“A”+_savedIndex1+”:B”+(_savedIndex1+4);
表2=新表()
{
Id=(UINT32值)2U,
Name=“表2”,
DisplayName=“表2”,
参考=表2,
TotalsRowShown=false,
};
TableColumns tableColumns2=新的TableColumns(){Count=(uint32值)2U};
TableColumn tableColumn12=newtableColumn(){Id=(UInt32Value)1U,Name=“Product Name”};
TableColumn tableColumn22=newtableColumn(){Id=(UInt32Value)2U,Name=“Total qty”};
tableColumns2.追加(tableColumn12);
tableColumns2.追加(TableColumns22);
TableStyleInfo tableStyleInfo2=新的TableStyleInfo()
{
Name=“TableStyleLight1”,
ShowFirstColumn=false,
ShowLastColumn=false,
showrowstrips=true,
showcolumnstrips=false,
};
表2.追加(表2);
表2.Append(表样式信息2);
表定义第2部分。表=表2;
//第二个表创建结束
//第三个表创建,与第二个表完全相同,只是列名称不同
xl.WorkbookPart.Workbook=wb;
xl.WorkbookPart.Workbook.Save();
xl.Close();
我已经尝试通过解压.xlxs来直接搜索xml文件,但是我没有注意到这个表2和表1/3之间的任何差异。
即使在Excel修复了文件之后,我也尝试再次解压,Excel添加到Table2的内容也被添加到Table1/Table3,因此我真的不知道为什么Table2会阻止该文件正确打开。
我还尝试删除表2,并保持表1/3不变(仅更改id),它工作得非常好,所以我非常确定我的问题确实来自表2

那么,我的问题来自哪里?我犯了什么错误,错过了什么?


任何提示都将不胜感激,因为OpenXml对我来说是全新的。

我强烈建议使用它。它是OpenXMLAPI的包装器,大大简化了Excel文件的生成。Excel文件格式非常复杂,您必须知道使用OpenXML SDK的确切XML模式,而EPPlus会为您这样做。@TsahiAsher感谢您的建议,我会看看这一点,如果它符合我们的要求,我会将其提交给我们的团队needs@TsahiAsher非常感谢这个软件包,我们现在将使用它来处理Excel。添加了一个编辑,告知我已找到解决方案,即使我仍然对这里的问题感到好奇。您是否能够显示您正在填充单元格a和B的内容?我有一种预感,这就是问题所在。@petelids我只是用一个字符串填充一列(格式->“reference1/reference2 name”)和一个双精度的B(但从来没有小数,所以基本上与单元格中的int相同)。这两列都保留了默认的numberFormat,因为这在这里并不重要。对于第三列,数量列(B)保留为空,但仍有产品名称。我强烈建议使用。它是OpenXMLAPI的包装器,大大简化了Excel文件的生成。Excel文件格式非常复杂,您必须知道确切的XML模式才能使用OpenXMLSDK,而EPPlus可以为您做到这一点。@TsahiAsher感谢您的帮助