Winform中DataGridView导出为Excel详细版
最详细的版本了!!!!
话不多说献上效果图:导出之前
导出之后:
第一步:导包
第二步,创建一个NPOIHelper类,DataGridView填充并写入Excel,代码:
记得导入命名空间
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;namespace AegeanHotel_management_system{class NPOIHelper{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,当然也可以循环读取每个sheetdataTable = 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;elsedataRow[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;}}}}
最后我们只需要在按钮的click事件中写入代码就好了:
private void button1_Click(object sender, EventArgs e){//打开文件对话框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 Sanname as 姓名,Sanphone as 电话,SanRoomType as 房间类型,SanRoomID as 房间号码,SanRuTime as 入住时间,SanLiTime as 离店时间,SanMoney as 房费,SanYaJin as 押金,SanZFway as 支付方式 from San_Checkin\";DataTable dt = DBHelper.GetDataTable(sql);NPOIHelper.DataTableToExcel(dt,txtPath);}}
打开文件对话框,选择路径进行保存。
最后就导出成功喽!
嘿嘿嘿!关注一下小Monkey吧!
感谢大佬指正 小Monkey
如果你觉得有用的话,就留个赞吧!蟹蟹