准備工作就是可以分頁的DataGridView,和兩個按鈕,一個用來導出當前頁數據到Excel,一個用來導出全部數據到Excel
沒有使用SaveFileDialog,但卻可以彈出保存對話框來
先做導出當前頁數據到Excel的
DataGridView命名為dataGridView1

1 //按下導出按鈕 2 private void button7_Click(object sender, EventArgs e) 3 { 4 print(dataGridView1); 5 } 6 public void print(DataGridView dataGridView1) 7 { 8 //導出到execl 9 try 10 { 11 //沒有數據的話就不往下執行 12 if (dataGridView1.Rows.Count == 0) 13 return; 14 //實例化一個Excel.Application對象 15 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 16 17 //讓后台執行設置為不可見,為true的話會看到打開一個Excel,然后數據在往里寫 18 excel.Visible = false; 19 20 //新增加一個工作簿,Workbook是直接保存,不會彈出保存對話框,加上Application會彈出保存對話框,值為false會報錯 21 excel.Application.Workbooks.Add(true); 22 //生成Excel中列頭名稱 23 for (int i = 0; i < dataGridView1.Columns.Count; i++) 24 { 25 excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText; 26 } 27 //把DataGridView當前頁的數據保存在Excel中 28 for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) 29 { 30 for (int j = 0; j < dataGridView1.Columns.Count; j++) 31 { 32 if (dataGridView1[j, i].ValueType == typeof(string)) 33 { 34 excel.Cells[i + 2, j + 1] = "'" + dataGridView1[j, i].Value.ToString(); 35 } 36 else 37 { 38 excel.Cells[i + 2, j + 1] = dataGridView1[j, i].Value.ToString(); 39 } 40 } 41 } 42 43 //設置禁止彈出保存和覆蓋的詢問提示框 44 excel.DisplayAlerts = false; 45 excel.AlertBeforeOverwriting = false; 46 47 //保存工作簿 48 excel.Application.Workbooks.Add(true).Save(); 49 //保存excel文件 50 excel.Save("D:" + "\\KKHMD.xls"); 51 52 //確保Excel進程關閉 53 excel.Quit(); 54 excel = null; 55 56 } 57 catch (Exception ex) 58 { 59 MessageBox.Show(ex.Message, "錯誤提示"); 60 } 61 }
導出從數據庫中查詢到的所有的數據到Excel中

1 #region 導出全部數據到Excel中,可彈出保存對話框,但沒用SaveFileDialog 2 3 public void printAll(System.Data.DataTable dt) 4 { 5 //導出到execl 6 try 7 { 8 //沒有數據的話就不往下執行 9 if (dt.Rows.Count == 0) 10 return; 11 //實例化一個Excel.Application對象 12 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 13 14 //新增加一個工作簿,Workbook是直接保存,不會彈出保存對話框,加上Application會彈出保存對話框,值為false會報錯 15 excel.Application.Workbooks.Add(true); 16 17 //讓后台執行設置為不可見,為true的話會看到打開一個Excel,然后數據在往里寫 18 excel.Visible = false; 19 //生成Excel中列頭名稱 20 for (int i = 0; i < dt.Columns.Count; i++) 21 { 22 excel.Cells[1, i + 1] = dataGridView1.Columns[i].HeaderText;//輸出DataGridView列頭名 23 } 24 25 //把DataGridView當前頁的數據保存在Excel中 26 if (dt.Rows.Count > 0) 27 { 28 for (int i = 0; i < dt.Rows.Count; i++)//控制Excel中行,上下的距離,就是可以到Excel最下的行數,比數據長了報錯,比數據短了會顯示不完 29 { 30 for (int j = 0; j < dt.Columns.Count; j++)//控制Excel中列,左右的距離,就是可以到Excel最右的列數,比數據長了報錯,比數據短了會顯示不完 31 { 32 string str = dt.Rows[i][j].ToString(); 33 excel.Cells[i + 2, j + 1] = "'" + str;//i控制行,從Excel中第2行開始輸出第一行數據,j控制列,從Excel中第1列輸出第1列數據,"'" +是以string形式保存,所以遇到數字不會轉成16進制 34 } 35 } 36 } 37 //設置禁止彈出保存和覆蓋的詢問提示框 38 excel.DisplayAlerts = false; 39 excel.AlertBeforeOverwriting = false; 40 41 //保存工作簿,值為false會報錯 42 excel.Application.Workbooks.Add(true).Save(); 43 //保存excel文件 44 excel.Save("D:" + "\\KKHMD.xls"); 45 46 //確保Excel進程關閉 47 excel.Quit(); 48 excel = null; 49 50 } 51 catch (Exception ex) 52 { 53 MessageBox.Show(ex.Message, "錯誤提示"); 54 } 55 } 56 private void button1_Click(object sender, EventArgs e) 57 { 58 printAll(dt); 59 } 60 61 #endregion
這不是最好的版本,無論是功能上還是效率上,至少沒用SaveFileDialog的話,控制不到取消保存按鈕,一旦點擊了取消保存,則軟件重起之前一直都不能再使用導出功能,只能是手動殺掉進程中的Excel.exe,進程中的Excel.exe也是沒有在程序里進行關閉的,所以是使用一次導出功能,就會在進程中多生成一次Excel.exe