使用 C# 中的单元格名称设置 Excel 单元格值





5.00/5 (6投票s)
自动化设置 Excel 单元格值的过程,为单元格分配与查询结果列名匹配的单元格名称,让最终用户可以更改布局模板。
自动化设置 Excel 单元格值的过程,为单元格分配与查询结果列名匹配的单元格名称,让最终用户可以更改布局模板.
引言
为了工作需要,我需要创建一个如下所示的报告
用户可以修改模板,更改单元格位置,删除单元格并添加新单元格,这些单元格将从查询结果中获取值。
期望
我希望能够定义一个与查询结果返回的列名相等的单元格名称,这样我就可以根据查询结果中的列名匹配其名称来获取单元格。 这样,我可以循环遍历查询结果中的每一列,并获取 Excel 单元格,而与其位置无关。
foreach (DataRow dataRow in dataTable.Rows)
{
foreach (DataColumn dataColumn in dataTable.Columns)
{
// It NOT works!
Excel.Range cell = ws.Cells[dataColumn.ColumnName];
cell.Value = dataRow[dataColumn.ColumnName];
}
}
上面的代码,不幸的是,无法正常工作。
解决方案
为了获得预期的结果,我们必须使用在 Excel WorkSheet
对象中定义的 Evaluate()
方法。 该方法接收一个字符串,并开始查找与该字符串匹配的单元格(或单元格范围)。 如果评估结果为真,它将返回一个 Excel Range
对象的实例,即请求的单元格。
foreach (DataRow dataRow in dataTable.Rows)
{
foreach (DataColumn dataColumn in dataTable.Columns)
{
Excel.Range cell = ws.Evaluate(dataColumn.ColumnName);
if (cell != null) cell.Value = dataRow[dataColumn.ColumnName];
}
}
定义单元格名称
要正确运行上面的代码,我们必须指定单元格名称。 为此,右键单击单元格,然后选择“定义名称”菜单项,如下所示
这将打开一个弹出窗口,您可以在其中定义单元格名称
“范围”选项让您可以选择名称可见性:此名称必须在所选范围内是唯一的:在整个 Excel 文档(Workbook
)中唯一,或在工作表(worksheet
)中唯一。 在您分配了单元格名称后,您可以在左上角看到它
在您设置了单元格名称后,仍然可以使用经典模式来获取它,即使用坐标,如下所示
Excel.Worksheet workSheet = workbookReport.Worksheets[1];
Excel.Range cell = workSheet.Cells[1, 2];
删除或更改单元格名称
要删除单元格名称或仅更改它,您必须使用“公式”选项卡下的“名称管理器”菜单项
这将打开以下页面,其中报告了所有单元格的名称,允许您删除或更改它们的名称
选择列表中的名称,您可以单击“编辑”或“删除”按钮进行修改。
创建表格报告
从加载到 DataTable
中的查询结果开始
我们想要创建一个如下所示的 Excel 表格报告
如您所见,我们需要一种类似于透视表的东西,因为记录按行组织。 我们可以轻松解决这个问题,方法是应用与月份相关的单元格名称:因此,对于每个单元格,我们可以分配一个与 DataTable
列名加上月份数字相同的名称
现在,我们可以简单地使用以下代码来自动设置与 datatable
列名匹配的每个单元格
foreach (DataRow dataRow in dataTable.Rows)
{
DateTime period = Convert.ToDateTime(dataRow["PERIOD_START_DATE"]);
foreach (DataColumn dataColumn in dataTable.Columns)
{
string cellName = dataColumn.ColumnName + "_" + period.Month.ToString("d2"));
Excel.Range cell = workSheet.Evaluate(cellName) as Excel.Range;
if (cell != null) cell.Value = value;
}
}
附带项目
本文附带的项目包含一个用作模板的 Excel 文件。 在此模板中,我已根据 DataTable 的列名定义了单元格名称:使用此模板,我创建一个新的 Excel 报告,并在其中设置单元格的值。
要求
该项目必须引用 Microsoft.Office.Interop.Excel。