C# - VS2019 DataGridView导出到Excel的三种方法
//原文出处:http://www.yongfa365.com/Item/DataGridViewToExcel.html
1 #region DataGridView数据显示到Excel 2 /// <summary> 3 /// 打开Excel并将DataGridView控件中数据导出到Excel 4 /// </summary> 5 /// <param name="dgv">DataGridView对象 </param> 6 /// <param name="isShowExcle">是否显示Excel界面 </param> 7 /// <remarks> 8 /// add com "Microsoft Excel 11.0 Object Library" 9 /// using Excel=Microsoft.Office.Interop.Excel; 10 /// </remarks> 11 /// <returns> </returns> 12 public bool DataGridviewShowToExcel(DataGridView dgv, bool isShowExcle) 13 { 14 if (dgv.Rows.Count == 0) 15 return false; 16 //建立Excel对象 17 Excel.Application excel = new Excel.Application(); 18 excel.Application.Workbooks.Add(true); 19 excel.Visible = isShowExcle; 20 //生成字段名称 21 for (int i = 0; i < dgv.ColumnCount; i++) 22 { 23 excel.Cells[1, i + 1] = dgv.Columns[i].HeaderText; 24 } 25 //填充数据 26 for (int i = 0; i < dgv.RowCount - 1; i++) 27 { 28 for (int j = 0; j < dgv.ColumnCount; j++) 29 { 30 if (dgv[j, i].ValueType == typeof(string)) 31 { 32 excel.Cells[i + 2, j + 1] = "'" + dgv[j, i].Value.ToString(); 33 } 34 else 35 { 36 excel.Cells[i + 2, j + 1] = dgv[j, i].Value.ToString(); 37 } 38 } 39 } 40 return true; 41 } 42 #endregion 43 44 #region DateGridView导出到csv格式的Excel 45 /// <summary> 46 /// 常用方法,列之间加\t,一行一行输出,此文件其实是csv文件,不过默认可以当成Excel打开。 47 /// </summary> 48 /// <remarks> 49 /// using System.IO; 50 /// </remarks> 51 /// <param name="dgv"></param> 52 private void DataGridViewToExcel(DataGridView dgv) 53 { 54 SaveFileDialog dlg = new SaveFileDialog(); 55 dlg.Filter = "Execl files (*.xls)|*.xls"; 56 dlg.FilterIndex = 0; 57 dlg.RestoreDirectory = true; 58 dlg.CreatePrompt = true; 59 dlg.Title = "保存为Excel文件"; 60 61 if (dlg.ShowDialog() == DialogResult.OK) 62 { 63 Stream myStream; 64 myStream = dlg.OpenFile(); 65 StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0)); 66 string columnTitle = ""; 67 try 68 { 69 //写入列标题 70 for (int i = 0; i < dgv.ColumnCount; i++) 71 { 72 if (i > 0) 73 { 74 columnTitle += "\t"; 75 } 76 columnTitle += dgv.Columns[i].HeaderText; 77 } 78 sw.WriteLine(columnTitle); 79 80 //写入列内容 81 for (int j = 0; j < dgv.Rows.Count; j++) 82 { 83 string columnValue = ""; 84 for (int k = 0; k < dgv.Columns.Count; k++) 85 { 86 if (k > 0) 87 { 88 columnValue += "\t"; 89 } 90 if (dgv.Rows[j].Cells[k].Value == null) 91 columnValue += ""; 92 else 93 columnValue += dgv.Rows[j].Cells[k].Value.ToString().Trim(); 94 } 95 sw.WriteLine(columnValue); 96 } 97 sw.Close(); 98 myStream.Close(); 99 } 100 catch (Exception e) 101 { 102 MessageBox.Show(e.ToString()); 103 } 104 finally 105 { 106 sw.Close(); 107 myStream.Close(); 108 } 109 } 110 } 111 #endregion 112 113 #region DataGridView导出到Excel,有一定的判断性 114 /// <summary> 115 ///方法,导出DataGridView中的数据到Excel文件 116 /// </summary> 117 /// <remarks> 118 /// add com "Microsoft Excel 11.0 Object Library" 119 /// using Excel=Microsoft.Office.Interop.Excel; 120 /// using System.Reflection; 121 /// </remarks> 122 /// <param name= "dgv"> DataGridView </param> 123 public static void DataGridViewToExcel(DataGridView dgv) 124 { 125 126 127 #region 验证可操作性 128 129 //申明保存对话框 130 SaveFileDialog dlg = new SaveFileDialog(); 131 //默然文件后缀 132 dlg.DefaultExt = "xls "; 133 //文件后缀列表 134 dlg.Filter = "EXCEL文件(*.XLS)|*.xls "; 135 //默然路径是系统当前路径 136 dlg.InitialDirectory = Directory.GetCurrentDirectory(); 137 //打开保存对话框 138 if (dlg.ShowDialog() == DialogResult.Cancel) return; 139 //返回文件路径 140 string fileNameString = dlg.FileName; 141 //验证strFileName是否为空或值无效 142 if (fileNameString.Trim() == " ") 143 { return; } 144 //定义表格内数据的行数和列数 145 int rowscount = dgv.Rows.Count; 146 int colscount = dgv.Columns.Count; 147 //行数必须大于0 148 if (rowscount <= 0) 149 { 150 MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information); 151 return; 152 } 153 154 //列数必须大于0 155 if (colscount <= 0) 156 { 157 MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information); 158 return; 159 } 160 161 //行数不可以大于65536 162 if (rowscount > 65536) 163 { 164 MessageBox.Show("数据记录数太多(最多不能超过65536条),不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information); 165 return; 166 } 167 168 //列数不可以大于255 169 if (colscount > 255) 170 { 171 MessageBox.Show("数据记录行数太多,不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information); 172 return; 173 } 174 175 //验证以fileNameString命名的文件是否存在,如果存在删除它 176 FileInfo file = new FileInfo(fileNameString); 177 if (file.Exists) 178 { 179 try 180 { 181 file.Delete(); 182 } 183 catch (Exception error) 184 { 185 MessageBox.Show(error.Message, "删除失败 ", MessageBoxButtons.OK, MessageBoxIcon.Warning); 186 return; 187 } 188 } 189 #endregion 190 Excel.Application objExcel = null; 191 Excel.Workbook objWorkbook = null; 192 Excel.Worksheet objsheet = null; 193 try 194 { 195 //申明对象 196 objExcel = new Microsoft.Office.Interop.Excel.Application(); 197 objWorkbook = objExcel.Workbooks.Add(Missing.Value); 198 objsheet = (Excel.Worksheet)objWorkbook.ActiveSheet; 199 //设置EXCEL不可见 200 objExcel.Visible = false; 201 202 //向Excel中写入表格的表头 203 int displayColumnsCount = 1; 204 for (int i = 0; i <= dgv.ColumnCount - 1; i++) 205 { 206 if (dgv.Columns[i].Visible == true) 207 { 208 objExcel.Cells[1, displayColumnsCount] = dgv.Columns[i].HeaderText.Trim(); 209 displayColumnsCount++; 210 } 211 } 212 //设置进度条 213 //tempProgressBar.Refresh(); 214 //tempProgressBar.Visible = true; 215 //tempProgressBar.Minimum=1; 216 //tempProgressBar.Maximum=dgv.RowCount; 217 //tempProgressBar.Step=1; 218 //向Excel中逐行逐列写入表格中的数据 219 for (int row = 0; row <= dgv.RowCount - 1; row++) 220 { 221 //tempProgressBar.PerformStep(); 222 223 displayColumnsCount = 1; 224 for (int col = 0; col < colscount; col++) 225 { 226 if (dgv.Columns[col].Visible == true) 227 { 228 try 229 { 230 objExcel.Cells[row + 2, displayColumnsCount] = dgv.Rows[row].Cells[col].Value.ToString().Trim(); 231 displayColumnsCount++; 232 } 233 catch (Exception) 234 { 235 236 } 237 238 } 239 } 240 } 241 //隐藏进度条 242 //tempProgressBar.Visible = false; 243 //保存文件 244 objWorkbook.SaveAs(fileNameString, Missing.Value, Missing.Value, Missing.Value, Missing.Value, 245 Missing.Value, Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value, 246 Missing.Value, Missing.Value); 247 } 248 catch (Exception error) 249 { 250 MessageBox.Show(error.Message, "警告 ", MessageBoxButtons.OK, MessageBoxIcon.Warning); 251 return; 252 } 253 finally 254 { 255 //关闭Excel应用 256 if (objWorkbook != null) objWorkbook.Close(Missing.Value, Missing.Value, Missing.Value); 257 if (objExcel.Workbooks != null) objExcel.Workbooks.Close(); 258 if (objExcel != null) objExcel.Quit(); 259 260 objsheet = null; 261 objWorkbook = null; 262 objExcel = null; 263 } 264 MessageBox.Show(fileNameString + "\n\n导出完毕! ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information); 265 266 } 267 268 #endregion
1 #region DataGridView导出到Excel解决打开时报后缀名不一致的问题 2 /// <summary> 3 /// DataGridView导出至Excel,解决问题:打开Excel文件格式与扩展名指定格式不一致 4 /// </summary> 5 /// <param name="dataGridView">数据源表格</param> 6 /// <param name="isShowExcle">导出时是否显示excel界面</param> 7 /// <returns></returns> 8 public static bool DcExcel(DataGridView dataGridView, bool isShowExcle = true) 9 { 10 int FormatNum;//保存excel文件的格式 11 Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 12 string excelVersion = excel.Version;//获取你使用的excel 的版本号 13 14 //声明保存对话框 15 SaveFileDialog saveFileDialog = new SaveFileDialog(); 16 //默然文件后缀 17 saveFileDialog.DefaultExt = "xls"; 18 19 if (Convert.ToDouble(excelVersion) < 12)//You use Excel 97-2003 20 { 21 FormatNum = -4143; 22 //文件后缀列表 23 saveFileDialog.Filter = "Excel(*.xls)|*.xls"; 24 } 25 else//you use excel 2007 or later 26 { 27 FormatNum = 56; 28 //文件后缀列表 29 saveFileDialog.Filter = "Excel(*.xls)|*.xls|Excel(2007-2016)(*.xlsx)|*.xlsx"; 30 } 31 Form fr = dataGridView.Parent as Form; 32 if (fr != null)//默认文件名 33 { 34 saveFileDialog.FileName = fr.Text; 35 } 36 //默然路径是系统当前路径 37 saveFileDialog.InitialDirectory = Directory.GetCurrentDirectory(); 38 //打开保存对话框 39 if (saveFileDialog.ShowDialog() == DialogResult.Cancel) 40 return false; 41 //返回文件路径 42 string fileName = saveFileDialog.FileName; 43 if (string.IsNullOrEmpty(fileName.Trim())) 44 { return false; } 45 if (dataGridView.Rows.Count == 0) 46 return false; 47 //建立Excel对象 48 49 var objWorkbook = excel.Application.Workbooks.Add(true); 50 excel.Visible = isShowExcle; 51 //生成字段名称 52 for (int i = 0; i < dataGridView.ColumnCount; i++) 53 { 54 excel.Cells[1, i + 1] = dataGridView.Columns[i].HeaderText; 55 excel.Cells[1, i + 1].Font.Bold = true; 56 } 57 //填充数据 58 for (int i = 0; i < dataGridView.RowCount - 1; i++) 59 { 60 for (int j = 0; j < dataGridView.ColumnCount; j++) 61 { 62 if (dataGridView[j, i].ValueType == typeof(string)) 63 { 64 excel.Cells[i + 2, j + 1] = "'" + dataGridView[j, i].Value.ToString(); 65 } 66 else 67 { 68 excel.Cells[i + 2, j + 1] = dataGridView[j, i].Value.ToString(); 69 } 70 } 71 } 72 //Excel.XlFileFormat.xlOpenXMLWorkbook(.xlsx) 73 //Excel.XlFileFormat.xlExcel8(Excel97 - 2003, .xls) 74 //判断excel文件的保存格式是xls还是xlsx 75 var format = fileName.EndsWith(".xls") ? Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel8 : Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook; 76 objWorkbook.SaveAs(fileName, format, Missing.Value, Missing.Value, Missing.Value, 77 Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value, 78 Missing.Value, Missing.Value); 79 return true; 80 } 81 #endregion