【问题标题】:How to iterate object[,] through entire rows如何遍历整行对象 [,]
【发布时间】:2014-01-02 13:43:04
【问题描述】:

我每天都在 ftp 上得到一个 excel。我需要每天解析它并写入一个 DB2 表。你可以理解;我的 excel 具有固定顺序的固定列,因此我可以逐行而不是逐个单元格地迭代以获得性能。目的是将每个 (object[])row 添加到数据表中,因此复杂度可能为 O(n)

我知道锯齿状数组可以像这样迭代,而不是我问的多维数组。但是,在我的情况下可能会有一些技巧。我有 1 种方法,我卡住了,需要你的帮助..

1- 我从 excel 中获得了整个范围(不能使用 sheed.UsedRange,工作表有点脏)

int usedRowCount = sheet.UsedRange.EntireRow.Count;
string usedRange = string.Format("A1:DG{0}", usedRowCount);
object[,] rangeData = (System.Object[,])sheet.get_Range(usedRange).Cells.get_Value(missing);

2- 在这里我想用System.Buffer.BlockCopy 进行迭代以将整行放入一个临时对象[](因为我有固定的列数据序列)但我看到 BlockCopy 要求数组类型是原始的,所以这没有不行。但我觉得解决方案很接近:)

因此,感谢任何帮助、代码、方法(或即使在我的情况下也不可能的解释);非常感谢。

【问题讨论】:

  • 您正在从 excel 读取/转换。 C# 级别的任何内容都不会影响性能。
  • @HenkHolterman 在添加到数据表之前将此 Range 对象视为“行”而不是“单元格”不是性能提升吗?
  • 没有。这可能是这里运行时间的 1%,所以即使你设法将速度提高一倍,总体上也会提高 0.5%。
  • 我明白了,然后让我们使用传统的嵌套循环(:只是好奇;这是因为即使我以整行为目标,excel“范围”也在后台逐个单元格地工作?
  • @stratovarius 检查是否对您有帮助 social.msdn.microsoft.com/Forums/en-US/…

标签: c# arrays excel


【解决方案1】:

您可以使用此代码获取行数和列数,然后遍历行。

int rows = array.GetLength(0)  -> Gets first dimension size

int columns = array.GetLength(1)  -> Gets second dimension size

这是唯一的选择,因为 Array.Copy 仅适用于具有相同维度的数组。 Buffer.BlockCopy 也不是一个选项,因为如下所述,它仅适用于原语。

【讨论】:

  • 我知道如何遍历行;这里的问题是我需要将“整个”行放入一个对象数组中,所以我可以将该对象数组设置为 datatable.rows
  • 我想这是你唯一的选择。
  • 很遗憾,您对Buffer.BlockCopy 的看法是错误的。你可以测试这个样本,它可以工作。 int[,] oResultTemp = { { 1, 2, 8 }, { 3, 4, 8 }, { 5, 6, 8 } }; int[] oResult = new int[3]; System.Buffer.BlockCopy(oResultTemp, 0, oResult, 0, 3*sizeof(int));
  • 对不起,没有正确阅读 MSDN 上的文档。似乎 Buffer.BlockCopy 直接复制内存(这就是它只适用于原始类型的原因)。我认为您应该自己做,因为没有其他解决方案。
猜你喜欢
  • 2021-05-08
  • 2013-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多