2017-12-06 179 views
2

私はEPPlusを使用してExcelファイルを読み込みます。EPPLusで結合されたセル領域を取得

私はマージされたセルの一部である単一のセルを持っています。このセルが含まれているマージされた範囲を取得するにはどうすればよいですか?例えば

はレンジと仮定( "A1:C1")が統合されました。

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

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

私は範囲(「A1:C1」)を返すことになる.MergedRangeを期待していた

答えて

2

あり、そのようなプロパティは、ボックスの外ではありませんが、ワークシートは、すべてのアレイと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

ワークシートからすべてのマージされた細胞を得ることができ、あなたがマージされた範囲を見つけることができます ので、特定のセルを使用してに属し次

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" 
+0

これは機能しません。私は恐れています。 'merged'は単なる文字列なので' .Contains(cellAddress) 'は" B1 "が" A1:C3 "の部分文字列であるかどうかをチェックします。空文字列を返しますが、" A1:C3 " –

+0

更新された答えを確認してください、私は多くの例でそれをテストし、それは動作します –

関連する問題