博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Npoi导出excel整理(附源码)
阅读量:5214 次
发布时间:2019-06-14

本文共 11387 字,大约阅读时间需要 37 分钟。

      前些日子做了一个简单的winform程序,需要导出的功能,刚开始省事直接使用微软的组件,但是导出之后发现效率极其低下,绝对像web那样使用npoi组件,因此简单的进行了整理,包括直接根据DataTable导出excel及DataGridview导出excel,版本是1.2.4,下面贴下主要代码两种方式,1、NPOI导出excel、 2、普通的导出excel

下面贴下主要代码:NPOI导出

///          /// DataTable导出到Excel文件         ///          /// 源DataTable         /// 表头文本         /// 保存位置         public static void DataTableToExcel(DataTable dtSource, string strHeaderText, string strFileName)         {             using (MemoryStream ms = DataTableToExcel(dtSource, strHeaderText))             {                 using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))                 {                     byte[] data = ms.ToArray();                     fs.Write(data, 0, data.Length);                     fs.Flush();                 }             }         }///          /// DataTable导出到Excel的MemoryStream         ///          /// 源DataTable         /// 表头文本         public static MemoryStream DataTableToExcel(DataTable dtSource, string strHeaderText)         {             HSSFWorkbook workbook = new HSSFWorkbook();             HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();              #region 右击文件 属性信息             {                 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();                 dsi.Company = "NPOI";                 workbook.DocumentSummaryInformation = dsi;                  SummaryInformation si = PropertySetFactory.CreateSummaryInformation();                 si.Author = "文件作者信息"; //填加xls文件作者信息                 si.ApplicationName = "创建程序信息"; //填加xls文件创建程序信息                 si.LastAuthor = "最后保存者信息"; //填加xls文件最后保存者信息                 si.Comments = "作者信息"; //填加xls文件作者信息                 si.Title = "标题信息"; //填加xls文件标题信息                 si.Subject = "主题信息";//填加文件主题信息                 si.CreateDateTime = System.DateTime.Now;                 workbook.SummaryInformation = si;             }             #endregion             HSSFCellStyle dateStyle = (HSSFCellStyle)workbook.CreateCellStyle();             HSSFDataFormat format = (HSSFDataFormat)workbook.CreateDataFormat();             dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");              //取得列宽             int[] arrColWidth = new int[dtSource.Columns.Count];             foreach (DataColumn item in dtSource.Columns)             {                 arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;             }             for (int i = 0; i < dtSource.Rows.Count; i++)             {                 for (int j = 0; j < dtSource.Columns.Count; j++)                 {                     int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;                     if (intTemp > arrColWidth[j])                     {                         arrColWidth[j] = intTemp;                     }                 }             }              int rowIndex = 0;              foreach (DataRow row in dtSource.Rows)             {                 #region 新建表,填充表头,填充列头,样式                 if (rowIndex == 65535 || rowIndex == 0)                 {                     if (rowIndex != 0)                     {                         sheet = (HSSFSheet)workbook.CreateSheet();                     }                      #region 表头及样式                     {                         HSSFRow headerRow = (HSSFRow)sheet.CreateRow(0);                         headerRow.HeightInPoints = 25;                         headerRow.CreateCell(0).SetCellValue(strHeaderText);                         HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();                       //  headStyle.Alignment = CellHorizontalAlignment.CENTER;                         HSSFFont font = (HSSFFont)workbook.CreateFont();                         font.FontHeightInPoints = 20;                         font.Boldweight = 700;                         headStyle.SetFont(font);                         headerRow.GetCell(0).CellStyle = headStyle;                        // sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));                         //headerRow.Dispose();                     }                     #endregion                       #region 列头及样式                     {                         HSSFRow headerRow = (HSSFRow)sheet.CreateRow(1);                          HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();                         //headStyle.Alignment = CellHorizontalAlignment.CENTER;                         HSSFFont font = (HSSFFont)workbook.CreateFont();                         font.FontHeightInPoints = 10;                         font.Boldweight = 700;                         headStyle.SetFont(font);                          foreach (DataColumn column in dtSource.Columns)                         {                             headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);                             headerRow.GetCell(column.Ordinal).CellStyle = headStyle;                              //设置列宽                             sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);                          }                        // headerRow.Dispose();                     }                     #endregion                      rowIndex = 2;                 }                 #endregion                   #region 填充内容                 HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);                 foreach (DataColumn column in dtSource.Columns)                 {                     HSSFCell newCell =(HSSFCell) dataRow.CreateCell(column.Ordinal);                      string drValue = row[column].ToString();                      switch (column.DataType.ToString())                     {                         case "System.String"://字符串类型                             newCell.SetCellValue(drValue);                             break;                         case "System.DateTime"://日期类型                            System.DateTime dateV;                            System.DateTime.TryParse(drValue, out dateV);                             newCell.SetCellValue(dateV);                              newCell.CellStyle = dateStyle;//格式化显示                             break;                         case "System.Boolean"://布尔型                             bool boolV = false;                             bool.TryParse(drValue, out boolV);                             newCell.SetCellValue(boolV);                             break;                         case "System.Int16"://整型                         case "System.Int32":                         case "System.Int64":                         case "System.Byte":                             int intV = 0;                             int.TryParse(drValue, out intV);                             newCell.SetCellValue(intV);                             break;                         case "System.Decimal"://浮点型                         case "System.Double":                             double doubV = 0;                             double.TryParse(drValue, out doubV);                             newCell.SetCellValue(doubV);                             break;                         case "System.DBNull"://空值处理                             newCell.SetCellValue("");                             break;                         default:                             newCell.SetCellValue("");                             break;                     }                  }                 #endregion                  rowIndex++;             }              using (MemoryStream ms = new MemoryStream())             {                 workbook.Write(ms);                 ms.Flush();                 ms.Position = 0;                  sheet.Dispose();                 //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet                 return ms;             }          }

普通excel导出

View Code
#region 导出excel       public static void ExportExcel(string fileName, DataGridView myDGV,bool isShowDialog)       {           string saveFileName = "";           if (isShowDialog)           {               //bool fileSaved = false;               SaveFileDialog saveDialog = new SaveFileDialog();               saveDialog.DefaultExt = "xls";               saveDialog.Filter = "Excel文件|*.xls";               saveDialog.FileName = fileName;               saveDialog.ShowDialog();               saveFileName = saveDialog.FileName;               if (saveFileName.IndexOf(":") < 0) return; //被点了取消            }           else           {              // saveFileName = Application.StartupPath + @"\导出记录\" + fileName + ".xls";               saveFileName = fileName;           }           Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();           if (xlApp == null)           {               MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");               return;           }           Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;           Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);           Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];//取得sheet1            //写入标题           for (int i = 0; i < myDGV.ColumnCount; i++)           {               worksheet.Cells[1, i + 1] = myDGV.Columns[i].HeaderText;           }           //写入数值           for (int r = 0; r < myDGV.Rows.Count; r++)           {               for (int i = 0; i < myDGV.ColumnCount; i++)               {                   if (myDGV[i, r].ValueType == typeof(string)                      || myDGV[i, r].ValueType == typeof(DateTime))//这里就是验证DataGridView单元格中的类型,如果是string或是DataTime类型,则在放入缓 存时在该内容前加入" ";                   {                       worksheet.Cells[r + 2, i + 1] = "'" + myDGV.Rows[r].Cells[i].Value;                   }                   else                   {                       worksheet.Cells[r + 2, i + 1] = myDGV.Rows[r].Cells[i].Value;                   }               }               System.Windows.Forms.Application.DoEvents();           }           worksheet.Columns.EntireColumn.AutoFit();//列宽自适应           //if (Microsoft.Office.Interop.cmbxType.Text != "Notification")           //{           //    Excel.Range rg = worksheet.get_Range(worksheet.Cells[2, 2], worksheet.Cells[ds.Tables[0].Rows.Count + 1, 2]);           //    rg.NumberFormat = "00000000";           //}           if (saveFileName != "")           {               try               {                   workbook.Saved = true;                   workbook.SaveCopyAs(saveFileName);                   //fileSaved = true;               }               catch (Exception ex)               {                   //fileSaved = false;                   MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message);               }           }           //else           //{           //    fileSaved = false;           //}           xlApp.Quit();           GC.Collect();//强行销毁            // if (fileSaved && System.IO.File.Exists(saveFileName)) System.Diagnostics.Process.Start(saveFileName); //打开EXCEL           MessageBox.Show(fileName + "保存成功", "提示", MessageBoxButtons.OK);       }       #endregion

5万条数据性能测试

下面附上源码,里面有NPOI和普通导出excel的性能比较。

如果您觉的文章不错,请点击推荐!

 

 

 

 

转载于:https://www.cnblogs.com/WikStone/archive/2013/01/12/2857466.html

你可能感兴趣的文章
HDU-1242-Rescue
查看>>
在.net core上使用Entity FramWork(Db first)
查看>>
Eclipse中如何开启断言(Assert),方法有二
查看>>
System.Net.WebException: 无法显示错误消息,原因是无法找到包含此错误消息的可选资源程序集...
查看>>
压缩图片 待验证
查看>>
UIImage 和 iOS 图片压缩UIImage / UIImageVIew
查看>>
MongoDB的数据库、集合的基本操作
查看>>
ajax向后台传递数组
查看>>
疯狂JAVA16课之对象与内存控制
查看>>
[转载]树、森林和二叉树的转换
查看>>
WPF移动Window窗体(鼠标点击左键移动窗体自定义行为)
查看>>
软件测试-----Graph Coverage作业
查看>>
django ORM创建数据库方法
查看>>
创建Oracle synonym 详解
查看>>
php7 新特性整理
查看>>
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
linux查看端口占用
查看>>
hdu - 1226 超级密码 (bfs)
查看>>
Qt重写paintEvent方法遇到的问题
查看>>
Sql常见面试题 受用了
查看>>