zoukankan      html  css  js  c++  java
  • 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导出

    复制代码
    #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("导出文件时出错,文件可能正被打开!
    " + 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的性能比较。

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

  • 相关阅读:
    记录软件工程课程项目开发时遇到的各种小问题(django)
    用python实现逻辑回归
    利用KD树进行异常检测
    PyQt4入门学习笔记(五)
    PyQt4入门学习笔记(四)
    import matplolib 时出现"This probably means that tk wasn't installed properly."的解决方法
    IDEA上安装和使用checkstyle,findbugs,visualVM,PMD插件
    pycharm连接mysql数据库
    基于trie树做一个ac自动机
    用python实现最长公共子序列算法(找到所有最长公共子串)
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/8462215.html
Copyright © 2011-2022 走看看