我正在尝试遍历单元格并合并工作表中的单元格,并用动态值替换一些模板文本.但是,到目前为止,我还没有设法遍历所有非空单元格.目前我尝试了这段代码,但是当它试图访问合并的单元格的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中打开该模板,我想实现手动操作.要找到出现特定文本模式的每个“块”(我指的是单个单元格或合并的单元格范围),然后处理它,并将该“块”的值更改为我计算的值.
解决方法:
看起来我已经为我的场景找到了解决方案,如果有人在将来需要这样的代码.
以下代码片段循环遍历工作表中的每个块(单个单元格或合并范围),并进行一些处理.在这种情况下,如果我有任何可替换的公式,我正在进行文本检查. ^^是我的特殊信号,表示块内部有一个模板定义应该用我的运行时数据替换.
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));
}
使用helper方法从范围中提取文本,将合并范围的数组表示形式计为count:
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;
}
标签:c,epplus 来源: https://codeday.me/bug/20190620/1243509.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。