zoukankan      html  css  js  c++  java
  • NPOI2.0 ExcelToDataTable工具类分享。支持合并单元格数据处理

    项目需要,重拾NPOI.不会组织语言,直接分享代码。

     public enum CellDataType
        {
            Date,
            Time,
            DateTime,
            String
        }
    
        public class ExcelHelper
        {
    
            /// <summary>    
            /// 由Excel导入DataTable    
            /// </summary>    
            /// <param name="excelStream">Excel文件流</param>   
            /// <param name="sheetName">Excel工作表</param>    
            /// <param name="sheetIndex">Excel工作表</param>    
            /// <param name="headerRowIndex">Excel表头行索引</param>    
            /// <returns>DataTable</returns>    
            private static DataTable ExcelToDataTable(Stream excelStream,string sheetName, int sheetIndex, int headerRowIndex)
            {
                IWorkbook workbook = WorkbookFactory.Create(excelStream);
                ISheet sheet = null;
                if (!string.IsNullOrEmpty(sheetName))
                {
                    sheet = workbook.GetSheet(sheetName);
                }
                else
                {
                    sheet = workbook.GetSheetAt(sheetIndex);
                }
                DataTable table = new DataTable();
                IRow headerRow = sheet.GetRow(headerRowIndex);
                int cellCount = headerRow.LastCellNum;
                for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                {
                    DataColumn column = new DataColumn(headerRow.GetCell(i).ToString());
                    table.Columns.Add(column);
                }
                for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
                {
                    IRow row = sheet.GetRow(i);
                    DataRow dataRow = table.NewRow();
                    for (int j = row.FirstCellNum; j < cellCount; j++)
                    {
                        ICell cell = row.GetCell(j);
                        dataRow[j] = GetText(cell);
                    }
                    table.Rows.Add(dataRow);
                }
    
                #region 处理合并单元格
    
                int ij = sheet.NumMergedRegions;
    
                for (int i = 0; i < ij; i++)
                {
                    CellRangeAddress r = sheet.GetMergedRegion(i);
                    if (r.FirstRow <= headerRowIndex)
                        continue;
                    object o = table.Rows[r.FirstRow - (headerRowIndex + 1)][r.FirstColumn];
                    for (int jr = r.FirstRow; jr <= r.LastRow; jr++)
                    {
                        if ((jr - (headerRowIndex + 1)) < table.Rows.Count)//处理合并列大于数据总列时这种不规范的EXCEL文本,
                        {
                            for (int jc = r.FirstColumn; jc <= r.LastColumn; jc++)
                            {
                                table.Rows[jr - (headerRowIndex + 1)][jc] = o;
                            }
                        }
                    }
    
                }
    
                #endregion
                excelStream.Close();
                workbook = null;
                sheet = null;
                return table;
            }
    
            /// <summary>    
            /// 由Excel导入DataTable   
            /// </summary>   
            ///  <param name="excelFilePath">Excel文件路径,为物理路径。</param>   
            /// <param name="sheetName">Excel工作表名称</param>    
            /// <param name="headerRowIndex">Excel表头行索引</param>    
            /// <returns>DataTable</returns>    
            public static DataTable ExcelToDataTable(string excelFilePath, string sheetName, int headerRowIndex)
            {
                using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
                {
                    return ExcelToDataTable(stream, sheetName,-1, headerRowIndex);
                }
            }
    
            /// <summary>    
            /// 由Excel导入DataTable    
            /// </summary>    
            /// <param name="excelFilePath">Excel文件路径,为物理路径。</param>    
            /// <param name="sheetName">Excel工作表索引</param>    
            /// <param name="headerRowIndex">Excel表头行索引</param>    
            /// <returns>DataTable</returns>    
            public static DataTable ExcelToDataTable(string excelFilePath, int sheetIndex, int headerRowIndex)
            {
                using (FileStream stream = System.IO.File.OpenRead(excelFilePath))
                {
                    return ExcelToDataTable(stream,null, sheetIndex, headerRowIndex);
                }
            }
    
    
            private static CellDataType GetCellDataType(ICell cell)
            {
                string dataFormatString = cell.CellStyle.GetDataFormatString();
    
                if (dataFormatString.ToLower().IndexOf("y") != -1 && dataFormatString.ToLower().IndexOf("h") != -1)
                {
                    return CellDataType.DateTime;
                }
                else if (dataFormatString.ToLower().IndexOf("y") != -1 && dataFormatString.ToLower().IndexOf("h") == -1)
                {
                    return CellDataType.Date;
                }
                else if (dataFormatString.ToLower().IndexOf("y") == -1 && dataFormatString.ToLower().IndexOf("h") != -1)
                {
                    return CellDataType.Time;
                }
                else
                {
                    return CellDataType.String;
                }
            }
    
            private static string GetText(ICell cell)
            {
                if (cell == null)
                {
                    return "";
                }
    
                string value = null;
                switch (cell.CellType)
                {
                    case CellType.ERROR:
                        value = ErrorEval.GetText(cell.ErrorCellValue);
                        break;
                    case CellType.FORMULA:
                        value = GetFormulaText(cell);
                        break;
                    case CellType.NUMERIC:
                        CellDataType cdt = GetCellDataType(cell);
                        if (cdt == CellDataType.DateTime)
                        {
                            value = cell.DateCellValue.ToString("yyyy-MM-dd HH:mm:ss");
                        }
                        else if (cdt == CellDataType.Date)
                        {
                            value = cell.DateCellValue.ToString("yyyy-MM-dd");
                        }
                        else if (cdt == CellDataType.Time)
                        {
                            value = cell.DateCellValue.ToString("HH:mm:ss");
                        }
                        else
                        {
                            value = cell.NumericCellValue.ToString();
                        }
                        break;
                    case CellType.STRING:
                        value = cell.StringCellValue;
                        break;
                    default:
                        value = cell.ToString();
                        break;
                }
                return value;
            }
    
            private static string GetFormulaText(ICell cell)
            {
                string value = null;
                switch (cell.CachedFormulaResultType)
                {
                    case CellType.ERROR:
                        value = ErrorEval.GetText(cell.ErrorCellValue);
                        break;
                    case CellType.NUMERIC:
                        value = cell.NumericCellValue.ToString();
                        break;
                    case CellType.STRING:
                        value = cell.StringCellValue;
                        break;
                    default:
                        value = cell.ToString();
                        break;
                }
                return value;
            }
    
  • 相关阅读:
    [C/C++] 指针数组和数组指针
    [计算机网络] DNS劫持和DNS污染
    [计算机网络-数据链路层] CSMA、CSMA/CA、CSMA/CD详解
    [BinaryTree] 二叉树常考知识点
    NODE-windows 下安装nodejs及其配置环境
    MATLAB/Excel-如何将Excel数据导入MATLAB中
    Excel-怎样实现行列转置
    一篇文章学懂Shell脚本
    SQL-MySQL使用教程-对MySQL的初步尝试
    资源贴-在线编译环境推荐
  • 原文地址:https://www.cnblogs.com/youan/p/2823479.html
Copyright © 2011-2022 走看看