从列表中提取值并将其保存到c#中的现有Excel工作表中

时间:2019-07-03 11:53:36

标签: c# wpf

我有一个带标题的现有Excel工作表。我从服务器获取数据并将其放在WPF DataGrid中,如下所示:

enter image description here

单击按钮,我需要将列表中的值放置到现有Excel工作簿中的特定工作表中。我实际上可以像这样从WINFORM DataGrid中获取值:

var xlApp = new Excel.Application();
Excel.Worksheet sheet = new Excel.Worksheet();
xlApp.Visible = true;
var path = @"D:\Reports\Tag_History.xlsx";
sheet = xlApp.Application.Workbooks.Open(path).Worksheets["Summary"];

var rowCount = dataGrid.Items.Count;
var rowColumn = dataGrid.Columns.Count;

for (int i = 0; i < rowCount - 1; i++)
{
    for (int j = 0; j < 7; j++)
    {
        if (dataGrid[j, i].ValueType == typeof(string))
        {
            xlsht.Cells[i + 2, j + 1] = "'" + dataGrid[j, i].Value.ToString();
        }
        else
        {
            xlsht.Cells[i + 2, j + 1] = dataGrid[j, i].Value.ToString();
        }
    }
}

但是由于我试图在WPF中执行此操作,因此该代码不再起作用。通过将dataGrid数据传输到现有的excel文件中。因为我认为将列表传输到现有的excel文件更好,所以我必须尝试一下。这是我到目前为止的内容:

var xlApp = new Excel.Application();
Excel.Worksheet sheet = new Excel.Worksheet();
xlApp.Visible = true;
var path = @"D:\Reports\Tag_History.xlsx";
sheet = xlApp.Application.Workbooks.Open(path).Worksheets["Summary"];

var range = sheet.Range["A2", "A2"];
foreach (var item in summaryList)
{
    range.Value2 = item.TagNumber;
}

此代码有效,但仅更新excel文件的单个单元格。

enter image description here

您能告诉我该怎么做吗?谢谢。

1 个答案:

答案 0 :(得分:0)

在应用程序中安装 Microsoft.Office.Interop.Excel Nuget程序包。右键单击您的项目->“参考”,然后选择“管理NuGet软件包...” ,然后仅搜索Excel。否则,选择工具-> Nuget软件包管理器->软件包管理器控制台->然后安装Excel nuget(https://www.nuget.org/packages/Microsoft.Office.Interop.Excel/)。

绑定DataGrid中的项目,然后将数据导出到excel,如下所示,

private void btnExport_Click(object sender, RoutedEventArgs e)
    {
        Microsoft.Office.Interop.Excel.Application excel = null;
        Microsoft.Office.Interop.Excel.Workbook wb = null;
        object missing = Type.Missing;
        Microsoft.Office.Interop.Excel.Worksheet ws = null;
        Microsoft.Office.Interop.Excel.Range rng = null;

        // collection of DataGrid Items
        var dtExcelDataTable = ExcelTimeReport(txtFrmDte.Text, txtToDte.Text, strCondition);

        excel = new Microsoft.Office.Interop.Excel.Application();
        wb = excel.Workbooks.Add();
        ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.ActiveSheet;
        ws.Columns.AutoFit();
        ws.Columns.EntireColumn.ColumnWidth = 25;

        // Header row
        for (int Idx = 0; Idx < dtExcelDataTable.Columns.Count; Idx++)
        {
            ws.Range["A1"].Offset[0, Idx].Value = dtExcelDataTable.Columns[Idx].ColumnName;
        }

        // Data Rows
        for (int Idx = 0; Idx < dtExcelDataTable.Rows.Count; Idx++)
        {
            ws.Range["A2"].Offset[Idx].Resize[1, dtExcelDataTable.Columns.Count].Value = dtExcelDataTable.Rows[Idx].ItemArray;
        }

        excel.Visible = true;
        wb.Activate();
        wb.SaveCopyAs("excel file location");
        wb.Saved = true;            
        excel.Quit();
    }