zoukankan      html  css  js  c++  java
  • NPOI对Excel的操作(Sheet转DataTable、List<T>)

    通过NPOI对Excel进行操作,这里主要是读取的操作。封装到ExcelHelper操作类中。

    复制代码
      1 using System.Collections.Generic;
      2 using NPOI.HSSF.UserModel;
      3 using NPOI.SS.UserModel;
      4 using NPOI.XSSF.UserModel;
      5 using System.IO;
      6 using System.Data;
      7 using System;
      8 
      9 namespace CommonHelper
     10 {
     11    public class ExcelHelper 
     12     {
     13 
     14        public ExcelHelper() { }
     15 
     16        /// <summary>
     17        /// 文件流初始化对象
     18        /// </summary>
     19        /// <param name="stream"></param>
     20        public ExcelHelper(Stream stream) 
     21        {
     22            _IWorkbook = CreateWorkbook(stream);
     23        }
     24 
     25        /// <summary>
     26        /// 传入文件名
     27        /// </summary>
     28        /// <param name="fileName"></param>
     29        public ExcelHelper(string fileName) 
     30        {
     31            using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
     32            {
     33                _IWorkbook = CreateWorkbook(fileStream);
     34            }
     35        }
     36 
     37        /// <summary>
     38        /// 工作薄
     39        /// </summary>
     40        private IWorkbook _IWorkbook;
     41 
     42        /// <summary>
     43        /// 创建工作簿对象
     44        /// </summary>
     45        /// <param name="stream"></param>
     46        /// <returns></returns>
     47        private IWorkbook CreateWorkbook(Stream stream) 
     48        {
     49            try 
     50            {
     51               return new XSSFWorkbook(stream); //07
     52            }
     53            catch
     54            {
     55               return new HSSFWorkbook(stream); //03
     56            }
     57           
     58        }
     59 
     60        /// <summary>
     61        /// 把Sheet中的数据转换为DataTable
     62        /// </summary>
     63        /// <param name="sheet"></param>
     64        /// <returns></returns>
     65        private DataTable ExportToDataTable(ISheet sheet) 
     66        {
     67            DataTable dt = new DataTable();
     68 
     69            //默认,第一行是字段
     70            IRow headRow = sheet.GetRow(0);
     71 
     72            //设置datatable字段
     73            for (int i = headRow.FirstCellNum, len = headRow.LastCellNum; i < len; i++)
     74            {
     75                dt.Columns.Add(headRow.Cells[i].StringCellValue);
     76            }
     77            //遍历数据行
     78            for (int i = (sheet.FirstRowNum + 1), len = sheet.LastRowNum + 1; i < len; i++)
     79            {
     80                IRow tempRow = sheet.GetRow(i);
     81                DataRow dataRow = dt.NewRow();
     82 
     83                //遍历一行的每一个单元格
     84                for (int r = 0, j = tempRow.FirstCellNum, len2 = tempRow.LastCellNum; j < len2; j++, r++)
     85                {
     86 
     87                    ICell cell = tempRow.GetCell(j);
     88 
     89                    if (cell != null)
     90                    {
     91                        switch (cell.CellType)
     92                        {
     93                            case CellType.STRING:
     94                                dataRow[r] = cell.StringCellValue;
     95                                break;
     96                            case CellType.NUMERIC:
     97                                dataRow[r] = cell.NumericCellValue;
     98                                break;
     99                            case CellType.BOOLEAN:
    100                                dataRow[r] = cell.BooleanCellValue;
    101                                break;
    102                            default: dataRow[r] = "ERROR";
    103                                break;
    104                        }
    105                    }
    106                }
    107                dt.Rows.Add(dataRow);
    108            }
    109            return dt;
    110        }
    111 
    112        /// <summary>
    113        /// Sheet中的数据转换为List集合
    114        /// </summary>
    115        /// <param name="sheet"></param>
    116        /// <param name="fields"></param>
    117        /// <returns></returns>
    118        private IList<T> ExportToList<T>(ISheet sheet,string[] fields) where T:class,new()
    119        {
    120             IList<T> list = new List<T>();
    121 
    122            //遍历每一行数据
    123            for (int i = sheet.FirstRowNum + 1, len = sheet.LastRowNum + 1; i < len; i++) 
    124            {
    125                T t=new T();
    126                IRow row = sheet.GetRow(i);
    127 
    128                for (int j = 0, len2 = fields.Length; j < len2; j++)
    129                {
    130                    ICell cell=row.GetCell(j);
    131                    object cellValue= null;
    132 
    133                    switch (cell.CellType) 
    134                    {
    135                        case CellType.STRING: //文本
    136                            cellValue = cell.StringCellValue;
    137                            break;
    138                        case CellType.NUMERIC: //数值
    139                            cellValue =Convert.ToInt32(cell.NumericCellValue);//Double转换为int
    140                            break;
    141                        case CellType.BOOLEAN: //bool
    142                            cellValue = cell.BooleanCellValue;
    143                            break;
    144                        case CellType.BLANK: //空白
    145                            cellValue = "";
    146                            break;
    147                        default: cellValue = "ERROR";
    148                            break;
    149                    }
    150 
    151                    typeof(T).GetProperty(fields[j]).SetValue(t,cellValue,null);
    152                }
    153                list.Add(t);
    154            }
    155 
    156                return list;
    157        }
    158 
    159        /// <summary>
    160        /// 获取第一个Sheet的第X行,第Y列的值。起始点为1
    161        /// </summary>
    162        /// <param name="X">行</param>
    163        /// <param name="Y">列</param>
    164        /// <returns></returns>
    165        public string GetCellValue(int X, int Y) 
    166        {
    167            ISheet sheet = _IWorkbook.GetSheetAt(0);
    168 
    169            IRow row = sheet.GetRow(X-1);
    170 
    171            return row.GetCell(Y-1).ToString();
    172        }
    173 
    174        /// <summary>
    175        /// 获取一行的所有数据
    176        /// </summary>
    177        /// <param name="X">第x行</param>
    178        /// <returns></returns>
    179        public string[] GetCells(int X) 
    180        {
    181            List<string> list = new List<string>();
    182 
    183            ISheet sheet = _IWorkbook.GetSheetAt(0);
    184 
    185            IRow row = sheet.GetRow(X-1);
    186 
    187            for (int i = 0, len = row.LastCellNum; i < len; i++) 
    188            {
    189                list.Add(row.GetCell(i).StringCellValue);//这里没有考虑数据格式转换,会出现bug
    190            }
    191            return list.ToArray();
    192        }
    193 
    194        /// <summary>
    195        /// 第一个Sheet数据,转换为DataTable
    196        /// </summary>
    197        /// <returns></returns>
    198        public DataTable ExportExcelToDataTable() 
    199        {
    200            return ExportToDataTable(_IWorkbook.GetSheetAt(0));
    201        }
    202 
    203        /// <summary>
    204        /// 第sheetIndex表数据,转换为DataTable
    205        /// </summary>
    206        /// <param name="sheetIndex">第几个Sheet,从1开始</param>
    207        /// <returns></returns>
    208        public DataTable ExportExcelToDataTable(int sheetIndex) 
    209        {
    210            return ExportToDataTable(_IWorkbook.GetSheetAt(sheetIndex-1));
    211        }
    212 
    213 
    214        /// <summary>
    215        /// Excel中默认第一张Sheet导出到集合
    216        /// </summary>
    217        /// <param name="fields">Excel各个列,依次要转换成为的对象字段名称</param>
    218        /// <returns></returns>
    219        public IList<T> ExcelToList<T>(string[] fields) where T:class,new ()
    220        {
    221            return ExportToList<T>(_IWorkbook.GetSheetAt(0),fields);
    222        }
    223 
    224        /// <summary>
    225        /// Excel中指定的Sheet导出到集合
    226        /// </summary>
    227        /// <param name="sheetIndex">第几张Sheet,从1开始</param>
    228        /// <param name="fields">Excel各个列,依次要转换成为的对象字段名称</param>
    229        /// <returns></returns>
    230        public IList<T> ExcelToList<T>(int sheetIndex,string[] fields) where T:class,new()
    231        {
    232           return ExportToList<T>(_IWorkbook.GetSheetAt(sheetIndex-1), fields);
    233        }
    234 
    235     }
    236 }
    复制代码
     
     
  • 相关阅读:
    Linux VPS新硬盘分区与挂载教程
    全程图解 手把手教您开启windows终端服务
    解决IE apk变成zip:Android 手机应用程序文件下载服务器Nginx+Tomcat配置解决方法
    Nginx 配置文件详解
    MySQL新建用户,授权,删除用户,修改密码
    解决IE apk变成zip:Android 手机应用程序文件下载服务器 配置解决方法
    CentOS 6.4 32位系统 LAMP(Apache+MySQL+PHP)安装步骤
    yum被锁Another app is currently holding the yum lock; waiting for it to exit...
    CentOS 6.4下编译安装MySQL 5.6.14
    Oracle函数大全
  • 原文地址:https://www.cnblogs.com/webenh/p/6127911.html
Copyright © 2011-2022 走看看