Npoi导出excel整理(附源码)

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

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

     /// <summary>

         /// DataTable导出到Excel文件

         /// </summary>

         /// <param name="dtSource">源DataTable</param>

         /// <param name="strHeaderText">表头文本</param>

         /// <param name="strFileName">保存位置</param>

         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();

                 }

             }

         }







/// <summary>

         /// DataTable导出到Excel的MemoryStream

         /// </summary>

         /// <param name="dtSource">源DataTable</param>

         /// <param name="strHeaderText">表头文本</param>

         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整理(附源码)

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

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

 

 

 

 

你可能感兴趣的:(导出Excel)