Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.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# OpenXML-表格创建,如何在不需要excel修复的情况下创建表格_C#_Excel_Openxml Sdk - Fatal编程技术网

C# OpenXML-表格创建,如何在不需要excel修复的情况下创建表格

C# OpenXML-表格创建,如何在不需要excel修复的情况下创建表格,c#,excel,openxml-sdk,C#,Excel,Openxml Sdk,我正在创建多个电子表格(单独的文件),每个电子表格包含多个电子表格,当我在excel中打开其中一个电子表格的输出文件时,它会询问我是否要修复它(这仅在我添加表格时发生),并显示修复的内容: Repaired Records: Table from /xl/tables/table1.xml part (Table) 修复后,文件的格式正确,但由于这是自动化的,我无法回复使用excel修复这些文件。只有在创建表时才会导致此问题 例如:我使用以下参数调用Define Table方法来创建一个包含1

我正在创建多个电子表格(单独的文件),每个电子表格包含多个电子表格,当我在excel中打开其中一个电子表格的输出文件时,它会询问我是否要修复它(这仅在我添加表格时发生),并显示修复的内容:

Repaired Records: Table from /xl/tables/table1.xml part (Table)
修复后,文件的格式正确,但由于这是自动化的,我无法回复使用excel修复这些文件。只有在创建表时才会导致此问题

例如:我使用以下参数调用Define Table方法来创建一个包含11行(包括第2-12行)和8列(包括第1-8行)的表:

可定义的方法如下所示:

private static void DefineTable(WorksheetPart worksheetPart, int rowMin, int rowMax, int colMin, int colMax)
    {
        TableDefinitionPart tableDefinitionPart = worksheetPart.AddNewPart<TableDefinitionPart>("rId" + (worksheetPart.TableDefinitionParts.Count() + 1));
        int tableNo = worksheetPart.TableDefinitionParts.Count();

        string reference = ((char)(64 + colMin)).ToString() + rowMin + ":" + ((char)(64 + colMax)).ToString() + rowMax;

        Table table = new Table() { Id = (UInt32)tableNo, Name = "Table" + tableNo, DisplayName = "Table" + tableNo, Reference = reference, TotalsRowShown = false };
        AutoFilter autoFilter = new AutoFilter() { Reference = reference };

        TableColumns tableColumns = new TableColumns() { Count = (UInt32)(colMax - colMin + 1) };
        for (int i = 0; i < (colMax - colMin + 1); i++)
        {
            tableColumns.Append(new TableColumn() { Id = (UInt32)(i + 1), Name = "Column" + i });
        }

        TableStyleInfo tableStyleInfo = new TableStyleInfo() { Name = "TableStyleLight1", ShowFirstColumn = false, ShowLastColumn = false, ShowRowStripes = true, ShowColumnStripes = false };

        table.Append(autoFilter);
        table.Append(tableColumns);
        table.Append(tableStyleInfo);

        tableDefinitionPart.Table = table;

        TableParts tableParts = new TableParts() { Count = (UInt32)1 };
        TablePart tablePart = new TablePart() { Id = "rId" + tableNo };

        tableParts.Append(tablePart);

        worksheetPart.Worksheet.Append(tableParts);
    }
private static void DefineTable(工作表部分工作表部分,int rowMin,int rowMax,int colMin,int colMax)
{
TableDefinitionPart TableDefinitionPart=worksheetPart.AddNewPart(“rId”+(worksheetPart.TableDefinitionParts.Count()+1));
int tableNo=worksheetPart.TableDefinitionParts.Count();
字符串引用=((char)(64+colMin)).ToString()+rowMin+:“+((char)(64+colMax)).ToString()+rowMax;
Table Table=new Table(){Id=(UInt32)tableNo,Name=“Table”+tableNo,DisplayName=“Table”+tableNo,Reference=Reference,TotalsRowShown=false};
AutoFilter AutoFilter=new AutoFilter(){Reference=Reference};
TableColumns TableColumns=newtableColumns(){Count=(UInt32)(colMax-colMin+1)};
对于(int i=0;i<(colMax-colMin+1);i++)
{
Append(newtableColumn(){Id=(UInt32)(i+1),Name=“Column”+i});
}
TableStyleInfo TableStyleInfo=new TableStyleInfo(){Name=“TableStyleLight1”,ShowFirstColumn=false,ShowLastColumn=false,ShowRowStripes=true,ShowColumnStripes=false};
表.追加(自动筛选);
table.Append(tableColumns);
table.Append(tableStyleInfo);
tableDefinitionPart.Table=表格;
TableParts TableParts=newtableparts(){Count=(UInt32)1};
TablePart TablePart=newtablepart(){Id=“rId”+tableNo};
tableParts.Append(tablePart);
工作表部分。工作表。附加(tableParts);
}
我不知道为什么表的构造不正确,如果能得到任何帮助来解决这个问题,我将不胜感激

我还将包括修复前后的table1.xml: table1.xml修复前:

<?xml version="1.0" encoding="utf-8" ?>
<x:table id="1" name="Table1" displayName="Table1" ref="A2:H12" 
totalsRowShown="0" 
xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
 <x:autoFilter ref="A2:H12"/>
 <x:tableColumns count="8">
  <x:tableColumn id="1" name="Column0"/>
  <x:tableColumn id="2" name="Column1"/>
  <x:tableColumn id="3" name="Column2"/>
  <x:tableColumn id="4" name="Column3"/>
  <x:tableColumn id="5" name="Column4"/>
  <x:tableColumn id="6" name="Column5"/>
  <x:tableColumn id="7" name="Column6"/>
  <x:tableColumn id="8" name="Column7"/>
 </x:tableColumns>
 <x:tableStyleInfo name="TableStyleLight1" showFirstColumn="0" 
showLastColumn="0" showRowStripes="1" showColumnStripes="0"/>
</x:table>

table1.xml修复后:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" 
xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" 
mc:Ignorable="xr xr3" xr:uid="{00000000-000C-0000-FFFF-FFFF00000000}" id="1" 
name="Table1" displayName="Table1" ref="A2:H12" totalsRowShown="0">
 <autoFilter xr:uid="{00000000-0009-0000-0100-000001000000}" ref="A2:H12"/>
 <tableColumns count="8">
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000001000000}" id="1" 
name="Column0"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000002000000}" id="2" 
name="Column1"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000003000000}" id="3" 
name="Column2"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000004000000}" id="4" 
name="Column3"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000005000000}" id="5" 
name="Column4"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000006000000}" id="6" 
name="Column5"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000007000000}" id="7" 
name="Column6"/>
  <tableColumn xr3:uid="{00000000-0010-0000-0000-000008000000}" id="8" 
name="Column7"/>
 </tableColumns>
 <tableStyleInfo name="TableStyleLight1" showFirstColumn="0" 
showLastColumn="0" showRowStripes="1" showColumnStripes="0"/>
</table>


提前感谢。

我为同一问题争论了好几天。我正在使用OpenXML动态创建一个Excel电子表格。在我尝试添加一张桌子之前,一切都很顺利。一旦我这样做了,我就在打开电子表格时不断收到警告,说它需要修理


我最终通过将列标题文本添加到电子表格数据中解决了这个问题。例如,如果我在单元格A1:C7上有一个定义了两列(名称为“Column1”和“Column2”)的表格,除了添加表格和列外,我还将文本“Column1”添加到单元格A1,将文本“Column2”添加到单元格B1。

您需要为指定的列值添加单元格值,并且只需定义一次
TableParts

此外,对于偏移列的重复使用,必须将列id添加到
colMin
变量中

有了这些变化,它应该会起作用

public static Table DefineTable(WorksheetPart worksheetPart, int rowMin, int rowMax, int colMin, int colMax)
    {
        TableDefinitionPart tableDefinitionPart = worksheetPart.AddNewPart<TableDefinitionPart>("rId" + (worksheetPart.TableDefinitionParts.Count() + 1));
        int tableNo = worksheetPart.TableDefinitionParts.Count();

        string reference = ((char)(64 + colMin)).ToString() + rowMin + ":" + ((char)(64 + colMax)).ToString() + rowMax;

        Table table = new Table() { Id = (UInt32)tableNo, Name = "Table" + tableNo, DisplayName = "Table" + tableNo, Reference = reference, TotalsRowShown = false };
        AutoFilter autoFilter = new AutoFilter() { Reference = reference };

        TableColumns tableColumns = new TableColumns() { Count = (UInt32)(colMax - colMin + 1) };
        for (int i = 0; i < (colMax - colMin + 1); i++)
        {
            tableColumns.Append(new TableColumn() { Id = (UInt32)(colMin + i), Name = "Column" + i }); //changed i+1 -> colMin + i
            //Add cell values (shared string)
        }

        TableStyleInfo tableStyleInfo = new TableStyleInfo() { Name = "TableStyleLight1", ShowFirstColumn = false, ShowLastColumn = false, ShowRowStripes = true, ShowColumnStripes = false };

        table.Append(autoFilter);
        table.Append(tableColumns);
        table.Append(tableStyleInfo);

        tableDefinitionPart.Table = table;
        
        TableParts tableParts = (TableParts)worksheetPart.Worksheet.ChildElements.Where(ce => ce is TableParts).FirstOrDefault(); // Add table parts only once
        if (tableParts is null )
        {
            tableParts = new TableParts();
            tableParts.Count = (UInt32)0;
            worksheetPart.Worksheet.Append(tableParts);
        }

        tableParts.Count += (UInt32)1;
        TablePart tablePart = new TablePart() { Id = "rId" + tableNo };

        tableParts.Append(tablePart);

        return table;
    }
公共静态表定义表(工作表部分工作表部分,int-rowMin,int-rowMax,int-colMin,int-colMax)
{
TableDefinitionPart TableDefinitionPart=worksheetPart.AddNewPart(“rId”+(worksheetPart.TableDefinitionParts.Count()+1));
int tableNo=worksheetPart.TableDefinitionParts.Count();
字符串引用=((char)(64+colMin)).ToString()+rowMin+:“+((char)(64+colMax)).ToString()+rowMax;
Table Table=new Table(){Id=(UInt32)tableNo,Name=“Table”+tableNo,DisplayName=“Table”+tableNo,Reference=Reference,TotalsRowShown=false};
AutoFilter AutoFilter=new AutoFilter(){Reference=Reference};
TableColumns TableColumns=newtableColumns(){Count=(UInt32)(colMax-colMin+1)};
对于(int i=0;i<(colMax-colMin+1);i++)
{
Append(newtableColumn(){Id=(UInt32)(colMin+i),Name=“Column”+i});//更改了i+1->colMin+i
//添加单元格值(共享字符串)
}
TableStyleInfo TableStyleInfo=new TableStyleInfo(){Name=“TableStyleLight1”,ShowFirstColumn=false,ShowLastColumn=false,ShowRowStripes=true,ShowColumnStripes=false};
表.追加(自动筛选);
table.Append(tableColumns);
table.Append(tableStyleInfo);
tableDefinitionPart.Table=表格;
TableParts TableParts=(TableParts)worksheetPart.Worksheet.ChildElements.Where(ce=>ce是TableParts.FirstOrDefault();//只添加一次表部件
如果(tableParts为空)
{
tableParts=新的tableParts();
tableParts.Count=(UInt32)0;
工作表部分。工作表。附加(tableParts);
}
tableParts.Count+=(UInt32)1;
TablePart TablePart=newtablepart(){Id=“rId”+tableNo};
tableParts.Append(tablePart);
返回表;
}

您是否尝试过使用调试器单步执行代码?是的,我尝试过使用调试器,但没有发现问题。我试着在一个电子表格的两张不同的表中添加3个表,我注意到修复的记录是针对表1到表6的。这使我认为可能需要将TableID从第1页的1-3和第2页的1-3更改为第1页的1-3和第2页的4-6。我建议您使用开放式XML SDK生产力工具来跟踪代码中的问题。创建有问题的最小工作簿。打开工作簿,让E
public static Table DefineTable(WorksheetPart worksheetPart, int rowMin, int rowMax, int colMin, int colMax)
    {
        TableDefinitionPart tableDefinitionPart = worksheetPart.AddNewPart<TableDefinitionPart>("rId" + (worksheetPart.TableDefinitionParts.Count() + 1));
        int tableNo = worksheetPart.TableDefinitionParts.Count();

        string reference = ((char)(64 + colMin)).ToString() + rowMin + ":" + ((char)(64 + colMax)).ToString() + rowMax;

        Table table = new Table() { Id = (UInt32)tableNo, Name = "Table" + tableNo, DisplayName = "Table" + tableNo, Reference = reference, TotalsRowShown = false };
        AutoFilter autoFilter = new AutoFilter() { Reference = reference };

        TableColumns tableColumns = new TableColumns() { Count = (UInt32)(colMax - colMin + 1) };
        for (int i = 0; i < (colMax - colMin + 1); i++)
        {
            tableColumns.Append(new TableColumn() { Id = (UInt32)(colMin + i), Name = "Column" + i }); //changed i+1 -> colMin + i
            //Add cell values (shared string)
        }

        TableStyleInfo tableStyleInfo = new TableStyleInfo() { Name = "TableStyleLight1", ShowFirstColumn = false, ShowLastColumn = false, ShowRowStripes = true, ShowColumnStripes = false };

        table.Append(autoFilter);
        table.Append(tableColumns);
        table.Append(tableStyleInfo);

        tableDefinitionPart.Table = table;
        
        TableParts tableParts = (TableParts)worksheetPart.Worksheet.ChildElements.Where(ce => ce is TableParts).FirstOrDefault(); // Add table parts only once
        if (tableParts is null )
        {
            tableParts = new TableParts();
            tableParts.Count = (UInt32)0;
            worksheetPart.Worksheet.Append(tableParts);
        }

        tableParts.Count += (UInt32)1;
        TablePart tablePart = new TablePart() { Id = "rId" + tableNo };

        tableParts.Append(tablePart);

        return table;
    }