我想使用C#获取excel中不连续的多区域范围的值。我看到another SO question说我可以这样做:
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"
,以获取它们所引用的所有数据?
谢谢
答案 0 :(得分:1)
我提出的解决方案并不像我希望的那样优雅,但它仍然可以解决问题:
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;
}
希望这有助于其他人...
答案 1 :(得分:0)
如果您尝试从具有隐藏行的范围表中获取数据,则另一种技术是获取可见单元格,并将它们复制到新工作表中。粘贴时,它们将形成一个连续的区域,并且可以检索普通对象[,]数组。
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;
}
答案 2 :(得分:0)
另一种方法是将非连续区域组合成一个命名区域,并在C#代码中引用该命名区域。这是一种方法(将此公式指定给Excel名称管理器中的命名范围):
=CHOOSE({1;2;3},Sheet1!$A$1,Sheet2!$A$3,Sheet3!$A$5)
这种方法的缺点是每个区域只能是1行高。