DataGridView 数据 导出 Excel --转

    技术2026-04-18  0

    怎样把WinForm下的“DGV”里的绑定数据库后的数据导出到Excel中。

    比如:在窗体里有个一“DGV”,DataGridView1,绑定了数据源,怎样把它里面的数据导出到Excel中?

     

     

    用流保存成xls文件. 这种方法比较好,不用引用Excel组件. 下面是具体例子,可以参考using System.IO; /// <summary> /// 另存新档按钮 /// </summary> private void SaveAs() //另存新档按钮 导出成Excel { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Execl files (*.xls)|*.xls"; saveFileDialog.FilterIndex = 0; saveFileDialog.RestoreDirectory = true; saveFileDialog.CreatePrompt = true; saveFileDialog.Title = "Export Excel File To"; saveFileDialog.ShowDialog(); Stream myStream; myStream = saveFileDialog.OpenFile(); //StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312")); StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0)); string str = ""; try { //写标题 for (int i = 0; i < dgvAgeWeekSex.ColumnCount; i++) { if (i > 0) { str += "/t"; } str += dgvAgeWeekSex.Columns[i].HeaderText; } sw.WriteLine(str); //写内容 for (int j = 0; j < dgvAgeWeekSex.Rows.Count; j++) { string tempStr = ""; for (int k = 0; k < dgvAgeWeekSex.Columns.Count; k++) { if (k > 0) { tempStr += "/t"; } tempStr += dgvAgeWeekSex.Rows[j].Cells[k].Value.ToString(); } sw.WriteLine(tempStr); } sw.Close(); myStream.Close(); } catch (Exception e) { MessageBox.Show(e.ToString()); } finally { sw.Close(); myStream.Close(); } }

     

     

    #region DataGridView数据显示到Excel   /// <summary>    /// 打开Excel并将DataGridView控件中数据导出到Excel   /// </summary>    /// <param name="dgv">DataGridView对象 </param>    /// <param name="isShowExcle">是否显示Excel界面 </param>    /// <remarks>   /// add com "Microsoft Excel 11.0 Object Library"   /// using Excel=Microsoft.Office.Interop.Excel;   /// </remarks>   /// <returns> </returns>    public bool DataGridviewShowToExcel(DataGridView dgv, bool isShowExcle)   {       if (dgv.Rows.Count == 0)           return false;       //建立Excel对象        Excel.Application excel = new Excel.Application();       excel.Application.Workbooks.Add(true);       excel.Visible = isShowExcle;       //生成字段名称        for (int i = 0; i < dgv.ColumnCount; i++)       {           excel.Cells[1, i + 1] = dgv.Columns[i].HeaderText;       }       //填充数据        for (int i = 0; i < dgv.RowCount - 1; i++)       {           for (int j = 0; j < dgv.ColumnCount; j++)           {               if (dgv[j, i].ValueType == typeof(string))               {                   excel.Cells[i + 2, j + 1] = "'" + dgv[j, i].Value.ToString();               }               else               {                   excel.Cells[i + 2, j + 1] = dgv[j, i].Value.ToString();               }           }       }       return true;   }   #endregion      #region DateGridView导出到csv格式的Excel   /// <summary>   /// 常用方法,列之间加/t,一行一行输出,此文件其实是csv文件,不过默认可以当成Excel打开。   /// </summary>   /// <remarks>   /// using System.IO;   /// </remarks>   /// <param name="dgv"></param>   private void DataGridViewToExcel(DataGridView dgv)   {       SaveFileDialog dlg = new SaveFileDialog();       dlg.Filter = "Execl files (*.xls)|*.xls";       dlg.FilterIndex = 0;       dlg.RestoreDirectory = true;       dlg.CreatePrompt = true;       dlg.Title = "保存为Excel文件";          if (dlg.ShowDialog() == DialogResult.OK)       {           Stream myStream;           myStream = dlg.OpenFile();           StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));           string columnTitle = "";           try           {               //写入列标题               for (int i = 0; i < dgv.ColumnCount; i++)               {                   if (i > 0)                   {                       columnTitle += "/t";                   }                   columnTitle += dgv.Columns[i].HeaderText;               }               sw.WriteLine(columnTitle);                  //写入列内容               for (int j = 0; j < dgv.Rows.Count; j++)               {                   string columnValue = "";                   for (int k = 0; k < dgv.Columns.Count; k++)                   {                       if (k > 0)                       {                           columnValue += "/t";                       }                       if (dgv.Rows[j].Cells[k].Value == null)                           columnValue += "";                       else                           columnValue += dgv.Rows[j].Cells[k].Value.ToString().Trim();                   }                   sw.WriteLine(columnValue);               }               sw.Close();               myStream.Close();           }           catch (Exception e)           {               MessageBox.Show(e.ToString());           }           finally           {               sw.Close();               myStream.Close();           }       }   }    #endregion     #region DataGridView导出到Excel,有一定的判断性   /// <summary>    ///方法,导出DataGridView中的数据到Excel文件    /// </summary>    /// <remarks>   /// add com "Microsoft Excel 11.0 Object Library"   /// using Excel=Microsoft.Office.Interop.Excel;   /// using System.Reflection;   /// </remarks>   /// <param name= "dgv"> DataGridView </param>    public static void DataGridViewToExcel(DataGridView dgv)   {           #region   验证可操作性          //申明保存对话框        SaveFileDialog dlg = new SaveFileDialog();       //默然文件后缀        dlg.DefaultExt = "xls ";       //文件后缀列表        dlg.Filter = "EXCEL文件(*.XLS)|*.xls ";       //默然路径是系统当前路径        dlg.InitialDirectory = Directory.GetCurrentDirectory();       //打开保存对话框        if (dlg.ShowDialog() == DialogResult.Cancel) return;       //返回文件路径        string fileNameString = dlg.FileName;       //验证strFileName是否为空或值无效        if (fileNameString.Trim() == " ")       { return; }       //定义表格内数据的行数和列数        int rowscount = dgv.Rows.Count;       int colscount = dgv.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       Excel.Application objExcel = null;       Excel.Workbook objWorkbook = null;       Excel.Worksheet objsheet = null;       try       {           //申明对象            objExcel = new Microsoft.Office.Interop.Excel.Application();           objWorkbook = objExcel.Workbooks.Add(Missing.Value);           objsheet = (Excel.Worksheet)objWorkbook.ActiveSheet;           //设置EXCEL不可见            objExcel.Visible = false;              //向Excel中写入表格的表头            int displayColumnsCount = 1;           for (int i = 0; i <= dgv.ColumnCount - 1; i++)           {               if (dgv.Columns[i].Visible == true)               {                   objExcel.Cells[1, displayColumnsCount] = dgv.Columns[i].HeaderText.Trim();                   displayColumnsCount++;               }           }           //设置进度条            //tempProgressBar.Refresh();            //tempProgressBar.Visible   =   true;            //tempProgressBar.Minimum=1;            //tempProgressBar.Maximum=dgv.RowCount;            //tempProgressBar.Step=1;            //向Excel中逐行逐列写入表格中的数据            for (int row = 0; row <= dgv.RowCount - 1; row++)           {               //tempProgressBar.PerformStep();                   displayColumnsCount = 1;               for (int col = 0; col < colscount; col++)               {                   if (dgv.Columns[col].Visible == true)                   {                       try                       {                           objExcel.Cells[row + 2, displayColumnsCount] = dgv.Rows[row].Cells[col].Value.ToString().Trim();                           displayColumnsCount++;                       }                       catch (Exception)                       {                          }                      }               }           }           //隐藏进度条            //tempProgressBar.Visible   =   false;            //保存文件            objWorkbook.SaveAs(fileNameString, Missing.Value, Missing.Value, Missing.Value, Missing.Value,                   Missing.Value, Excel.XlSaveAsAccessMode.xlShared, Missing.Value, Missing.Value, Missing.Value,                   Missing.Value, Missing.Value);       }       catch (Exception error)       {           MessageBox.Show(error.Message, "警告 ", MessageBoxButtons.OK, MessageBoxIcon.Warning);           return;       }       finally       {           //关闭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 + "/n/n导出完毕! ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);      }     #endregion 
    最新回复(0)