Excel表格validation/公式不被复制到新表格行

我目前正在使用EPPlus库来将大量数据导出到这些工作表中的几个工作表和表格中。

我已经能够创build列表validation,并通过名为范围的查找工作表完全正常工作。 但是,我遇到了一些我一直无法想象的奇怪的行为。

开始:

我下载文件。 我打开文件。 我select一个包含表格的电子表格,表格中有多行,有一个列表validation列,选项是/否从下拉列表中select。 每一行都有这个列表validation。

情况1:

然后,我通过从Excel表格的右下angular拖动来创build新行,在Excel表格中创build一个新行。 该公式未复制到新行。 我现在已经失去了在我的Excel表中新行的validation。

情景2:

我删除了Excel表中的所有现有行,第一行除外(仍然包含“是/否”列中的列表validation)。 我然后通过从Excel表格的右下angular拖动来创build新行,在Excel表格中创build一个新行。

公式被复制到新行,我现在可以通过使用提供的validation插入新的有效数据到这一行。

我的代码的逻辑:

每个单元格都有一个循环validation应用到它的单元格需要具有的validationtypes(即数量,date,列表,大于,小于等)。 列表validation通过指定的表查找地址进行访问。 有没有XML输出错误,文件打开罚款,我可以从单元格访问列表validation没有任何问题。

我试图解决这个问题的事情:

1)填充单元格范围,然后从这个范围创buildexcel表格。 – 这背后的想法是,首先有一个创build的数据select,然后select范围,只是把它变成一个Excel表。 对于表中的新行,默认行为是从上面的行复制公式。 所以这个解决scheme似乎合乎逻

2)在一系列未填充的单元格上创build一个Excel表格,然后填写该范围。 – 背后的想法是,EPPlus在工作表中创build表格的方式可能存在一个错误,或者XML元素的顺序可能存在问题,实际上只是一个实验性更改。

代码:

var strategy = Strategy.CreateTableFirst; ExcelRange subRowDataRange = null; ExcelTable table = null; if (strategy == Strategy.CreateTableFirst) { subRowDataRange = worksheet.Cells[headerRowIndex, worksheet.Dimension.Start.Column, ToRow: headerRowIndex + groupedRowData.Count(), ToCol: dataFields.Count()]; table = worksheet.Tables.Add(subRowDataRange, Name: null); // Auto generate Excel table name table.TableStyle = TableStyles.Light13; } foreach (var field in dataFields) { // Headers if (strategy == Strategy.CreateTableFirst) { table.Columns[dataFields.IndexOf(field)].Name = field.Name; } else { worksheet.Cells[headerRowIndex, columnIndex].Value = field.Name; } // Help Text if (field.HelpText.HasValue()) { worksheet.Cells[headerRowIndex, columnIndex].AddComment(field.HelpText, Author: "System"); } int dataRowIndex = headerRowIndex + 1; // First row in the datatable if (groupedRowData.None()) { worksheet.Cells[dataRowIndex, columnIndex].Set(field, owner: owner, rowIndex: null, addValidation: true); } // Add SubRows foreach (var rowData in groupedRowData) { worksheet.Cells[dataRowIndex, columnIndex].Set(field, owner: owner, rowIndex: rowData.Key, addValidation: true); dataRowIndex++; } columnIndex++; } if (strategy == Strategy.CreateTableLast) { subRowDataRange = worksheet.Cells[headerRowIndex, worksheet.Dimension.Start.Column, ToRow: worksheet.Dimension.End.Row + 1, ToCol: dataFields.Count()]; table = worksheet.Tables.Add(subRowDataRange, Name: null); table.TableStyle = TableStyles.Light13; } 

}

这是在Excel代码之后的输出表:

数据导出为ex​​cel的Excel表

有趣的是,如果我手动创build表格并将第一行设置为数据,那么将单元格validation复制到下一行,然后向下拖动以创build新行并将其复制完成。 我不知道我将如何能够导出多行数据,并确保当用户插入一个新行时,validation被复制下来。

我下载了Microsoft XML SDK,将excel表格与1行(然后我可以通过拖拽创build具有复制公式的第二行)以及excel表格中包含多行的原始下载excel文件进​​行比较。

结果与XML输出中的Excel表格几乎完全相同。

Excel表格比较XML

在删除行并保存文件以进行比较之后,也没有什么不合适的地方。

在右侧导出,删除行并保存在左侧

任何EPPlus大师有一个想法?

更新date:30/04/2015。 客户理解问题并接受它。 没有find解决scheme。

我对EPPlus并不熟悉,但是之前我曾经在VBA中遇到过这个问题,并且可以通过使用如下所示的VBA脚本来强制填充表:

 LastRow = Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row Range(Cells(TopRowOfTable,ColumnOfTableRow1),Cells(LastRow,ColumnOfTableRow1).Filldown 

基本上只是find最后一行,然后使用filldown命令强制填充字段。