当行计数== 1时,ListObject.Resize()使DataBodyRange为null

时间:2014-07-21 14:12:16

标签: c# excel

我正在尝试重置Excel ListObject中的列数。我知道你可以逐个添加和删除列,但我想避免不必要的循环。我决定使用Resize方法调整ListObject的大小。

这是我正在使用的代码(其中OutputCasesTable是ListObject):

OutputCasesTable.DataBodyRange.Value2 = "";
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]);
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;

上面的代码行似乎完美无缺,但是如果ListObject只包含1行数据,则ListObject的DataBodyRange在第二行变为null - 当我尝试更改其单元格时产生错误值。 excel中的行似乎仍然存在。

MSDN文档说明如下: "标题必须保留在同一行中,结果列表必须与原始列表重叠。该列表必须包含标题行和至少一行数据。"

现在我理解"一行数据"意味着该行包含值 - 因此这里的错误原因必须是DataBodyRange单元格都不包含任何值("")。但是,一个包含两个数据行的表包含""仍然没有数据行,是吗?

我知道有很多方法可以完成这项任务,但我想知道为什么会这样。

临时解决方案: 将代码替换为仅将值设置为将要删除的列中的空字符串(新列计数上方的列)。所有其他列将被替换:

if(OutputCasesTable.ListColumns.Count - CaseCount > 0) 
    OutputCasesTable.DataBodyRange.Offset[ColumnOffset: CaseCount].Resize[ColumnSize: OutputCasesTable.ListColumns.Count - CaseCount].Value2 = "";
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]);
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;

我个人更喜欢看第一个解决方案!

我能做些什么让空字符串工作吗?或者你有更好的解决方案吗?

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:2)

Resize操作是杀死DataBodyRange的部分,显然有Resize使用的一些内部逻辑,沿着"如果有的话只有一行,并且所有单元格都是空的,删除所有数据行。如果有多行,请不要删除任何"。

我同意这种逻辑有点令人困惑。如果你的问题是为什么微软以这种方式实现它,我认为虽然它不一致,但在某种程度上它可能更整洁 - 模型看起来你正在工作使用空表,并且模型无法以图形方式区分(表格不可能只有标题行)。

Resize开始工作并找到单行空白表时,它无法判断您是否有零行表或带有空字符串的单行表。如果它到达并找到两个空行,那就是明确的(它们必须是有意义的行)。

对于问题的解决方法部分,我建议只是检查ListRows.Count属性的更整洁的解决方案,并在必要时添加一个。请注意,您也可以使用Clear而不是将Value2设置为空白;对我而言,它更加不言自明。

OutputCasesTable.DataBodyRange.Clear();
OutputCasesTable.Resize(OutputCasesTable.Range.Resize[ColumnSize: CaseCount]);
if (OutputCasesTable.ListRows.Count == 0) OutputCasesTable.ListRows.Add();
OutputCasesTable.DataBodyRange.Value2 = OutputCasesAray;