2012-08-30 101 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() 
}