使用NPOI读取Excel文件

Posted lingxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用NPOI读取Excel文件相关的知识,希望对你有一定的参考价值。

1.添加NPOI组件,利用VS自带的NuGet管理,右键项目选择管理NuGet程序包,搜索NPOI选择合适版本安装即可,安装完成会自动添加引用。

技术分享图片

2.在使用该组建的页面引入命名空间:

using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;

3.项目中新建了一个操作Excel文件的类HandleExcel

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;

namespace AddressList.lib
{
    public class HandleExcel
    {
        #region 读取Excel文件,返回数据集合
        /// <summary>
        /// 读取Excel文件,返回数据集合
        /// </summary>
        /// <param name="fname">要读取的Excel文件地址</param>
        public List<excels> ReadExcel(string fname)
        {
            //首先根据需要读取的文件创建一个文件流对象
            using (FileStream fs = File.OpenRead(fname))
            {
                IWorkbook workbook = null;
                //这里需要根据文件名格式判断一下
                //HSSF只能读取xls的
                //XSSF只能读取xlsx格式的
                if (Path.GetExtension(fs.Name) == ".xls")
                {
                    workbook = new HSSFWorkbook(fs);
                }
                else if (Path.GetExtension(fs.Name) == ".xlsx")
                {
                    workbook = new XSSFWorkbook(fs);
                }

                //用来存储读取出数据的集合
                List<excels> list = new List<excels>();

                //因为Excel表中可能不止一个工作表,这里为了演示,我们遍历所有工作表
                for (int i = 0; i < workbook.NumberOfSheets; i++)
                {
                    //得到当前sheet
                    ISheet sheet = workbook.GetSheetAt(i);
                    //也可以通过GetSheet(name)得到
                    //遍历表中所有的行
                    //注意这里加1,这里得到的最后一个单元格的索引默认是从0开始的

                    for (int j = 0; j < sheet.LastRowNum + 1; j++)
                    {
                        //得到当前的行
                        IRow row = sheet.GetRow(j);

                        if (row.Cells.Count() > 0)
                        {
                            excels ex = new excels();
                            ICell cell = row.GetCell(0, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            cell.SetCellType(CellType.String);
                            ex.gsname = cell.StringCellValue;

                            cell = row.GetCell(1, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            cell.SetCellType(CellType.String);
                            ex.lxname = cell.StringCellValue;

                            cell = row.GetCell(2, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            cell.SetCellType(CellType.String);
                            ex.prof = cell.StringCellValue;

                            cell = row.GetCell(3, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            cell.SetCellType(CellType.String);
                            ex.phone = cell.StringCellValue;

                            cell = row.GetCell(4, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            cell.SetCellType(CellType.String);
                            ex.address = cell.StringCellValue;

                            cell = row.GetCell(5, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            cell.SetCellType(CellType.String);
                            ex.xingzhi = cell.StringCellValue;

                            cell = row.GetCell(6, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            cell.SetCellType(CellType.String);
                            ex.product = cell.StringCellValue;

                            list.Add(ex);
                        }
                        //遍历每行所有的单元格
                        //注意这里不用加1,这里得到的最后一个单元格的索引默认是从1开始的
                        /*for (int k = 0; k < row.LastCellNum; k++)
                        {
                            //得到当前单元格
                            ICell cell = row.GetCell(k, MissingCellPolicy.CREATE_NULL_AS_BLANK);
                            cell.SetCellType(CellType.String);
                            s += cell.StringCellValue;
                        }*/
                    }
                }
                return list;
            }
        }
        #endregion
    }
}

4.使用该类进行读取即可。

注:其中excels是自己建的一个实体类,可以替换成其它的。

 

以上是关于使用NPOI读取Excel文件的主要内容,如果未能解决你的问题,请参考以下文章

根据NPOI 读取一个excel 文件的多个Sheet

NPOI读取Excel文件

在.NET7使用NPOI读取Excel如此简单

NPOI读取excel文件导出数据, 而此时文件正在打开中抛异常怎么办

使用NPOI操作Excel

NPOI 读取Excel文件