隐藏

在C#中Winform开发如何将DataGridView导出到Excel中

发布:2022/12/20 16:27:10作者:管理员 来源:本站 浏览次数:688

1、前言


大家再使用该教程成功后记得来点个赞哦!话不多说,跟着我的步骤保证你也能成功,下面直接开始!

2、效果展示


导出前


导出后



3、详细步骤


下面是详细操作步骤,请跟着我的步伐,一步一步进行操作,保证你能够导出成功!

3.1 添加NPOI和NPOI.Excel包


首先请请确定你的vs已经打开了【解决方案资源管理器】,打开步骤见下图:


在资源管理器中找到【引用】,然后在【引用】上右键选择【管理程序包】并点击,如下图:


在新打开的窗口中点击【浏览】并在搜索框中依次输入NPOI和NPOI.Excel并进行安装,安装按钮位置如下图:


待安装完成再进行下一步

3.2 创建NPOIHelper类


首先在资源管理器中选中你的项目,【右键】找到【添加】-->【类】,具体如下图:


创建一个名字为【NPOIHelper.cs】的类并打开

3.2.1 导入命名空间


复制下面的代码,覆盖你自动生成的命名空间


using NPOI.HSSF.UserModel;

using NPOI.SS.UserModel;

using NPOI.XSSF.UserModel;

using System;

using System.Collections.Generic;

using System.Data;

using System.IO;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;


3.2.2 插入代码


将下面的代码导入到下图位置:



public class ExcelUtility

       {

           /// <summary>

           /// 将excel导入到datatable

           /// </summary>

           /// <param name="filePath">excel路径</param>

           /// <param name="isColumnName">第一行是否是列名</param>

           /// <returns>返回datatable</returns>

           public static DataTable ExcelToDataTable(string filePath, bool isColumnName)

           {

               DataTable dataTable = null;

               FileStream fs = null;

               DataColumn column = null;

               DataRow dataRow = null;

               IWorkbook workbook = null;

               ISheet sheet = null;

               IRow row = null;

               ICell cell = null;

               int startRow = 0;

               try

               {

                   using (fs = File.OpenRead(filePath))

                   {

                       // 版本后缀控制

                       if (filePath.IndexOf(".xlsx") > 0)

                           workbook = new XSSFWorkbook(fs);

                       // 版本后缀控制

                       else if (filePath.IndexOf(".xls") > 0)

                           workbook = new HSSFWorkbook(fs);


                       if (workbook != null)

                       {

                           sheet = workbook.GetSheetAt(0);//读取第一个sheet,当然也可以循环读取每个sheet

                           dataTable = new DataTable();

                           if (sheet != null)

                           {

                               int rowCount = sheet.LastRowNum;//总行数

                               if (rowCount > 0)

                               {

                                   IRow firstRow = sheet.GetRow(0);//第一行

                                   int cellCount = firstRow.LastCellNum;//列数


                                   //构建datatable的列

                                   if (isColumnName)

                                   {

                                       startRow = 1;//如果第一行是列名,则从第二行开始读取

                                       for (int i = firstRow.FirstCellNum; i < cellCount; ++i)

                                       {

                                           cell = firstRow.GetCell(i);

                                           if (cell != null)

                                           {

                                               if (cell.StringCellValue != null)

                                               {

                                                   column = new DataColumn(cell.StringCellValue);

                                                   dataTable.Columns.Add(column);

                                               }

                                           }

                                       }

                                   }

                                   else

                                   {

                                       for (int i = firstRow.FirstCellNum; i < cellCount; ++i)

                                       {

                                           column = new DataColumn("column" + (i + 1));

                                           dataTable.Columns.Add(column);

                                       }

                                   }


                                   //填充行

                                   for (int i = startRow; i <= rowCount; ++i)

                                   {

                                       row = sheet.GetRow(i);

                                       if (row == null) continue;


                                       dataRow = dataTable.NewRow();

                                       for (int j = row.FirstCellNum; j < cellCount; ++j)

                                       {

                                           cell = row.GetCell(j);

                                           if (cell == null)

                                           {

                                               dataRow[j] = "";

                                           }

                                           else

                                           {

                                               //CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)

                                               switch (cell.CellType)

                                               {

                                                   case CellType.Blank:

                                                       dataRow[j] = "";

                                                       break;

                                                   case CellType.Numeric:

                                                       short format = cell.CellStyle.DataFormat;

                                                       //对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理

                                                       if (format == 14 || format == 31 || format == 57 || format == 58)

                                                           dataRow[j] = cell.DateCellValue;

                                                       else

                                                           dataRow[j] = cell.NumericCellValue;

                                                       break;

                                                   case CellType.String:

                                                       dataRow[j] = cell.StringCellValue;

                                                       break;

                                               }

                                           }

                                       }

                                       dataTable.Rows.Add(dataRow);

                                   }

                               }

                           }

                       }

                   }

                   return dataTable;

               }

               catch (Exception)

               {

                   if (fs != null)

                   {

                       fs.Close();

                   }

                   return null;

               }

           }

       }

       public static bool DataTableToExcel(DataTable dt, string txtPath)

       {

           bool result = false;

           IWorkbook workbook = null;

           FileStream fs = null;

           IRow row = null;

           ISheet sheet = null;

           ICell cell = null;

           try

           {

               if (dt != null && dt.Rows.Count > 0)

               {

                   workbook = new HSSFWorkbook();

                   sheet = workbook.CreateSheet("Sheet0");//创建一个名称为Sheet0的表

                   int rowCount = dt.Rows.Count;//行数

                   int columnCount = dt.Columns.Count;//列数


                   //设置列头

                   row = sheet.CreateRow(0);//excel第一行设为列头

                   for (int c = 0; c < columnCount; c++)

                   {

                       cell = row.CreateCell(c);

                       cell.SetCellValue(dt.Columns[c].ColumnName);

                   }


                   //设置每行每列的单元格,

                   for (int i = 0; i < rowCount; i++)

                   {

                       row = sheet.CreateRow(i + 1);

                       for (int j = 0; j < columnCount; j++)

                       {

                           cell = row.CreateCell(j);//excel第二行开始写入数据

                           cell.SetCellValue(dt.Rows[i][j].ToString());

                       }

                   }

                   using (fs = File.OpenWrite(txtPath))

                   {

                       workbook.Write(fs);//向打开的这个xls文件中写入数据

                       result = true;

                   }

               }

               MessageBox.Show("导出成功");

               return result;

           }

           catch (Exception)

           {

               if (fs != null)

               {

                   fs.Close();

               }

               return false;

           }


       }


3.3 给画面添加SaveFileDialog


首先在工具箱里找到SaveFileDialog(如果不知到工具箱在哪的可以点击上方的【视图】--> 【工具箱】)


点住SaveFileDialog拖入页面中效果如上图所示

3.4 给按钮添加click事件


给按钮添加click事件(直接双击按钮即可),并在click函数中插入以下代码


//打开文件对话框,导出文件

SaveFileDialog saveFileDialog1 = new SaveFileDialog();

saveFileDialog1.Title = "保存文件";

saveFileDialog1.Filter = "Excel 文件(*.xls)|*.xls|Excel 文件(*.xlsx)|*.xlsx|所有文件(*.*)|*.*";

saveFileDialog1.FileName = "用户信息.xls"; //设置默认另存为的名字

if (this.saveFileDialog1.ShowDialog() == DialogResult.OK)

{

   string txtPath = this.saveFileDialog1.FileName;

   string sql = "select ID as ID,UserName as 用户名,LoginAccount as 账号,UserPower as 用户权限,Founder as 创建者,Addtime as 创建日期,Activestate as 状态 from UserData";

   SqlHelp sqlHelper = new SqlHelp();

   DataTable dt = sqlHelper.GetDataTableValue(sql);

   NPOIHelper.DataTableToExcel(dt, txtPath);

}


注意:上面的saveFileDialog1要和你视图里的一样一般没问题,sql语句我就不详细讲了不会的可以看我其他文章。