web-dev-qa-db-ja.com

EPPLusを使用してマージされたセル領域を取得する

Excelファイルを読み取るために EPPlus を使用しています。

結合されたセルの一部である単一のセルがあります。このセルが含まれている結合範囲を取得するにはどうすればよいですか?

例えば:

範囲( "A1:C1")がマージされたと想定します。

範囲 "B1"を指定すると、そのMergeプロパティはtrueになりますが、単一のセルを指定して、マージされた範囲を取得する方法はありません。

マージされた範囲をどのように取得しますか?

Range( "A1:C1")を返す.MergedRangeを期待していました

8
DigitalEd

そのようなプロパティは最初からありませんが、ワークシートには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();

}

(マルチセル範囲でこのメソッドを使用する場合、範囲内の最初のセルのマージされたセルアドレスのみが返されることに注意してください)

9
Stewart_R

ワークシートからすべてのマージされたセルを取得できるため、以下を使用して、特定のセルが属するマージされた範囲を見つけることができます。

 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が結合範囲 "A1:C1"にある場合:

 var mergedadress = worksheet.MergedCells[1, 2]; //value of mergedadress will be "A1:C1".

Bは2列目なので、2は列番号です。

4
Yahya Hussein

スチュワートの答えは完璧なので、直接的な答えではありませんが、私はここでセルの値を取得する方法を探してリードされました。結合された大きなセルの一部であるかどうかにかかわらず、スチュワートのコードを改善しました。

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();
    }
}
0
Vincent V.