很多情況下我們需要將grid中的數據導出成Excel或Word格式。下面我們來說說如何實現它。
1 先用一個方法,篩選出有效的數據。
因為grid中可能會有隱藏列,而這些列中的數據我們一般都是不需要的,所以我們先將grid中的數據進行過濾,保存在一個DataTable中。
private DataTable exporeDataToTable(DataGridView dataGridView) { //將datagridview中的數據導入到表中 DataTable tempTable = new DataTable("tempTable"); //定義一個模板表,專門用來獲取列名 DataTable modelTable = new DataTable("ModelTable"); //創建列 for (int column = 0; column < dataGridView.Columns.Count; column++) { //可見的列才顯示出來 if (dataGridView.Columns[column].Visible == true) { DataColumn tempColumn = new DataColumn(dataGridView.Columns[column].HeaderText, typeof(string)); tempTable.Columns.Add(tempColumn); DataColumn modelColumn = new DataColumn(dataGridView.Columns[column].Name, typeof(string)); modelTable.Columns.Add(modelColumn); } } //添加datagridview中行的數據到表 for (int row = 0; row < dataGridView.Rows.Count; row++) { if (dataGridView.Rows[row].Visible == false) { continue; } DataRow tempRow = tempTable.NewRow(); for (int i = 0; i < tempTable.Columns.Count; i++) { tempRow[i] = dataGridView.Rows[row].Cells[modelTable.Columns[i].ColumnName].Value; } tempTable.Rows.Add(tempRow); } return tempTable; }
2 導出為Excel。
導出Excel會用到Microsoft.Office.Interop.Excel.dll,所以必須先在項目中引用這個DLL。
private void OutputAsExcelFile(DataGridView dataGridView) { //將datagridView中的數據導出到一張表中 DataTable tempTable = this.exporeDataToTable(dataGridView); //導出信息到Excel表 Microsoft.Office.Interop.Excel.ApplicationClass myExcel; Microsoft.Office.Interop.Excel.Workbooks myWorkBooks; Microsoft.Office.Interop.Excel.Workbook myWorkBook; Microsoft.Office.Interop.Excel.Worksheet myWorkSheet; char myColumns; Microsoft.Office.Interop.Excel.Range myRange; object[,] myData = new object[500, 35]; int i, j;//j代表行,i代表列 myExcel = new Microsoft.Office.Interop.Excel.ApplicationClass(); //顯示EXCEL myExcel.Visible = true; if (myExcel == null) { MessageBox.Show("本地Excel程序無法啟動!請檢查您的Microsoft Office正確安裝並能正常使用", "提示"); return; } myWorkBooks = myExcel.Workbooks; myWorkBook = myWorkBooks.Add(System.Reflection.Missing.Value); myWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)myWorkBook.Worksheets[1]; myColumns = (char)(tempTable.Columns.Count + 64);//設置列 myRange = myWorkSheet.get_Range("A4", myColumns.ToString() + "5");//設置列寬 int count = 0; //設置列名 foreach (DataColumn myNewColumn in tempTable.Columns) { myData[0, count] = myNewColumn.ColumnName; count = count + 1; } //輸出datagridview中的數據記錄並放在一個二維數組中 j = 1; foreach (DataRow myRow in tempTable.Rows)//循環行 { for (i = 0; i < tempTable.Columns.Count; i++)//循環列 { myData[j, i] = myRow[i].ToString(); } j++; } //將二維數組中的數據寫到Excel中 myRange = myRange.get_Resize(tempTable.Rows.Count + 1, tempTable.Columns.Count);//創建列和行 myRange.Value2 = myData; myRange.EntireColumn.AutoFit(); }
3 導出為Word格式
同樣的,導出為Word要添加對Microsoft.Office.Interop.Word.Dll的引用。
private void OutPutAsWordFile(DataGridView dataGridView) { //轉換后的表 DataTable table = exporeDataToTable(this.dataGridView1); Microsoft.Office.Interop.Word.ApplicationClass wordApp = new Microsoft.Office.Interop.Word.ApplicationClass(); Microsoft.Office.Interop.Word.Document document; Microsoft.Office.Interop.Word.Table wordTable; Microsoft.Office.Interop.Word.Selection wordSelection; object wordObj = System.Reflection.Missing.Value; document = wordApp.Documents.Add(ref wordObj, ref wordObj, ref wordObj, ref wordObj); wordSelection = wordApp.Selection; //顯示word文檔 wordApp.Visible = true; if (wordApp == null) { MessageBox.Show("本地Word程序無法啟動!請檢查您的Microsoft Office正確安裝並能正常使用", "提示"); return; } document.Select(); wordTable = document.Tables.Add(wordSelection.Range, dataGridView.Rows.Count+1, dataGridView.Columns.Count, ref wordObj, ref wordObj); //設置列寬 wordTable.Columns.SetWidth(50.0F, Microsoft.Office.Interop.Word.WdRulerStyle.wdAdjustSameWidth); //標題數據 for (int i = 0; i < table.Columns.Count; i++) { wordTable.Cell(1, i + 1).Range.InsertAfter(table.Columns[i].ColumnName); } //輸出表中數據 for (int i = 0; i <= table.Rows.Count - 1; i++) { for (int j = 0; j < table.Columns.Count; j++) { if (table.Rows[i][j] != null) { wordTable.Cell(i + 2, j + 1).Range.InsertAfter(table.Rows[i][j].ToString()); } } } }
代碼下載:DataGridDemo。項目中的Form1.