我正在使用EPPlus来阅读excel文件。
我有一个单元格,它是合并单元格的一部分。如何获得此单元格所属的合并范围?
例如:
假设范围(“A1:C1”)已合并。
给定范围“B1”它的Merge属性将为true但是没有办法在给定单个单元格的情况下获得合并范围。
如何获得合并范围?
我希望有一个.MergedRange会返回Range(“A1:C1”)
答案 0 :(得分:5)
开箱即用没有这样的属性,但工作表有MergedCells
属性,其中包含工作表中所有合并单元格地址的数组,以及GetMergeCellId()
方法,它将为您提供索引给定的单元格地址。
因此,我们可以将这些组合成一个可用于获取地址的小扩展方法。像这样:
public static string GetMergedRangeAddress(this ExcelRange @this)
{
if (@this.Merge)
{
var idx = @this.Worksheet.GetMergeCellId(@this.Start.Row, @this.Start.Column);
return @this.Worksheet.MergedCells[idx-1]; //the array is 0-indexed but the mergeId is 1-indexed...
}
else
{
return @this.Address;
}
}
您可以使用如下:
using (var excel = new ExcelPackage(new FileInfo("inputFile.xlsx")))
{
var ws = excel.Workbook.Worksheets["sheet1"];
var b3address = ws.Cells["B3"].GetMergedRangeAddress();
}
(请注意,如果您在多单元范围内使用此方法,它将仅返回范围中第一个单元格的合并单元格地址)
答案 1 :(得分:3)
您可以从工作表中获取所有合并的单元格 您可以使用以下命令找到特定单元格所属的合并范围:
public string GetMergedRange(ExcelWorksheet worksheet, string cellAddress)
{
ExcelWorksheet.MergeCellsCollection mergedCells = worksheet.MergedCells;
foreach (var merged in mergedCells)
{
ExcelRange range = worksheet.Cells[merged];
ExcelCellAddress cell = new ExcelCellAddress(cellAddress);
if (range.Start.Row<=cell.Row && range.Start.Column <= cell.Column)
{
if (range.End.Row >= cell.Row && range.End.Column >= cell.Column)
{
return merged.ToString();
}
}
}
return "";
}
<强>更新强>
事实证明使用EPPLUS有一种更简单的方法,只需执行以下操作:
var mergedadress = worksheet.MergedCells[row, column];
例如,如果B1处于合并范围内&#34; A1:C1&#34;:
var mergedadress = worksheet.MergedCells[1, 2]; //value of mergedadress will be "A1:C1".
2是列号,因为B是第2列。
答案 2 :(得分:0)
这不是直接的答案,因为Stewart的答案很完美,但是我在这里一直是领导者,寻求一种获取单元格价值的方法,无论它是否是更大合并单元格的一部分,因此我改进了Stewart的代码:>
public static string GetVal(this ExcelRange @this)
{
if (@this.Merge)
{
var idx = @this.Worksheet.GetMergeCellId(@this.Start.Row, @this.Start.Column);
string mergedCellAddress = @this.Worksheet.MergedCells[idx - 1];
string firstCellAddress = @this.Worksheet.Cells[mergedCellAddress].Start.Address;
return @this.Worksheet.Cells[firstCellAddress].Value?.ToString()?.Trim() ?? "";
}
else
{
return @this.Value?.ToString()?.Trim() ?? "";
}
}
并这样称呼
var worksheet = package.Workbook.Worksheets[i];
var rowCount = worksheet.Dimension.Rows;
var columnCount = worksheet.Dimension.Columns;
for (int row = 1; row <= rowCount; row++)
{
for (int col = 1; col <= columnCount; col++)
{
string val = worksheet.Cells[row, col].GetVal();
}
}