zoukankan      html  css  js  c++  java
  • Excel组件NPOI操作类

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using NPOI.SS.UserModel;

    using System.IO;

    using System.Data;

    using NPOI.HSSF.UserModel;

    using System.Collections;

    using System.Text.RegularExpressions;

    using System.Xml;

     

    namespace  Util

    {

       public class ExcelHelper

        {

           private IWorkbook _workbook;

           public bool AutoColumnHeder;

           public FileStream fileStream;

     

     

     

           public ExcelHelper(string _excelFielPath)

           {

               this.AutoColumnHeder = true;

               this.initHSSFWorkbook(_excelFielPath);

           }

     

           public ExcelHelper(string _excelFielPath, bool _autoColumnHeder)

           {

               this.AutoColumnHeder = true;

               this.initHSSFWorkbook(_excelFielPath);

               this.AutoColumnHeder = _autoColumnHeder;

           }

     

           public ExcelHelper(string _excelFielPath, string sheetName)

           {

               this.AutoColumnHeder = true;

               this.initHSSFWorkbook(_excelFielPath);

               if (!this.IsExistExcelTableName(sheetName))

               {

                   throw new Exception("指定的模板格式不正确,请选择正确的EXCEL模板");

               }

           }

     

           public void Dispose()

           {

               if (this.fileStream != null)

               {

                   this.fileStream.Close();

                   this.fileStream.Dispose();

               }

           }

     

           public DataSet ExcelToDataSet()

           {

               DataSet set = new DataSet();

               List<string> excelTablesName = this.GetExcelTablesName();

               foreach (string str in excelTablesName)

               {

                   set.Tables.Add(this.ExcelToDataTable(str));

               }

               return set;

           }

     

           public DataTable ExcelToDataTable(int index)

           {

               ISheet sheetAt = this._workbook.GetSheetAt(index);

               return this.ExcelToDataTable(sheetAt, 0);

           }

     

           public DataTable ExcelToDataTable(string tName)

           {

               ISheet sheet = this._workbook.GetSheet(tName);

               return this.ExcelToDataTable(sheet, 0);

           }

     

           private DataTable ExcelToDataTable(ISheet sheet, int headerIndex)

           {

               if (sheet.LastRowNum < headerIndex)

               {

                   throw new Exception("Excel模板格式不对,读取下标值错误");

               }

               DataTable table = new DataTable();

               IRow row = sheet.GetRow(headerIndex);

               int lastCellNum = row.LastCellNum;

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

               {

                   string columnName = string.Empty;

                   if (this.AutoColumnHeder)

                   {

                       columnName = Convert.ToChar(0x41) + i.ToString();

                   }

                   else

                   {

                        columnName = row.GetCell(i).ToString();

                   }

                   table.Columns.Add(columnName);

               }

               IEnumerator rowEnumerator = sheet.GetRowEnumerator();

               if (!this.AutoColumnHeder)

               {

                    rowEnumerator.MoveNext();

               }

               while (rowEnumerator.MoveNext())

               {

                   IRow current = (IRow)rowEnumerator.Current;

                   DataRow row3 = table.NewRow();

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

                   {

                       ICell cell = current.GetCell(j);

                       if (cell == null || cell.ToString().Trim() == "")

                       {

                           row3[j] = System.DBNull.Value;

                       }

                       else

                       {

                           if (cell.CellType == CellType.NUMERIC && HSSFDateUtil.IsCellDateFormatted(cell))

                           {

                               row3[j] = HSSFDateUtil.GetJavaDate(cell.NumericCellValue).ToString("yyyy-MM-dd");

     

                           }

                           else

                           {

                               row3[j] = cell;

                           }

                       }

                   }

                    table.Rows.Add(row3);

               }

               return table;

           }

     

           public DataTable ExcelToDataTable(string tName, int headerIndex)

           {

               ISheet sheet = this._workbook.GetSheet(tName);

               return this.ExcelToDataTable(sheet, headerIndex);

           }

     

           public static MemoryStream Export(DataTable dtSource)

           {

               IWorkbook workbook = new HSSFWorkbook();

               string sheetname = "Sheet1";

               if (!string.IsNullOrEmpty(dtSource.TableName))

               {

                   sheetname = dtSource.TableName;

               }

               ISheet sheet = workbook.CreateSheet(sheetname);

               IRow row = sheet.CreateRow(0);

     

               IFont font = workbook.CreateFont();

               font.FontName = "宋体";

     

               foreach (DataColumn column in dtSource.Columns)

               {

                   row.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);

               }

               ICellStyle dateFormat = GetDateFormat(workbook);

               int rownum = 1;

               foreach (DataRow row2 in dtSource.Rows)

               {

                   IRow row3 = sheet.CreateRow(rownum);

                   foreach (DataColumn column in dtSource.Columns)

                   {

                       ICell newCell = row3.CreateCell(column.Ordinal);

     

                       HorizontalAlignment ha = HorizontalAlignment.CENTER;//水平对齐

     

                       SetCellValue(row2[column].ToString(), dateFormat,font,ha, column.DataType, newCell);

                   }

                   rownum++;

               }

               using (MemoryStream stream = new MemoryStream())

               {

                   workbook.Write(stream);

                   stream.Flush();

                   stream.Position = 0L;

                   return stream;

               }

           }

     

           public static void Export(DataTable dtSource, string strFileName)

           {

               using (MemoryStream stream = Export(dtSource))

               {

                   using (FileStream stream2 = new FileStream(strFileName, FileMode.Create, FileAccess.Write))

                   {

                       byte[] buffer = stream.ToArray();

                       stream2.Write(buffer, 0, buffer.Length);

                       stream2.Flush();

                   }

               }

           }

     

     

           public static MemoryStream Export<T>(IList<T> list,XmlNodeList xnlColMapp) where T : class

           {

               IWorkbook workbook = new HSSFWorkbook();

               string sheetname = "Sheet1";

      

               ISheet sheet = workbook.CreateSheet(sheetname);

               IRow row = sheet.CreateRow(0);

               IFont font = workbook.CreateFont();

               font.FontName = "宋体";

     

               int colOrdinal = 0;//列的序号

               foreach (XmlNode xn in xnlColMapp)

               {

                   string headname = xn.Attributes["column"].Value;//单元格头部名称

                   row.CreateCell(colOrdinal).SetCellValue(headname);

                   colOrdinal++;

               }

     

               Type it = list.First().GetType();

     

               ICellStyle dateFormat = GetDateFormat(workbook);

               int rownum = 1;

               foreach (T t in list)

               {

                   if (t == null)

                   {

                       continue;

                   }

     

                   IRow row3 = sheet.CreateRow(rownum);

                   colOrdinal = 0;

                   foreach (XmlNode xn in xnlColMapp)

                   {

                       string propName = xn.Attributes["property"].Value;

                       object cellVal;

                       if (propName != "")

                       {

                           System.Reflection.PropertyInfo pi = it.GetProperty(propName);

                           cellVal = pi.GetValue(t, null);

     

                           ICell newCell = row3.CreateCell(colOrdinal);

        

                           HorizontalAlignment ha = HorizontalAlignment.CENTER;

     

                           if (cellVal==null)

                               newCell.SetCellValue("");

                           else

                               SetCellValue(cellVal + "", dateFormat,font,ha, cellVal.GetType(), newCell);

                           colOrdinal++;

                       }

                 

                   }

     

                   //foreach (DataColumn column in dtSource.Columns)

                   //{

                   //    ICell newCell = row3.CreateCell(column.Ordinal);

                   //   SetCellValue(row2[column].ToString(), dateFormat, column, newCell);

                   //}

                   rownum++;

               }

               using (MemoryStream stream = new MemoryStream())

               {

                   workbook.Write(stream);

                   stream.Flush();

                   stream.Position = 0L;

                   return stream;

               }

           }

     

           public static void Export<T>(IList<T> list, string strFileName,XmlNodeList xnlMapp) where T : class

           {

               using (MemoryStream stream = Export<T>(list, xnlMapp))

               {

                   using (FileStream stream2 = new FileStream(strFileName, FileMode.Create, FileAccess.Write))

                   {

                       byte[] buffer = stream.ToArray();

                       stream2.Write(buffer, 0, buffer.Length);

                       stream2.Flush();

                   }

               }

           }

     

           ~ExcelHelper()

           {

               if (this.fileStream != null)

               {

                   this.fileStream.Close();

                   this.fileStream.Dispose();

               }

           }

     

           private static ICellStyle GetDateFormat(IWorkbook workbook)

           {

               ICellStyle style = workbook.CreateCellStyle();

               style.DataFormat = workbook.CreateDataFormat().GetFormat("yyyy-mm-dd");

               return style;

           }

     

           public void GetExcelObj(Action<object> act)

           {

               act(this._workbook);

                this.Dispose();

           }

     

           public List<string> GetExcelTablesName()

           {

               List<string> list = new List<string>();

               foreach (ISheet sheet in this._workbook)

               {

                   list.Add(sheet.SheetName);

               }

               return list;

           }

     

           private void initHSSFWorkbook(string _excelFielPath)

           {

               if (string.IsNullOrEmpty(_excelFielPath))

               {

                   throw new Exception("Excel文件路径不能为空!");

               }

               if (!File.Exists(_excelFielPath))

               {

                   throw new Exception("指定路径的Excel文件不存在!");

               }

               string str = Path.GetExtension(_excelFielPath).ToLower();

               using (this.fileStream = new FileStream(_excelFielPath, FileMode.Open, FileAccess.Read))

               {

                   this._workbook = WorkbookFactory.Create(this.fileStream);

               }

           }

     

           public bool IsExistExcelTableName(string tName)

           {

               return this.GetExcelTablesName().Contains(tName);

           }

     

           private static void SetCellValue(string drValue, ICellStyle dateStyle,IFont font,HorizontalAlignment ha, Type columnType, ICell newCell)

           {

     

               switch (columnType.ToString())

               {

                   case "System.String":

                       newCell.SetCellValue(drValue);

                       break;

     

                   case "System.DateTime":

                       DateTime time;

                       DateTime.TryParse(drValue, out time);

                       newCell.SetCellValue(time);

                       newCell.CellStyle = dateStyle;

                       break;

     

                   case "System.Boolean":

                       {

                           bool result = false;

                           bool.TryParse(drValue, out result);

                           newCell.SetCellValue(result);

                           break;

                       }

                   case "System.Int16":

                   case "System.Int32":

                   case "System.Int64":

                   case "System.Byte":

                       {

                           int num = 0;

                           int.TryParse(drValue, out num);

                           newCell.SetCellValue((double)num);

                           break;

                       }

                   case "System.Decimal":

                   case "System.Double":

                       {

                           double num2 = 0.0;

                           double.TryParse(drValue, out num2);

                           newCell.SetCellValue(num2);

                           break;

                       }

                   case "System.DBNull":

                       newCell.SetCellValue("");

                       break;

     

                   default:

                       newCell.SetCellValue("");

                       break;

               }

     

     

               newCell.CellStyle.Alignment = ha;//水平对齐

               newCell.CellStyle.SetFont(font);//设置字体

           }

        }

    }

    生成Excel调用方法:

          /// <summary>

           /// 生成指定接口的Excel文件

           /// </summary>

           /// <typeparam name="T"></typeparam>

           /// <param name="lt">数据源</param>

           /// <param name="filePath">生成的文件路径</param>

           /// <param name="fileID">接口ID(属性与列映射用)</param>

           public static void ExportExcel<T>(IList<T> lt, string filePath,string fileID) where T: class

           {

               StringBuilder builder = new StringBuilder();

               string path = filePath;

              

               Type it = lt.First().GetType();

               XmlDocument doc = new XmlDocument();

               string mapFile = System.Web.HttpContext.Current.Server.MapPath("~/Config/OuterPack/FileMap.xml");

               doc.Load(mapFile);

               string xPath = string.Format("//FileMap[@id='{0}']/Mapping", fileID);

               XmlNodeList nlist= doc.SelectNodes(xPath);

     

               EnsureFile(path);

               ExcelHelper.Export<T>(lt, filePath, nlist);

               return;

    }

    <?xml version="1.0" encoding="utf-8" ?>

    <Root>

    <FileMap id="shilexls">

       <Mapping property="RowNo" column="No"/>

       <Mapping property="Policy_No" column="Policy_no"/>

       <Mapping property="Owner_Name" column="Policy Holder"/>

       <Mapping property="Calender_Year" column="Calender Year"/>

       <Mapping property="Issue_Month" column="Issue Month"/>

       <Mapping property="Issue_Day" column="Issue Day"/>

       <Mapping property="Campaign_Name" column="Campaign Name"/>

       <Mapping property="Sponsor_Code" column="Sponsor"/>

       <Mapping property="Package_Code" column="Package Code"/>

       <Mapping property="Branch_Code" column="Camp_branch"/>

       <Mapping property="Campaign_Code" column="Campaign"/>

       <Mapping property="Channel_Code" column="Channel"/>

       <Mapping property="Address1" column="Address1"/>

       <Mapping property="Post_code" column="Post_code"/>

       <Mapping property="Mobile_Phone_No" column="Policy Holder Mobile Phone No"/>

       <Mapping property="SumPrem" column="Total Insurance Amount"/>

       <Mapping property="Payment_Period" column="Payment Period"/>

     

      </FileMap>

    </Root>

     

    读取方法:

           /// <summary>

           /// 读取Excel文件

           /// </summary>

           /// <param name="filePath">文件名(含详细地址)</param>

           /// <param name="extensionName">文件的后缀名</param>

           /// <param name="sheetName">表名</param>

           /// <returns></returns>

           public DataTable ReadExcelFile(string filePath, string extensionName, string sheetName)

           {

               try

               {

                   ExcelHelper excelHelper = new ExcelHelper(filePath);

                   excelHelper.AutoColumnHeder = false;

                   return excelHelper.ExcelToDataTable(0);

               }

               catch (Exception ex)

               {

                   throw ex;

               }

     

           }

  • 相关阅读:
    洛谷P2158 [SDOI2008]仪仗队 欧拉函数的应用
    leetcode 130. 被围绕的区域 DFS
    TediousLee CodeForces
    AccurateLee双指针+贪心+字符串
    leetcode80. 删除排序数组中的重复项 II
    CHFDORA:哆啦 A 梦
    cdq分治浅谈
    leetcode面试题64. 求1+2+…+n
    leetcode84. 柱状图中最大的矩形
    leetcode874. 模拟行走机器人
  • 原文地址:https://www.cnblogs.com/dashi/p/4034659.html
Copyright © 2011-2022 走看看