天天看點

C# DataGridView 資料導出Excel 操作源碼

private void ExportToExcel()
         {
             if (dgv_Export.Rows.Count <= 0) return;

             #region   驗證可操作性

             //聲明儲存對話框
             SaveFileDialog dlg = new SaveFileDialog();
             //預設檔案字尾
             dlg.DefaultExt = "xls";
             //檔案字尾清單
             dlg.Filter = "EXCEL檔案(*.xls)|*.xls";
             //預設檔案名稱
             dlg.FileName = "aaaa";
             //默然路徑是系統目前路徑
             dlg.InitialDirectory = Directory.GetCurrentDirectory();
             //打開儲存對話框
             if (dlg.ShowDialog() == DialogResult.Cancel) return;
             //傳回檔案路徑
             string fileNameString = dlg.FileName;
             //驗證strFileName是否為空或值無效
             if (fileNameString.Trim() == "") return;
             //定義表格内資料的行數和列數
             int rowscount = dgv_Export.Rows.Count;
             int colscount = dgv_Export.Columns.Count;
             //行數必須大于0
             if (rowscount <= 0)
             {
                 MessageBox.Show("沒有資料可供儲存", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 return;
             }
             //列數必須大于0
             if (colscount <= 0)
             {
                 MessageBox.Show("沒有資料可供儲存", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 return;
             }
             //行數不可以大于65536
             if (rowscount > 65536)
             {
                 MessageBox.Show("資料記錄數太多(最多不能超過65536條),不能儲存", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 return;
             }
             //列數不可以大于255
             if (colscount > 255)
             {
                 MessageBox.Show("資料記錄行數太多,不能儲存", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                 return;
             }

             //驗證以fileNameString命名的檔案是否存在,如果存在删除它
             FileInfo file = new FileInfo(fileNameString);
             if (file.Exists)
             {
                 try
                 {
                     file.Delete();
                 }
                 catch (Exception error)
                 {
                     MessageBox.Show(error.Message, "删除失敗", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                     return;
                 }
             }
             #endregion

             Microsoft.Office.Interop.Excel.Application objExcel = null;
             Microsoft.Office.Interop.Excel.Workbook objWorkbook = null;
             Microsoft.Office.Interop.Excel.Worksheet objsheet = null;

             ProgressBar tempProgressBar = new ProgressBar();
             try
             {
                 //聲明對象
                 objExcel = new Microsoft.Office.Interop.Excel.Application();
                 objWorkbook = objExcel.Workbooks.Add(Missing.Value);
                 objsheet = (Microsoft.Office.Interop.Excel.Worksheet)objWorkbook.ActiveSheet;

                 //設定Excel不可見
                 objExcel.Visible = false;
                 //Excel目前行
                 int ExcelRow = 1;
                 //Excel目前列
                 int ExcelCol = 0;
                 //向Excel中寫入表格的表頭
                 for (int i = 0; i < dgv_Export.ColumnCount; i++)
                 {
                     if (dgv_Export.Columns[i].Visible == true)
                     {
                         ExcelCol++;
                     }
                 }

                 Microsoft.Office.Interop.Excel.Range sheetRange;

                 #region "标題寫入"
                 if (txt_HeaderM.Text.Trim() != "")
                 {
                     //全并标題行
                     sheetRange = objsheet.get_Range(objsheet.Cells[ExcelRow, 1], objsheet.Cells[ExcelRow, ExcelCol]);
                     sheetRange.Merge(0);
                     //寫入主标題
                     sheetRange.Cells[ExcelRow, 1] = txt_HeaderM.Text.Trim();
                     //對齊方式居中
                     sheetRange.HorizontalAlignment = 3;
                     //字型樣式
                     sheetRange.Font.Bold = true;
                     //字型大小
                     sheetRange.Font.Size = 14;
                     sheetRange.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlMedium, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.PeachPuff.ToArgb());
                     ExcelRow++;
                 }

                 if (txt_HeaderS.Text.Trim() != "")
                 {
                     //全并标題行
                     sheetRange = objsheet.get_Range(objsheet.Cells[ExcelRow, 1], objsheet.Cells[ExcelRow, ExcelCol]);
                     sheetRange.Merge(true);
                     //寫入次标題
                     objsheet.Cells[ExcelRow, 1] = txt_HeaderS.Text.Trim();
                     //對齊方式居中
                     sheetRange.HorizontalAlignment = 3;

                     ExcelRow++;
                 }
                 #endregion

                 //向Excel中寫入表格的表頭
                 ExcelCol = 1;
                 for (int i = 0; i < dgv_Export.ColumnCount; i++)
                 {
                     if (dgv_Export.Columns[i].Visible == true)
                     {
                         sheetRange = objsheet.get_Range(objsheet.Cells[ExcelRow, ExcelCol], objsheet.Cells[ExcelRow, ExcelCol]);
                         objsheet.Cells[ExcelRow, ExcelCol] = dgv_Export.Columns[i].HeaderText.Trim();
                         sheetRange.Font.Bold = true;
                         sheetRange.HorizontalAlignment = 3;
                         sheetRange.Borders.LineStyle = XlLineStyle.xlContinuous;//設定邊框線型
                         ExcelCol++;
                     }
                 }
                 ExcelRow++;

                 #region "添加并設定進度條"
                 p_Grid.Controls.Add(tempProgressBar);
                 p_Grid.Controls.SetChildIndex(tempProgressBar, 0);
                 tempProgressBar.Width = tempProgressBar.Parent.Width / 2;
                 tempProgressBar.Top = (tempProgressBar.Parent.Height - tempProgressBar.Height) / 2;
                 tempProgressBar.Left = (tempProgressBar.Parent.Width - tempProgressBar.Width) / 2;

                 tempProgressBar.Refresh();
                 tempProgressBar.Visible = true;
                 tempProgressBar.Minimum = 1;
                 tempProgressBar.Maximum = dgv_Export.RowCount;
                 tempProgressBar.Step = 1;
                 #endregion
                 //向Excel中逐行逐列寫入表格中的資料
                 for (int row = 0; row < dgv_Export.RowCount; row++)
                 {
                     tempProgressBar.PerformStep();

                     ExcelCol = 1;
                     for (int col = 0; col < colscount; col++)
                     {
                         if (dgv_Export.Columns[col].Visible == true)
                         {
                             sheetRange = objsheet.get_Range(objsheet.Cells[ExcelRow, ExcelCol], objsheet.Cells[ExcelRow, ExcelCol]);
                             sheetRange.Interior.Color=System.Drawing.Color.Pink.ToArgb();//設定背景色
                             sheetRange.Font.Color =System.Drawing.Color.Red.ToArgb();//設定字型顔色
                             sheetRange.Borders.LineStyle = XlLineStyle.xlDashDot;//設定邊框線型
                             //sheetRange.Borders.get_Item(XlBordersIndex.xlEdgeTop).LineStyle = XlLineStyle.xlContinuous;//設定邊框單邊線型

                             //寫入單元格
                             objsheet.Cells[ExcelRow, ExcelCol] = dgv_Export.Rows[row].Cells[col].Value.ToString().Trim();
                             //行高
                             sheetRange.RowHeight = dgv_Export.Rows[row].Height * RowHeightRate;
                             //列寬
                             sheetRange.ColumnWidth = dgv_Export.Columns[col].Width * 0.13;
                             //單元格對齊方式
                             int Excel_Alignment = 2;
                             if (dgv_Export.Columns[col].DefaultCellStyle.Alignment.ToString().IndexOf("Center") > 0)
                             {
                                 Excel_Alignment = 3;
                             }
                             else if (dgv_Export.Columns[col].DefaultCellStyle.Alignment.ToString().IndexOf("Right") > 0)
                             {
                                 Excel_Alignment = 4;
                             }
                             sheetRange.HorizontalAlignment = Excel_Alignment;
                             ExcelCol++;
                         }
                     }
                     ExcelRow++;
                 }
                 //移除進度條
                 tempProgressBar.Parent.Controls.Remove(tempProgressBar);


                 //儲存檔案
                 objWorkbook.SaveAs(fileNameString, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                             Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value,
                             Missing.Value, Missing.Value);
             }
             catch (Exception error)
             {
                 //移除進度條
                 tempProgressBar.Parent.Controls.Remove(tempProgressBar);
                 MessageBox.Show(error.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                 return;
             }
             //如果要顯示結果就顯示Excel并傳回,否則就退出Excel;
             if (chb_View.Checked) { objExcel.Visible = true; return; }
             //關閉Excel應用
             if (objWorkbook != null) objWorkbook.Close(Missing.Value, Missing.Value, Missing.Value);
             if (objExcel.Workbooks != null) objExcel.Workbooks.Close();
             if (objExcel != null) objExcel.Quit();

             objsheet = null;
             objWorkbook = null;
             objExcel = null;
             MessageBox.Show(fileNameString + "導出完畢!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
         }      

繼續閱讀