NPOI对Excel的操作(Sheet转DataTable、List<T>)

 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 }
时间: 2024-10-10 20:00:08

NPOI对Excel的操作(Sheet转DataTable、List<T>)的相关文章

c#用NPOI将excel文件内容读取到datatable数据表中

将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable 1 /// <summary> 2 /// 将excel文件内容读取到DataTable数据表中 3 /// </summary> 4 /// <param name="fileName">文件完整路径名</param> 5 /// <param name=

excel导出 按dataset里的datatable导出一个excel多个sheet 和 datatable导出

//datatable导出 public static void DataTableToExcel(string filename, string sheetName, DataTable table) { //增加序号列 //rui.dbHelper.insert序号(table, 0); IWorkbook workbook = new HSSFWorkbook(); ISheet sheet = workbook.CreateSheet(sheetName); //设置单元格的样式:水平垂

使用NPOI读取Excel到DataTable

一.NPOI介绍: 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作 二.安装NPOI 新建控制台应用程序>管理NuGet程序包>搜索NPOI>安装NPOI 三.下面是我需要的读取的Excel文件,数据格式如下: 四.添加ExcelHelper类: using System; using NPOI.SS.User

【个人使用.Net类库】(3)Excel文件操作类(基于NPOI)

Web开发工作中经常要根据业务的需要生成对应的报表.经常采用的方法如下: 将DataTable导出至Excel文件; 读取模板Excel文件; 修改模板Excel文件对应的内容. 因此,便想到封装一个基于NPOI的Excel操作类(至于为什么不用Excel组件,那是因为Excel组件效率低且必须安装Office),所完成的功能大致如上所示,这样平时的报表开发效率就比原来高效很多. 首先是DataTable导出至Excel文件,代码关键部分有注释说明,具体代码如下所示: /// <summary>

NPOI导入excel为datatable (xls xlsx xlsm)

使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中 http://www.cnblogs.com/songrun/p/3547738.html NPOI 2.0教程 – 自动识别Excel 2003或2007格式 http://tonyqus.sinaapp.com/archives/482 NPOI 2.0 教程 http://tonyqus.sinaapp.com/npoi2tutorial using System; using System.Collection

使用NPOI读取Excel数据到DataTable

现在XML文件的存储格式大行其道,但是也不是适用于所有情况,很多单位的数据交换还是使用Excel的形式.这就使得我们需要读取Excel内的数据,加载到程序中进行处理.但是怎样有效率的读取,怎样使程序保持健壮,这需要很大的努力. 我们如果要写一个动态链接库会很花费时间和精力,这就使得开源项目是个很有效率的选择. 在各类关于Excel的开源项目中NPOI是中国的程序员发起的,他的一大好处是直接处理Ole文件,用户不必安装Office.现在发展到2.0还可以自动判断Excel文件版本,我们自己判断文件

winfrom 使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中

1.通过NUGET管理器下载nopi,在引入命令空间 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.IO; 5 using NPOI.SS.UserModel; //NPOI 6 using NPOI.HSSF.Util; //NPOI 7 using NPOI.HSSF.UserModel; //NPOI 8 using NPOI.XSSF.UserModel; /

NPOI操作excel——利用反射机制,NPOI读取excel数据准确映射到数据库字段

> 其实需求很明确,就是一大堆不一样的excel,每张excel对应数据库的一张表,我们需要提供用户上传excel,我们解析数据入库的功能实现. 那么,这就涉及到一个问题:我们可以读出excel的表头,但是怎么知道每个表头具体对应数据库里面的字段呢? 博主经过一段时间的思考与构思,想到一法:现在的情况是我们有excel表A,对应数据库表B,但是A与B具体属性字段的映射关系我们不知.那我们是不是可以有一个A到B的映射文件C呢? 我想,说到这,大家就很明了了... 第一步:为每张excel创建一个与

EPPLUS之外的选择,EXCEL的操作(NPOI,POI(java))

NPOI 编辑 NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 中文名 NPOI 优    势 传统操作Excel遇到的问题 构    成 读写OLE2文档 基    于 LittleEndian的字节读写 历史版本 NPOI 2.1.1      2014/01/07 目录 1 简介 2 优势 3 构成 4 项目近况: 5 历史版本: 6 开发团队 7 系统要求 8 许可 简介 编辑 使用 NPOI 你就可以在没有