C#:导入Excel通用类(Xlsx格式)

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

       插件下载地址:https://pan.baidu.com/s/1nw2mvBr  提取密码:kg32

  • 二、定义通用类XlsxExcelData.cs
public class XlsxExcelData: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 SheetNames.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.xlsx; }
        }
        #endregion
        #region 构造
        public XlsxExcelData(string path)
        {
            m_filePath = path;
        }
        public XlsxExcelData(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>
        public void Load(string path)
        {
            m_filePath = path;
            ExcelPackage package = null;
            try
            {
                using (FileStream fs=File.Open(path,FileMode.OpenOrCreate,FileAccess.Read))
                {
                    package = new ExcelPackage(fs);
                }
            }
            catch
            {
                throw;
            }
            LoadExcel(package);
            package.Dispose();
        }

        /// <summary>
        /// 执行方法
        /// </summary>
        /// <param name="stream">文件流</param>
        private void Load(Stream stream)
        {
            m_stream = stream;
            ExcelPackage package = null;
            try
            {
                package = new ExcelPackage(stream);
            }
            catch
            {
                throw;
            }
            LoadExcel(package);
            package.Dispose();
        }

        /// <summary>
        /// 获取Excel对应字典
        /// </summary>
        /// <param name="package"></param>
        private void LoadExcel(ExcelPackage package)
        {
            m_tableDic = new Dictionary<string, DataTable>();
            var sheets = package.Workbook.Worksheets.GetEnumerator();
            while (sheets.MoveNext())
            {
                DataTable dt = new DataTable();
                var sheet = sheets.Current;
                string name = sheet.Name;
                if (sheet.Dimension!=null)
                {
                    for (int i = 1; i <=sheet.Dimension.Columns ; i++)
                    {
                        string header = ExcelHeaderGenerator.GetExcelHeader(i);
                        DataColumn col = new DataColumn(header);
                        dt.Columns.Add(col);
                    }
                    for (int i = 1; i <= sheet.Dimension.Rows ; i++)
                    {
                        try
                        {
                            ExcelRow excelRow = sheet.Row(i);
                            DataRow dRow = dt.NewRow();
                            for (int j = 1; j <=sheet.Dimension.Columns; j++)
                            {
                                ExcelRange range = sheet.Cells[i, j];
                                if (string.IsNullOrEmpty(range.Text))
                                {
                                    dRow[j - 1] = string.Empty;
                                }
                                else
                                {
                                    dRow[j - 1] = range.Text;
                                }
                            }
                            dt.Rows.Add(dRow);
                        }
                        catch (Exception e)
                        {
                            throw;
                        }
                    }
                }
                m_tableDic.Add(name, 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>
        /// <param name="columnNum">列数</param>
        /// <returns></returns>
        public DataTable GetDataTable(int sheetIndex, int columnNum)
        {
            DataTable dt = GetDataTable(sheetIndex);
            Convert(columnNum, ref dt);
            return dt;
        }

        /// <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.Rows)
            {
                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>
        /// 检测重复列
        /// </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.RemoveAt(i - r);
                r++;
            }
            for (int i = 0; i < columnArray.Count; i++)
            {
                dt.Columns[i].ColumnName = columnArray[i];
            }
        }
        #endregion
    }

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

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

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

原文地址:https://www.cnblogs.com/W--Jing/p/8436122.html

时间: 2024-10-01 03:55:05

C#:导入Excel通用类(Xlsx格式)的相关文章

MVC NPOI Linq导出Excel通用类

之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = 0, Float = 1, Double = 2, String = 3, DateTime = 4, Date = 5 } public class ExportFieldInfo { /// <summary> /// 字段名,用于反射获取值 /// </summary> publi

Excel通用类工具(二)

前言 上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题:其实很简单的,只需要在上一篇的基础上加一个类就可以了: 本篇所涉及的项目是在上一篇 Excel通用类工具(一) 的项目代码上进行的二次添加: 正文 新添加一个类 新添加一个注解类 ExcelName ,完整代码如下: import java.lang.annotation.ElementType; import java.lang.annota

poi导出excel通用类

一.关键的通用类public class PoiExportUtils {    private static HSSFWorkbook workBook; public PoiExportUtils(){        workBook = new HSSFWorkbook();    }        /**     * 创建sheet     * @param sheetName     * @param workBook     * @return     */    public st

MVC AJAX导出Excel通用类

通用类: public enum DataTypeEnum { Int = 0, Float = 1, Double = 2, String = 3, DateTime = 4, Date = 5 } public class ExportFieldInfo { /// <summary> /// 字段名,用于反射获取值 /// </summary> public string FieldName { get; set; } /// <summary> /// 中文名,

java导入excel时处理日期格式(已验证ok)

在Excel中的日期格式,比如2009-12-24将其转化为数字格式时变成了40171,在用java处理的时候,读取的也将是40171.如果使用POI处理Excel中的日期类型的单元格时,如果仅仅是判断它是否为日期类型的话,最终会以NUMERIC类型来处理.正确的处理方法是先判断单元格的类型是否则NUMERIC类型,然后再判断单元格是否为日期格式,如果是的话, 创建一个日期格式,再将单元格的内容以这个日期格式显示出来.如果单元格不是日期格式,那么则直接得到NUMERIC的值就行了.具体代码如下:

导入Excel工具类

import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Component; import or

Excel通用类工具(一)

前言 最近项目中遇到要将MySQL数据库中的某些数据导出为Excel格式保存,在以前也写过这样的功能,这次就准备用以前的代码,但是看了一下,这次却不一样,因为在以前用到的都是导出一种或几种数据,种类不多,但是这次导出的种类比较多,相当于就是每一种类型的数据得单独写一些代码,而且重复的比较多:就想写一个通用的,不管什么种类,直接传入数据就行了: 正文 想法 因为数据的种类是不同的,里面的属性也各不相同,如何用同一段代码去处理这些不同种类的属性,让我第一时间想到了Java的泛型和反射:因为之前的笔记

使用回调方式写POI导入excel工具类

场景是这样的:为了做一个excel导入的功能,为了尽可能的写一个通用的工具类,将与poi有关的东西都封装起来,以便以其他人员只用关心自己的业务,不用和poi打交道. 写到最后,现在还是会有poi的东西暴漏出来一点,暴漏出来的这个应该是必须的. 为了模拟这个场景,先写两个service方法,用于和数据库交互,存入从模板中读取的数据.代码如下: 1.berthservice public class BerthService { public void update(){ System.out.pr

java中excel导入\导出工具类

1.导入工具 1 package com.linrain.jcs.test; 2 3 4 import jxl.Cell; 5 import jxl.Sheet; 6 import jxl.Workbook; 7 import jxl.write.Label; 8 import jxl.write.WritableSheet; 9 10 import java.io.InputStream; 11 import java.lang.reflect.Field; 12 import java.te