【问题标题】:EPPlus: How to traverse through every content block (cell or merged range) of a worksheet?EPPlus:如何遍历工作表的每个内容块(单元格或合并范围)?
【发布时间】:2013-06-19 21:10:22
【问题描述】:

我正在尝试遍历工作表中的单元格和合并单元格,并将一些模板文本替换为动态值。但是,直到现在我才设法遍历所有非空单元格。目前我尝试了这段代码,但是当它试图访问合并的单元格的 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 中打开该模板,我想实现手动操作。找到出现特定文本模式的每个“块”(我的意思是单个单元格或合并的单元格范围),然后对其进行处理,并将该“块”的值更改为我计算的值。

【问题讨论】:

  • 您知道Cell 是一个范围,可以跨越多个列或行吗?所以仅仅因为单元格的开头是空的并不意味着结尾是空的。
  • 我知道。如果我在 Excel 中打开该模板,我想实现手动操作。查找出现特定文本模式的每个“块”(我的意思是单个单元格或合并的单元格范围),然后对其进行处理,并将该“块”的值更改为我计算的值。
  • 哪一行抛出异常?
  • 我尝试获取 cell.Text 的行。我马上就要解决这个问题了,如果有问题我会在这里发布解决方案。

标签: c# epplus


【解决方案1】:

看来我已经找到了适合我的场景的解决方案,如果将来有人需要这样的代码,那就是这里。

以下代码段循环遍历工作表中的每个块(单个单元格或合并范围),并进行一些处理。在这种情况下,如果有任何可替换的公式对我来说,我正在做一个文本检查。 ^^ 是我的特殊信号,表示块内有一个模板定义,应该用我的运行时数据替换。

    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;
}

【讨论】:

    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多