• c#NPOI读取excel 比interop和Microsoft.Jet.OLEDB.4.0 之类 的好的多


    今天下午开始整理excel这块, 微软弄的那些库简直是个坑, 什么com注册之类的净是些报错.

    在网上搜资料偶然碰见npoi ,好东西,值得使用

    NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。
    NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。
    https://github.com/tonyqus/npoi
     
    我是在项目里边nuget 里直接搜npoi  安装直接就能用了
    网上一个比较好的程序
    using System;
    using System.Data;
    using System.IO;
    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    using NPOI.HSSF.UserModel;
    
    namespace MakeData
    {
        public class ReadExcelHelper
        {
            /// <summary>
            /// 将excel导入到datatable
            /// </summary>
            /// <param name="filePath">excel路径</param>
            /// <param name="isColumnName">第一行是否是列名</param>
            /// <returns>返回datatable</returns>
            public static DataTable ExcelToDataTable(string filePath, bool isColumnName)
            {
                DataTable dataTable = null;
                FileStream fs = null;
                DataColumn column = null;
                DataRow dataRow = null;
                IWorkbook workbook = null;
                ISheet sheet = null;
                IRow row = null;
                ICell cell = null;
                int startRow = 0;
                try
                {
                    using (fs = File.OpenRead(filePath))
                    {
                        // 2007版本
                        if (filePath.IndexOf(".xlsx") > 0)
                            workbook = new XSSFWorkbook(fs);
                        // 2003版本
                        else if (filePath.IndexOf(".xls") > 0)
                            workbook = new HSSFWorkbook(fs);
    
                        if (workbook != null)
                        {
                            sheet = workbook.GetSheetAt(0);//读取第一个sheet,当然也可以循环读取每个sheet
                            dataTable = new DataTable();
                            if (sheet != null)
                            {
                                int rowCount = sheet.LastRowNum;//总行数
                                if (rowCount > 0)
                                {
                                    IRow firstRow = sheet.GetRow(0);//第一行
                                    int cellCount = firstRow.LastCellNum;//列数
    
                                    //构建datatable的列
                                    if (isColumnName)
                                    {
                                        startRow = 1;//如果第一行是列名,则从第二行开始读取
                                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                                        {
                                            cell = firstRow.GetCell(i);
                                            if (cell != null)
                                            {
                                                if (cell.StringCellValue != null)
                                                {
                                                    column = new DataColumn(cell.StringCellValue);
                                                    dataTable.Columns.Add(column);
                                                }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
                                        {
                                            column = new DataColumn("column" + (i + 1));
                                            dataTable.Columns.Add(column);
                                        }
                                    }
    
                                    //填充行
                                    for (int i = startRow; i <= rowCount; ++i)
                                    {
                                        row = sheet.GetRow(i);
                                        if (row == null) continue;
    
                                        dataRow = dataTable.NewRow();
                                        for (int j = row.FirstCellNum; j < cellCount; ++j)
                                        {
                                            cell = row.GetCell(j);
                                            if (cell == null)
                                            {
                                                dataRow[j] = "";
                                            }
                                            else
                                            {
                                                //CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)
                                                switch (cell.CellType)
                                                {
                                                    case CellType.Blank:
                                                        dataRow[j] = "";
                                                        break;
                                                    case CellType.Numeric:
                                                        short format = cell.CellStyle.DataFormat;
                                                        //对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理
                                                        if (format == 14 || format == 31 || format == 57 || format == 58)
                                                            dataRow[j] = cell.DateCellValue;
                                                        else
                                                            dataRow[j] = cell.NumericCellValue;
                                                        break;
                                                    case CellType.String:
                                                        dataRow[j] = cell.StringCellValue;
                                                        break;
                                                }
                                            }
                                        }
                                        dataTable.Rows.Add(dataRow);
                                    }
                                }
                            }
                        }
                    }
                    return dataTable;
                }
                catch (Exception ex)
                {
                    string mess = ex.Message;
                    if (fs != null)
                    {
                        fs.Close();
                    }
                    return null;
                }
            }
        }
    }

  • 相关阅读:
    三分法
    牛客网 TaoTao要吃鸡 ( 0/1背包变形 )
    POJ 3275 Ranking the cows ( Floyd求解传递闭包 && Bitset优化 )
    Codeforces 912E Prime Gift ( 二分 && 折半枚举 && 双指针技巧)
    Codeforces 912D Fishs ( 贪心 && 概率期望 && 优先队列 )
    Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )
    队列构造拓扑排序
    Codeforces 919E Congruence Equation ( 数论 && 费马小定理 )
    Codeforces 916B Jamie and Binary Sequence ( 模拟 && 思维 )
    POJ 1769 Minimizing maximizer ( 线段树 && DP )
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/9058568.html
Copyright © 2020-2023  润新知