Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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表格验证/公式未复制到新表格行_C#_Excel_Openxml_Openxml Sdk_Epplus - Fatal编程技术网

C# Excel表格验证/公式未复制到新表格行

C# Excel表格验证/公式未复制到新表格行,c#,excel,openxml,openxml-sdk,epplus,C#,Excel,Openxml,Openxml Sdk,Epplus,我目前正在使用EPPlus库将大量数据导出到多个工作表和每个工作表的表中 我已经能够创建列表验证,并通过名为range perfectly fine的查找工作表使其工作。然而,我遇到了一些奇怪的行为,我一直无法理解 开始: 我下载文件。我打开文件。我选择了一个带有表格的电子表格,表格中有多行,有一个列表验证列,带有从下拉列表中选择“是/否”的选项。每行都有此列表验证 情景1: 然后,通过从excel表的右下角拖动创建新行,在excel表中创建新行。公式未复制到新行。我现在已丢失excel表中新行

我目前正在使用EPPlus库将大量数据导出到多个工作表和每个工作表的表中

我已经能够创建列表验证,并通过名为range perfectly fine的查找工作表使其工作。然而,我遇到了一些奇怪的行为,我一直无法理解

开始:

我下载文件。我打开文件。我选择了一个带有表格的电子表格,表格中有多行,有一个列表验证列,带有从下拉列表中选择“是/否”的选项。每行都有此列表验证

情景1:

然后,通过从excel表的右下角拖动创建新行,在excel表中创建新行。公式未复制到新行。我现在已丢失excel表中新行的验证

情景2:

我删除了excel表中的所有现有行,但第一行除外(在“是/否”列中仍然包含列表验证)。然后,我通过从excel表的右下角拖动来创建新行,从而在excel表中创建新行

公式被复制到新行,我现在可以使用提供的验证将新的有效数据插入此行

我的代码逻辑:

每个单元格都通过一个循环应用验证,该循环获取单元格需要的验证类型(即编号、日期、列表、大于、小于等)。通过命名的表查找地址访问列表验证。没有XML输出错误,文件打开良好,我可以从单元格访问列表验证,没有任何问题

我尝试解决此问题的方法:

1)填充单元格区域,然后从该区域创建excel表格。 -这背后的想法是,首先创建一个数据选择,然后选择范围并将其转换为excel表。默认情况下,表中的新行只是从上面的行复制公式。因此,这个解决方案似乎是合乎逻辑的

2)在一系列未填充的单元格上创建excel表格,然后填充此区域。 -这背后的想法是,EPPlus在工作表中创建表的方式可能存在缺陷,或者可能存在XML元素顺序问题,实际上只是一个实验性的更改

守则:

var-strategy=strategy.CreateTableFirst;
ExcelRange subRowDataRange=null;
ExcelTable table=null;
if(strategy==strategy.CreateTableFirst)
{
subRowDataRange=WORKEM.Cells[headerRowIndex,WORKEM.Dimension.Start.Column,ToRow:headerRowIndex+groupedRowData.Count(),ToCol:dataFields.Count()];
table=工作表.Tables.Add(subRowDataRange,名称:null);//自动生成Excel表名
table.TableStyle=TableStyles.Light13;
}
foreach(数据字段中的var字段)
{
//标题
if(strategy==strategy.CreateTableFirst)
{
table.Columns[dataFields.IndexOf(field)].Name=field.Name;
}
其他的
{
工作表.Cells[headerRowIndex,columnIndex].Value=field.Name;
}
//帮助文本
if(field.HelpText.HasValue())
{
工作表.Cells[headerRowIndex,columnIndex].AddComment(field.HelpText,作者:“系统”);
}
int dataRowIndex=HeaderRowWindex+1;//数据表中的第一行
if(groupedRowData.None())
{
工作表.Cells[dataRowIndex,columnIndex].Set(字段,所有者:所有者,rowIndex:null,addValidation:true);
}
//添加子窗口
foreach(groupedRowData中的var rowData)
{
工作表.Cells[dataRowIndex,columnIndex].Set(字段,所有者:所有者,rowIndex:rowData.Key,addValidation:true);
dataRowIndex++;
}
columnIndex++;
}
if(strategy==strategy.CreateTableLast)
{
subRowDataRange=WORKEM.Cells[headerRowIndex,WORKEM.Dimension.Start.Column,ToRow:WORKEM.Dimension.End.Row+1,ToCol:dataFields.Count()];
table=工作表.Tables.Add(subRowDataRange,名称:null);
table.TableStyle=TableStyles.Light13;
}
}

这是excel中代码后的输出表:

有趣的是,如果我手动创建表并使用数据设置第一行,然后向下拖动以创建新行,那么单元格验证将被复制到下一行。我不确定如何才能导出多行数据,并确保当用户插入新行时,验证会被复制下来

我下载了MicrosoftXMLSDK,将excel表格与excel表格中的1行(然后我可以向下拖动该表格以使用复制的公式创建第二行)和原始下载的excel文件进行比较

结果与XML输出中的excel表几乎相同

此外,删除行并保存文件以进行比较后,似乎没有什么不合适的地方

有没有EPPlus大师有什么想法


更新:30/04/2015。客户理解问题并接受问题的本质。没有找到解决办法

我不熟悉EPPlus,但我以前在VBA中遇到过这个问题,并且能够通过使用VBA脚本强制填充表格,该脚本如下所示:

LastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
Range(Cells(TopRowOfTable,ColumnOfTableRow1),Cells(LastRow,ColumnOfTableRow1).Filldown
基本上只是找到最后一行,然后使用filldown命令强制填充字段