2012-08-30 152 views
2

我需要将一个datgrid导出到excel文档,但是在遇到这种情况时遇到了错误。下面是我用来导出的代码,它打开Excel文档,并且标题已到位,但是每个单元格中的值应该是我在Excel单元格中看到的System.Data.DataRowView。我需要做的是从帽子行取得数值并将它们插入到Excel工作簿中。将datagrid导出到Excel文档

任何帮助表示赞赏,或教程链接。

彼得

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; 

try 
{ 
    excel = new Microsoft.Office.Interop.Excel.Application(); 
    wb = excel.Workbooks.Add(); 
    ws = (Microsoft.Office.Interop.Excel.Worksheet)wb.ActiveSheet; 

    for (int Idx = 0; Idx < dataGrid1.Columns.Count; Idx++) 
    { 
     // Puts Column Header into excel work sheet 
     ws.Range["A1"].Offset[0, Idx].Value = dataGrid1.Columns[Idx].Header; 
    } 

    for (int Idx = 0; Idx < dataGrid1.Items.Count; Idx++) 
    { 
     ws.Range["A2"].Offset[Idx].Resize[1, dataGrid1.Columns.Count].Value = 
     dataGrid1.Items[Idx].ToString(); 
    } 

    excel.Visible = true; 
    wb. 
} 
catch (COMException ex) 
{ 
    MessageBox.Show("Error accessing Excel: " + ex.ToString()); 
} 
catch (Exception ex) 
{ 
    MessageBox.Show("Error: " + ex.ToString()); 
} 

回答

0

随着循环for (int Idx = 0; Idx < dataGrid1.Items.Count; Idx++)你迭代的项目,即DataGrid的行。每个这样的项目或行显然是DataRowView,因此ToString为您提供“System.Data.DataRowView”。

你也必须遍历一行中的每个项目,即细胞:

for (int rowIndex = 0; rowIndex < dataGrid1.Items.Count; rowIndex++) 
{ 
    for (int columnIndex = 0; columnIndex < dataGrid1.Columns.Count; columnIndex++) 
    { 
     ws.Range["A2"].Offset[rowIndex, columnIndex].Value = 
      dataGrid1.Items[rowIndex][columnIndex].ToString(); 
    } 
} 

请注意,我没有测试,不知道有关Excel API任何东西,所以我米不确定​​是否正确。

+0

谢谢,i'l试试看反正测试一下它的工作原理:) – Peter

1

我找到了解决方案,如果有人有同样的问题。

要访问此行内的数值就是你需要:

for (int columnIndex = 0; columnIndex < dataGrid1.Columns.Count; columnIndex++) 
{ 
    ws.Range["A2"].Offset[rowIndex, columnIndex].Value = 
     (dataGrid1.Items[rowIndex] as DataRowView).Row.ItemArray[columnIndex].ToString() 
}