支持读到 DataTable 和 DataSet,代码如下:
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace NPOIdoExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("请输入Excel文件完整路径:");
            string inputFileFullPath = Console.ReadLine();
            Console.WriteLine("您输入的地址是:" + inputFileFullPath);
            DataTable dt = ReadDataTableFromExcel(inputFileFullPath, 0);
            //输出表数据
            for (int i = 0, ic = dt.Rows.Count; i < ic; i++)
            {
                Console.Write("第 " + (i + 1) + " 行:");
                DataRow dr = dt.Rows[i];
                for (int j = 0, jc = dt.Columns.Count; j < jc; j++)
                {
                    Console.Write(dr[j] + " ");
                }
                Console.WriteLine();
            }
            Console.Read();
        }


        //读取 Excel 第一个工作表到 DataTable
        static DataTable ReadDataTableFromExcel(string fileFullPath)
        {
            return ReadDataTableFromExcel(fileFullPath, 0);
        }


        //读取 Excel 第 index 个工作表到 DataTable
        private static DataTable ReadDataTableFromExcel(string fileFullPath, int index)
        {
            DataSet ds = ReadDataSetFromExcel(fileFullPath);
            if (ds != null)
                return ds.Tables[index];
            return null;
        }


        //读取 Excel 到 DataSet
        static DataSet ReadDataSetFromExcel(string fileFullPath)
        {
            if (!File.Exists(fileFullPath))
                return null;
            FileStream fileStream = new FileStream(fileFullPath, FileMode.Open, FileAccess.Read);
            string fileExtension = Path.GetExtension(fileFullPath).ToLower();
            switch (fileExtension)
            {
                case ".xls":
                    return ReadDataSetFromExcelXls(fileStream);
                case ".xlsx":
                    return ReadDataSetFromExcelXlsx(fileStream);
                default:
                    return null;
            }
        }


        //读取 xls
        private static DataSet ReadDataSetFromExcelXls(FileStream fileStream)
        {
            DataSet ds = new DataSet("DataSet");
            HSSFWorkbook book = new HSSFWorkbook(fileStream);//工作薄


            for (int i = 0, ic = book.NumberOfSheets; i < ic; i++)
            {
                ISheet sheet = book.GetSheetAt(i);//第i个工作表
                ds.Tables.Add(ReadDataTableFromSheet(sheet, i));
            }


            return ds;
        }


        //读取 xlsx
        private static DataSet ReadDataSetFromExcelXlsx(FileStream fileStream)
        {
            DataSet ds = new DataSet("DataSet");
            XSSFWorkbook book = new XSSFWorkbook(fileStream);//工作薄


            for (int i = 0, ic = book.NumberOfSheets; i < ic; i++)
            {
                ISheet sheet = book.GetSheetAt(i);//第i个工作表
                ds.Tables.Add(ReadDataTableFromSheet(sheet, i));
            }


            return ds;
        }


        //读取工作表到DataTable
        private static DataTable ReadDataTableFromSheet(ISheet sheet, int index)
        {
            IEnumerator rows = sheet.GetRowEnumerator();//行集合


            DataTable dt = new DataTable("Table" + (index + 1));
            //表头
            int colNameIndex = 0;//列标题所在行索引
            IRow header = FindHeader(sheet, out colNameIndex);
            if (header == null) return dt;//工作表没有数据
            for (int i = 0, ic = header.LastCellNum; i < ic; i++)
            {
                ICell cell = header.GetCell(i);
                object cellValue = GetValueType(cell);
                if (cellValue == null || cellValue.ToString() == string.Empty)
                    dt.Columns.Add("Column" + i);
                else
                {
                    string strCellValue = cellValue.ToString().Replace("\n", "");
                    if (!dt.Columns.Contains(strCellValue))
                        dt.Columns.Add(strCellValue);
                    else
                        dt.Columns.Add(strCellValue + i);
                }
            }
            //行数据
            for (int i = colNameIndex; i <= sheet.LastRowNum; i++)
            //while (rows.MoveNext())
            {
                IRow row = sheet.GetRow(i);//HSSFRow or XSSFRow
                //IRow row = (IRow)rows.Current;//HSSFRow or XSSFRow
                DataRow dr = dt.NewRow();


                //列数据
                for (int j = 0, jc = row.LastCellNum; j < jc; j++)
                {
                    ICell cell = row.GetCell(j);
                    if (i != colNameIndex)
                        dr[j] = GetValueType(cell);
                    else
                        dr[j] = GetValueType(cell).ToString().Replace("\n", "");
                }


                dt.Rows.Add(dr);
            }


            return dt;
        }


        //读取单元格值
        private static object GetValueType(ICell cell)
        {
            if (cell == null)
                return null;
            switch (cell.CellType)
            {
                case CellType.Blank:
                    return null;
                case CellType.Boolean:
                    return cell.BooleanCellValue;
                case CellType.Error:
                    return cell.ErrorCellValue;
                case CellType.Formula:
                    goto default;
                case CellType.Numeric:
                    return cell.NumericCellValue;
                case CellType.String:
                    return cell.StringCellValue;
                case CellType.Unknown:
                    goto default;
                default:
                    return "=" + cell.CellFormula;
            }
        }


        //查找列标题
        private static IRow FindHeader(ISheet sheet, out int colNameIndex)
        {
            colNameIndex = 0;


            IRow header = null;
            int maxCellCnt = 0;


            for (int i = sheet.FirstRowNum; i <= sheet.FirstRowNum; i++) //sheet.LastRowNum 如果第一行不是标题时
            {
                IRow row = sheet.GetRow(i);
                if (row != null)
                {
                    if (row.LastCellNum > maxCellCnt)
                    {
                        colNameIndex = i;
                        maxCellCnt = row.LastCellNum;
                        header = row;
                    }
                }
            }
            return header;
        }
    }
}
  • 1 楼 路飞 发表于 23:06:04 2016-11-16

    差一个写Excel的