迭代通过datagrid行导出到excel(再次)

时间:2016-04-06 08:15:31

标签: c# wpf excel datagrid

我正在尝试将dataGrid行导出到Excel工作表。 因为我从WinForms(dataGridView)切换到WPF (dataGrid)基本上我到目前为止还没有关于WPF的线索 我需要你的帮助。

也许有人可以告诉我如何改变我的循环 或者我必须做什么而不是填充行 Excel工作表的单元格。

我已阅读有关此问题的所有文章,但是 似乎没有找到适合我的问题的主题。

这就是我为填充列名所做的事情 完美运作:

for (int i = 1; i < dataGrid.Columns.Count + 1; i++)
{
    Excel.Range BackgroundColor;
    BackgroundColor = xlWorkSheet.get_Range("a9", "j9");
    BackgroundColor.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.RoyalBlue);

    AxlEx.Cells[9, i] = dataGrid.Columns[i - 1].Header;
}

当谈到用行填充细胞时,我已尝试了许多尝试来使其正常工作

for (int i = 0; i < dataGrid.Items.Count; i++)
{
    DataRowView aux = (DataRowView)dataGrid.Items[i];

    for (int j = 0; j < aux.Row.ItemArray.Length; j++)
    {
        //Console.WriteLine(string.Format("{0}-{1}", j, aux.Row.ItemArray[j]));
        AxlEx.Cells[i + 10, j + 1] = aux.Row.ItemArray[j];
    }
}

抛出了类型不匹配的System.InvalidCast异常的例外 这很明显......但我不知道如何转换,这里也适合 关于SO的主题没有一个我可以理解的例子来改变我的代码。

在我这之前:

for (int i = 0; i < dataGrid.Items.Count; i++)
{
    for (int j = 0; j < dataGrid.Columns.Count; j++)
    {
        AxlEx.Cells[i + 10, j + 1] = dataRow.Row.ItemArray[j].ToString();
    }
}

如果我参考

,那么它将用于1行
DataRowView dataRow = (DataRowView)dataGrid.SelectedItem;

我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:1)

我不知道是否有必要调试您的代码。不过,我想展示我的工作代码,以便将数据从DataGrid导出到MS Excel

最好将此工作从UI线程转移到ThreadPool

 using Excel = Microsoft.Office.Interop.Excel;//add this library

 Task.Run(() => {                    
                // load excel, and create a new workbook
                Excel.Application excelApp = new Excel.Application();
                excelApp.Workbooks.Add();

                // single worksheet
                Excel._Worksheet workSheet = excelApp.ActiveSheet;

                // column headings
                for (int i = 0; i < YourDataTable.Columns.Count; i++)
                {
                    workSheet.Cells[1, (i + 1)] = YourDataTable.Columns[i].ColumnName;
                }

                // rows
                for (int i = 0; i < YourDataTable.Rows.Count; i++)
                {
                    // to do: format datetime values before printing
                    for (int j = 0; j < YourDataTable.Columns.Count; j++)
                    {
                        workSheet.Cells[(i + 2), (j + 1)] = YourDataTable.Rows[i][j];
                    }
                }
                excelApp.Visible = true;
            });

答案 1 :(得分:1)

我发现了问题......

for (int i = 0; i < dataGrid.Items.Count-1; i++)
            {
                DataRowView aux = (DataRowView)dataGrid.Items[i];

                for (int j = 0; j < aux.Row.ItemArray.Length; j++)
                {
                    //Console.WriteLine(string.Format("{0}-{1}", j, aux.Row.ItemArray[j]));
                    AxlEx.Cells[i + 10, j + 1] = aux.Row.ItemArray[j];
                }
            }

我必须减去(dataGrid.Items.Count-1),因为dataGrid中还有一个空行似乎导致了问题。 可能是由于NULL字段返回值??? datagrid