zoukankan      html  css  js  c++  java
  • C#:导入Excel通用类(Xls格式)

    PS:在CSV格式和XLSX格式中有写到通用调用的接口和引用的插件,所以在这个xls格式里面并没有那么详细,只是配上xls通用类。

    • 一、引用插件NPOI.dll、NPOI.OOXML.dll、NPOI.OpenXml4Net.dll、NPOI.OpenXmlFormats.dll

           插件下载地址:https://pan.baidu.com/s/1ZTU90HUMu4AgMyIgmL-MaA  提取密码:jtjl

    • 二、定义通用类XlsExcelData.cs
     public class XlsExcelData : IExcelData
        {
            #region 属性值
            private Dictionary<string, DataTable> m_tableDic;
            public Dictionary<string, DataTable> DataTableDictionary
            {
                get { return m_tableDic; }
            }
            public List<string> SheetNames
            {
                get
                {
                    if (m_tableDic == null)
                        return null;
                    return m_tableDic.Keys.ToList();
                }
            }
            public List<DataTable> DataTableList
            {
                get
                {
                    if (m_tableDic == null)
                        return null;
                    return m_tableDic.Values.ToList();
                }
            }
            public int SheetCount
            {
                get
                {
                    if (m_tableDic == null)
                        return 0;
                    return m_tableDic.Count;
                }
            }
            private string m_filePath;
            public string FilePath
            {
                get { return m_filePath; }
            }
            private Stream m_stream;
            public Stream ExcelStream
            {
                get { return m_stream; }
            }
            public ExcelType ExcelType
            {
                get { return Interface.ExcelType.xls; }
            }
            #endregion
            #region 构造
            public XlsExcelData(string path)
            {
                m_filePath = path;
            }
            public XlsExcelData(Stream stream)
            {
                m_stream = stream;
            }
            #endregion
            #region 方法
            public List<Dictionary<string, string>> DataTableToDictionary(DataTable dt)
            {
                List<Dictionary<String, String>> dicList = new List<Dictionary<string, string>>();
                foreach (DataRow row in dt.Rows)
                {
                    Dictionary<String, String> dic = new Dictionary<String, String>();
                    foreach (DataColumn col in dt.Columns)
                    {
                        dic.Add(col.ColumnName, row[col].ToString());
                    }
                    dicList.Add(dic);
                }
                return dicList;
            }
    
            /// <summary>
            /// 执行方法
            /// </summary>
            public void Load()
            {
                if (m_filePath != null)
                    Load(m_filePath);
                else
                    Load(m_stream);
            }
            /// <summary>
            /// 执行方法
            /// </summary>
            /// <param name="path">文件路径</param>
            private void Load(string path)
            {
                m_filePath = path;
                HSSFWorkbook workbook = null;
                try
                {
                    using (FileStream fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.Read))
                    {
                        workbook = new HSSFWorkbook(fs);
                    }
                }
                catch
                {
                    throw;
                }
                LoadExcel(workbook);
                workbook.Dispose();
            }
    
            /// <summary>
            /// 执行方法
            /// </summary>
            /// <param name="stream">文件流</param>
            private void Load(Stream stream)
            {
                m_stream = stream;
                HSSFWorkbook workbook = null;
                try
                {
                    workbook = new HSSFWorkbook(stream);
                }
                catch
                {
                    throw;
                }
                LoadExcel(workbook);
                workbook.Dispose();
            }
    
            /// <summary>
            /// 获取Excel对应字典
            /// </summary>
            /// <param name="workbook"></param>
            private void LoadExcel(HSSFWorkbook workbook)
            {
                m_tableDic = new Dictionary<string, DataTable>();
                var sheets = workbook.GetEnumerator();
                while (sheets.MoveNext())
                {
                    DataTable dt = new DataTable();
                    int colCount = 0;
                    ISheet sheet = (ISheet)sheets.Current;
                    var rows = sheet.GetEnumerator();
                    while (rows.MoveNext())
                    {
                        IRow row = (IRow)rows.Current;
                        colCount = row.LastCellNum > colCount ? row.LastCellNum : colCount;
                    }
                    for (int i = 1; i <= colCount; i++)
                    {
                        string header = ExcelHeaderGenerator.GetExcelHeader(i);
                        DataColumn col = new DataColumn(header);
                        dt.Columns.Add(col);
                    }
                    var datarows = sheet.GetEnumerator();
                    while (datarows.MoveNext())
                    {
                        IRow row = (IRow)datarows.Current;
                        DataRow dRow = dt.NewRow();
                        for (int j = 0; j < row.LastCellNum; j++)
                        {
                            ICell cell = row.Cells[j];
                            if (cell.CellType == CellType.String)
                                dRow[j] = row.Cells[j].StringCellValue;
                            else if (cell.CellType == CellType.Numeric)
                                dRow[j] = row.Cells[j].NumericCellValue;
                            else
                                dRow[j] = "[Cell Type Unsuported]";
                        }
                        dt.Rows.Add(dRow);
                    }
                    m_tableDic.Add(sheet.SheetName, dt);
                }
            }
    
            /// <summary>
            /// 获取第一列
            /// </summary>
            /// <returns></returns>
            public List<Dictionary<string, string>> GetFirstRecords()
            {
                List<Dictionary<string, string>> result = new List<Dictionary<string, string>>();
                DataTable dt = GetDataTable(0, 1);
                foreach (DataRow row in dt.Rows)
                {
                    Dictionary<string, string> dic = new Dictionary<string, string>();
                    foreach (DataColumn column in dt.Columns)
                    {
                        dic.Add(column.ColumnName, row[column].ToString());
                    }
                    result.Add(dic);
                }
                return result;
            }
    
            /// <summary>
            /// 获取DataTable
            /// </summary>
            /// <param name="sheetIndex">工作薄索引</param>
            /// <returns></returns>
            public DataTable GetDataTable(int sheetIndex)
            {
                if (m_tableDic == null)
                    return null;
                if (sheetIndex >= SheetCount)
                    throw new Exception("表格索引超出序列,当前索引数量为" + SheetCount);
                DataTable dt = DataTableList[sheetIndex];
                DataTable dt_copy = new DataTable();
                foreach (DataColumn col in dt.Columns)
                {
                    dt_copy.Columns.Add(new DataColumn(col.ColumnName));
                }
                foreach (DataRow row in dt.Rows)
                {
                    DataRow r = dt_copy.NewRow();
                    r.ItemArray = row.ItemArray;
                    dt_copy.Rows.Add(r);
                }
                return dt_copy;
            }
    
            /// <summary>
            /// 获取DataTable
            /// </summary>
            /// <param name="sheetIndex">工作薄索引</param>
            /// <param name="columnNum">列数</param>
            /// <returns></returns>
            public DataTable GetDataTable(int sheetIndex, int columnNum)
            {
                DataTable dt = GetDataTable(sheetIndex);
                Convert(columnNum, ref dt);
                return dt;
    
            }
    
            /// <summary>
            /// 检测重复列
            /// </summary>
            /// <param name="colNum">列数</param>
            /// <param name="dt">DataTable</param>
            private void Convert(int colNum, ref DataTable dt)
            {
                if (colNum < 1)
                    throw new Exception("指定作为标题的行数必须是大于0");
                if (colNum > dt.Rows.Count)
                    throw new Exception("指定作为标题的行数不能大于表格的总行数" + dt.Rows.Count);
                List<string> columnArray = new List<string>();
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    if (columnArray.Contains(dt.Rows[colNum - 1].ItemArray[i].ToString()))
                        throw new Exception("指定为DataTable标题的行不能存在重复值,重复值为" + dt.Rows[colNum - 1].ItemArray[i].ToString());
                    columnArray.Add(dt.Rows[colNum - 1].ItemArray[i].ToString());
                }
                int r = 0;
                for (int i = 0; i < colNum; i++)
                {
                    dt.Rows.Remove(dt.Rows[i - r]);
                    r++;
                }
                for (int i = 0; i < columnArray.Count; i++)
                {
                    dt.Columns[i].ColumnName = columnArray[i];
                }
            }
            #endregion
        }

    原著:清风一人醉 http://www.cnblogs.com/W--Jing/

    以上方法可以个人分享研究!

    不可做商业项目,违者必究!

  • 相关阅读:
    互联网某些方面代替了朋友的作用
    穷人
    血脉之力
    鹤立鸡群
    如果有了一个进化的机会,你会选择放弃人类这个身份么?
    怎么样的制度才算是好制度
    /etc/fstab 参数详解及如何设置开机自动挂载
    Linux 查看系统硬件信息(实例详解)
    Linux下添加新硬盘,分区及挂载
    Quartz.NET
  • 原文地址:https://www.cnblogs.com/W--Jing/p/8436140.html
Copyright © 2011-2022 走看看