Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Excel:多个区域范围内的值_C#_Excel_Com Interop - Fatal编程技术网

C# Excel:多个区域范围内的值

C# Excel:多个区域范围内的值,c#,excel,com-interop,C#,Excel,Com Interop,我想使用C#在excel中获取非连续、多区域范围的值。我看到有人说我可以这样做: obj[,] data = sheet.get_Range("B4:K4,B5:K5").get_Value(); 但是,当我检查结果时,我看到我只从第一个区域获取数据:“B4:K4” 进一步测试后,我发现如果我以以下方式请求数据: obj[,] data = sheet.get_Range( "B4:K4","B5:K5").get_Value(); 我得到了这两个领域的数据 所以,我的问题是,有没有一种方法

我想使用C#在excel中获取非连续、多区域范围的值。我看到有人说我可以这样做:

obj[,] data = sheet.get_Range("B4:K4,B5:K5").get_Value();
但是,当我检查结果时,我看到我只从第一个区域获取数据:
“B4:K4”

进一步测试后,我发现如果我以以下方式请求数据:

obj[,] data = sheet.get_Range( "B4:K4","B5:K5").get_Value();
我得到了这两个领域的数据

所以,我的问题是,有没有一种方法可以通过编程方式组合区域地址,例如B4:K4,B5:K5,以获取它们所引用的所有数据


谢谢

我提出的解决方案并没有我想要的那么优雅,但它确实起到了作用:

public List<List<object>> 
GetNonContiguousRowValue(Excel.Worksheet ws, string noncontiguous_address)
{
    var addresses = noncontiguous_address.Split(','); // e.g. "A1:D1,A4:D4"
    var row_data = new List<List<object>>();

    // Get the value of one row at a time:
    foreach (var addr in addresses)
    {
        object[,] arr = ws.get_Range(addr).Value;
        List<object> row = arr.Cast<object>)
                              .Take(arr.GetLength(dimension:1))
                              .ToList<object>();
        row_data.Add(row);
    }
    return row_data;
}
公共列表
GetNonContiguousRowValue(Excel.Worksheet ws,字符串非连续地址)
{
变量地址=不连续的_地址。拆分(',);//例如“A1:D1,A4:D4”
var row_data=新列表();
//一次获取一行的值:
foreach(地址中的变量地址)
{
对象[,]arr=ws.get\u Range(addr.Value);
列表行=arr.Cast)
.Take(arr.GetLength(尺寸:1))
.ToList();
行\数据。添加(行);
}
返回行_数据;
}

希望这对其他人有所帮助。

如果您试图从包含隐藏行的范围表中获取数据,另一种方法是获取可见单元格,并将其复制到新工作表中。粘贴后,它们将形成一个连续区域,可以检索正常对象[,]数组

public object[,] GetNonContiguousVisibleRowsData(Excel.Worksheet sheet, string noncontiguous_address)
{
    // Add a new worksheet
    Excel.Workbook book = (Excel.Workbook)sheet.Parent;
    Excel.Sheets sheets = book.Sheets;
    Excel.Worksheet tempSheet = (Excel.Worksheet)sheets.Add();
    Excel.Range cellA1 = tempSheet.get_Range("A1");

    // Get only the visible cells
    Excel.Range nonContiguousRange = sheet.get_Range(noncontiguous_address);
    Excel.Range visibleSourceRange = nonContiguousRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible);

    // Copying the visible cells will result in a contiguous range in tempSheet
    visibleSourceRange.Copy(cellA1);

    // Get the contiguous range and copy the cell value.
    Excel.Range contiguousRange = tempSheet.UsedRange;
    object[,] data = (object[,])contiguousRange.get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault);

    // Release all COM objects from temp sheet, e.g.:
    // System.Runtime.InteropServices.Marshal.ReleaseComObject(contiguousRange);
    // contiguousRange = null;

    tempSheet.Delete();

    // release all other COM objects

    return data;
}

另一种方法是将非连续区域合并到一个命名范围中,并在C#代码中引用该命名范围。以下是执行此操作的方法(将此公式指定给Excel名称管理器中的命名范围):


这种方法的缺点是每个区域只能有1行高

当你用分号而不是逗号时,它会起作用吗?有时候excel对这些事情很有趣。。。这只是一种预感/猜测@pnuts:我忘了说这些区域可以是非连续的。以上编辑。@Floris:尝试了你的建议,但没有成功…@pnuts:很接近,但仍然无法解决以编程方式创建联盟的问题
=CHOOSE({1;2;3},Sheet1!$A$1,Sheet2!$A$3,Sheet3!$A$5)