Excel – 使用C#读取.NET中的合并单元(行)

问候StackOverflow'lings,

让我解释一下我的困境:

让我们只是说,我有3列(总共9个,因为它们合并为3的数量)在一行中的3列中的每一个都有数据在下面的行中,我有9列,每个单元格中有数据。

我们的想法是读取第一行的3列,然后找出这些列跨越多长时间,所以我可以分配正确的值,当我创build生成的XML。 下面是我想要实现的一个粗略的草图:

第1列第1列(范围合并到第3列)=足球队第2列第1,2,3列将分别保存有关足球队第1列第2列(区间合并为3列)的不同数据=足球运动员第2列第4列,5,6将分别拥有关于足球运动员行1列3(范围合并超过3列)的不同数据=足球财务行2列7,8,9将分别持有关于足球财务

出于某种原因,当我读取第一行时,我得到的值:

[0] =“足球队”[1] =空[2] =空[4] =“足球运动员”

但是当我读第二行时,我得到了完整的列(9)! 我使用的代码如下所示:

Range dataRange = worksheet.get_Range("A1", Missing.Value); dataRange = dataRange.get_End(XlDirection.xlRight); string dataAddress = dataRange.get_Address( false, false, XlReferenceStyle.xlA1, Type.Missing, Type.Missing); dataRange = worksheet.get_Range("A1", dataAddress); // Cast the range into an object array object[,] dataValues = (object[,])dataRange.Value2; 

任何帮助/指导/一巴掌在正确的方向将不胜感激!

当你合并单元格时,单元格仍然存在(就你的代码而言),只是它们有空值。 因此,合并单元格组中的第一个单元格将具有该值。

在阅读您的意见并重新读取您的代码后,我认为问题在于如何获取最后一列:

 Range dataRange = worksheet.get_Range("A1", Missing.Value); dataRange = dataRange.get_End(XlDirection.xlRight); 

我经常发现,在右边做一个“End”并不一定会得到右边的最后一项,特别是当单元格之间有空格的时候(这里就是这种情况,因为单元格被合并了)。 所以最好这样做(用一些清理来保存一些行) – “XFD”是Excel 2007及更高版本中的最后一列:

 Range lastCell = worksheet.get_Range("XFD1").get_End(XlDirection.xlLeft); Range dataRange = worksheet.get_Range("A1", lastCell); object[,] dataValues = (object[,])dataRange.Value2; 

请注意,这段代码不会得到第三组中的最后2个空值 – 唯一的方法是明确地设置范围,如下所示:

 Range dateRange = worksheet.get_Range("A1", "I1");