65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconstarIcon

5.00/5 (6投票s)

2013 年 7 月 23 日

CPOL

3分钟阅读

viewsIcon

109171

downloadIcon

3394

自动化设置 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

© . All rights reserved.