Excel - 使用C#在.NET中读取合并单元格(行)

3

大家好,让我解释一下我的困境:

假设我有3列(每列都合并了3个数字),总共有9个数字。在直接下方的行中,我有9列,每个单元格中都有数据。

我的想法是读取第一行的3列,然后找出这些列跨越多少列,以便在创建结果xml时为其分配正确的值。以下是我试图实现的粗略草图:

第1行第1列(跨越3列)=足球队 第2行第1、2、3列将分别包含有关足球队的不同数据 第1行第2列(跨越3列)=足球球员 第2行第4、5、6列将分别包含有关足球球员的不同数据 第1行第3列(跨越3列)=足球财务 第2行第7、8、9列将分别包含有关足球财务的不同数据

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

[0] =“足球队” [1] = null [2] = null [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;

任何帮助/指导/正确方向上的打击都将不胜感激!
1个回答

4
当您合并单元格时,单元格仍然存在(从代码角度来看),只是它们具有空值。因此,合并单元格组中的第一个单元格将具有该值。
阅读您的评论并重新阅读您的代码后,我认为问题在于如何选择最后一列:
Range dataRange = worksheet.get_Range("A1", Missing.Value);
dataRange = dataRange.get_End(XlDirection.xlRight);

我经常发现,将光标移到最右边并不一定能够选中最右边的项目,特别是当单元格之间有空格时(因为这里的单元格已经合并)。因此,最好这样做(稍微清理一下可以节省一些行数)-“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;

请注意,该代码将无法获取第三组中的最后两个空值 - 唯一的方法是显式设置范围,如下所示:
Range dateRange = worksheet.get_Range("A1", "I1");

请提供要翻译的英文文本。 - GoodAtScrabble
我明白,但我也无法获取最后一个单元格,实际返回的值只有我已经说明的那些,即足球队、null、null、足球运动员。我本来期望的是足球队、null、null、足球运动员、null、null、足球财务、null、null。 - GoodAtScrabble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接