4

ワークシート内のセルと結合されたセルをトラバースし、一部のテンプレート テキストを動的な値に置き換えようとしています。ただし、今まで空でないすべてのセルをループすることはできませんでした。現在、このコードを試しましたが、結合されたセルの Text プロパティにアクセスしようとすると NullReferenceException がスローされました。

テンプレート ファイルを使用して、そこからテンプレート ワークシートを作成したワークブックにコピーしています。コピーなしの単一のワークブックで試してみましたが、同じ結果が得られました。

また、 Where(cell => !cell.Merge) クロージャーを最初の foreach ループに入れようとしましたが、結果は同じでした。

    using (var p = new ExcelPackage(new FileInfo(templateFile)))
    {
        var ws = _excel.Workbook.Worksheets.Add("Report", p.Workbook.Worksheets[sablonMunkafuzet]);
        foreach (ExcelRangeBase cell in ws.Cells)
        {
            if (string.IsNullOrEmpty(cell.Text)) continue;
            var s = cell.Text;
            if (s.StartsWith("^^"))
                 ProcessCell(cell, s.Substring(2));
        }
        foreach (string mc in ws.MergedCells)
        {
            var s = ws.Cells[mc].Text;
            if (s.StartsWith("^^"))
                 ProcessCell(ws.Cells[mc], s.Substring(2));
            }
        }
    }

編集: Excel でそのテンプレートを開いた場合に手動で行うことを実現したいと思います。特定のテキストパターンが表示されるすべての「ブロック」(個々のセル、または結合されたセル範囲を意味します)を見つけて処理し、その「ブロック」の値を計算した値に変更します。

4

1 に答える 1

5

私のシナリオの解決策を見つけたようです。将来、そのようなコードが必要な場合はここにあります。

次のコードは、ワークシート内のすべてのブロック (個々のセルまたは結合された範囲) をループし、何らかの処理を行います。この場合、代替可能な数式があるかどうか、テキスト検査を行っています。^^ は、ランタイム データで置き換える必要があるテンプレート定義がブロック内にあることを示す特別な信号です。

    var ws = _excel.Workbook.Worksheets["myTemplateWorksheet"];
    var dim = ws.Dimension;
    // first loop through all non-merged cells
    for (int r = dim.Start.Row; r <= dim.End.Row; ++r)
        for (int c = dim.Start.Column; c <= dim.End.Column; ++c)
        {
            if (ws.Cells[r, c].Merge) continue;
            string s = GetRangeText(ws.Cells[r,c]);
            if (string.IsNullOrEmpty(s)) continue;
            if (s.StartsWith("^^"))
                ProcessCell(ws.Cells[r, c], s.Substring(2));
        }
    // then loop through all merged ranges
    foreach (string mc in ws.MergedCells)
    {
        string s = GetRangeText(ws.Cells[mc]);
        if (string.IsNullOrEmpty(s)) continue;
        if (s.StartsWith("^^"))
            ProcessCell(ws.Cells[mc], s.Substring(2));
     }

範囲からテキストを抽出するヘルパー メソッドを使用して、マージされた範囲の配列表現をカウントします。

private string GetRangeText(ExcelRangeBase range)
{
    var val = range.Value;
    string s = val as string;
    if (string.IsNullOrEmpty(s))
    {
        object[,] arr = val as object[,];
        if (arr != null && arr.GetLength(0) > 0 && arr.GetLength(1) > 0)
            s = arr[0, 0] as string;
    }
    if (string.IsNullOrEmpty(s) && val != null)
        s = val.ToString();
    return s;
}
于 2013-06-19T13:04:06.670 に答える