zoukankan      html  css  js  c++  java
  • Nopi Excel导入

    http://download.csdn.net/detail/diaodiaop/7611721

    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using NPOI.HSSF.UserModel;
    using NPOI.SS.UserModel;
    using NPOI.XSSF.UserModel;
    using System.Text.RegularExpressions;
    using System;
    using System.Reflection;
    using System.Xml.Serialization;
    using System.Xml;
    using System.Xml.Schema;
    
    public class MyExcelHelper
    {
        public class x2003
        {
            #region Excel2003
            /// <summary>
            /// 将Excel文件中的数据读出到DataTable中(xls)
            /// </summary>
            /// <param name="file"></param>
            /// <returns></returns>
            public static DataTable ExcelToTableForXLS(string file)
            {
                DataTable dt = new DataTable();
                using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
                {
                    HSSFWorkbook hssfworkbook = new HSSFWorkbook(fs);
                    ISheet sheet = hssfworkbook.GetSheetAt(0);
    
                    //表头
                    IRow header = sheet.GetRow(sheet.FirstRowNum);
                    List<int> columns = new List<int>();
                    for (int i = 0; i < header.LastCellNum; i++)
                    {
                        object obj = GetValueTypeForXLS(header.GetCell(i) as HSSFCell);
                        if (obj == null || obj.ToString() == string.Empty)
                        {
                            dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
                            //continue;
                        }
                        else
                            dt.Columns.Add(new DataColumn(obj.ToString()));
                        columns.Add(i);
                    }
                    //数据
                    for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
                    {
                        DataRow dr = dt.NewRow();
                        bool hasValue = false;
                        foreach (int j in columns)
                        {
                            dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j) as HSSFCell);
                            if (dr[j] != null && dr[j].ToString() != string.Empty)
                            {
                                hasValue = true;
                            }
                        }
                        if (hasValue)
                        {
                            dt.Rows.Add(dr);
                        }
                    }
                }
                return dt;
            }
    
          
    
            /// <summary>
            /// 将DataTable数据导出到Excel文件中(xls)
            /// </summary>
            /// <param name="dt"></param>
            /// <param name="file"></param>
            public static void TableToExcelForXLS(DataTable dt, string file)
            {
                HSSFWorkbook hssfworkbook = new HSSFWorkbook();
                ISheet sheet = hssfworkbook.CreateSheet("Test");
    
                //表头
                IRow row = sheet.CreateRow(0);
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    ICell cell = row.CreateCell(i);
                    cell.SetCellValue(dt.Columns[i].ColumnName);
                }
    
                //数据
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    IRow row1 = sheet.CreateRow(i + 1);
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        ICell cell = row1.CreateCell(j);
                        cell.SetCellValue(dt.Rows[i][j].ToString());
                    }
                }
    
                //转为字节数组
                MemoryStream stream = new MemoryStream();
                hssfworkbook.Write(stream);
                byte[] buf = stream.ToArray();
    
                //保存为Excel文件
                using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
                {
                    fs.Write(buf, 0, buf.Length);
                    fs.Flush();
                }
            }
    
            /// <summary>
            /// 获取单元格类型(xls)
            /// </summary>
            /// <param name="cell"></param>
            /// <returns></returns>
            private static object GetValueTypeForXLS(HSSFCell cell)
            {
                if (cell == null)
                    return null;
                switch (cell.CellType)
                {
                    case CellType.BLANK: //BLANK:
                        return null;
                    case CellType.BOOLEAN: //BOOLEAN:
                        return cell.BooleanCellValue;
                    case CellType.NUMERIC: //NUMERIC:
                        return cell.NumericCellValue;
                    case CellType.STRING: //STRING:
                        return cell.StringCellValue;
                    case CellType.ERROR: //ERROR:
                        return cell.ErrorCellValue;
                    case CellType.FORMULA: //FORMULA:
                    default:
                        return "=" + cell.CellFormula;
                }
            }
            #endregion
        }
    
        public class x2007
        {
            #region Excel2007
            /// <summary>
            /// 将Excel文件中的数据读出到DataTable中(xlsx)
            /// </summary>
            /// <param name="file"></param>
            /// <returns></returns>
            public static DataTable ExcelToTableForXLSX(string file)
            {
                DataTable dt = new DataTable();
                using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
                {
                    XSSFWorkbook xssfworkbook = new XSSFWorkbook(fs);
                    ISheet sheet = xssfworkbook.GetSheetAt(0);
    
                    //表头
                    IRow header = sheet.GetRow(sheet.FirstRowNum);
                    List<int> columns = new List<int>();
                    for (int i = 0; i < header.LastCellNum; i++)
                    {
                        object obj = GetValueTypeForXLSX(header.GetCell(i) as XSSFCell);
                        if (obj == null || obj.ToString() == string.Empty)
                        {
                            dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
                            //continue;
                        }
                        else
                            dt.Columns.Add(new DataColumn(obj.ToString()));
                        columns.Add(i);
                    }
                    //数据
                    for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
                    {
                        DataRow dr = dt.NewRow();
                        bool hasValue = false;
                        foreach (int j in columns)
                        {
                            dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j) as XSSFCell);
                            if (dr[j] != null && dr[j].ToString() != string.Empty)
                            {
                                hasValue = true;
                            }
                        }
                        if (hasValue)
                        {
                            dt.Rows.Add(dr);
                        }
                    }
                }
                return dt;
            }
    
            /// <summary>
            /// 将DataTable数据导出到Excel文件中(xlsx)
            /// </summary>
            /// <param name="dt"></param>
            /// <param name="file"></param>
            public static void TableToExcelForXLSX(DataTable dt, string file)
            {
                XSSFWorkbook xssfworkbook = new XSSFWorkbook();
                ISheet sheet = xssfworkbook.CreateSheet("Test");
    
                //表头
                IRow row = sheet.CreateRow(0);
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    ICell cell = row.CreateCell(i);
                    cell.SetCellValue(dt.Columns[i].ColumnName);
                }
    
                //数据
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    IRow row1 = sheet.CreateRow(i + 1);
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        ICell cell = row1.CreateCell(j);
                        cell.SetCellValue(dt.Rows[i][j].ToString());
                    }
                }
    
                //转为字节数组
                MemoryStream stream = new MemoryStream();
                xssfworkbook.Write(stream);
                byte[] buf = stream.ToArray();
    
                //保存为Excel文件
                using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))
                {
                    fs.Write(buf, 0, buf.Length);
                    fs.Flush();
                }
            }
    
            /// <summary>
            /// 获取单元格类型(xlsx)
            /// </summary>
            /// <param name="cell"></param>
            /// <returns></returns>
            private static object GetValueTypeForXLSX(XSSFCell cell)
            {
                if (cell == null)
                    return null;
                switch (cell.CellType)
                {
                    case CellType.BLANK: //BLANK:
                        return null;
                    case CellType.BOOLEAN: //BOOLEAN:
                        return cell.BooleanCellValue;
                    case CellType.NUMERIC: //NUMERIC:
                        return cell.NumericCellValue;
                    case CellType.STRING: //STRING:
                        return cell.StringCellValue;
                    case CellType.ERROR: //ERROR:
                        return cell.ErrorCellValue;
                    case CellType.FORMULA: //FORMULA:
                    default:
                        return "=" + cell.CellFormula;
                }
            }
            #endregion
        }
    
        public static DataTable GetDataTable(string filepath)
        {
            DataTable dt = new DataTable("xls");
            if (Regex.IsMatch(filepath, ".xls$"))
            {
                dt = x2003.ExcelToTableForXLS(filepath);
            }
            else
            {
                dt = x2007.ExcelToTableForXLSX(filepath);
            }
            return dt;
        }
    
        /// <summary>
        /// 根据文件路径与单元头,获取我们需要的DataTable
        /// </summary>
        /// <param name="filepath">文件路径</param>
        /// <param name="cellHeard">单元头的Key和Value:{ { "UserName", "姓名" }, { "Age", "年龄" } }</param>
        /// <returns></returns>
        public static DataTable GetDataTable(string filepath, Dictionary<string, string> cellHeard)
        {
            DataTable dt = new DataTable("xls");
            if (Regex.IsMatch(filepath, ".xls$"))
            {
                dt = x2003.ExcelToTableForXLS(filepath);
            }
            else
            {
                dt = x2007.ExcelToTableForXLSX(filepath);
            }
    
            DataTable result = createDataTableKey(cellHeard);
            DataRow row;
            foreach(DataRow r in dt.Rows)
            {
                row = result.NewRow();
                foreach (KeyValuePair<string, string> kvp in cellHeard)
                {
                    if (dt.Columns.Contains(kvp.Value))
                    {
                        row[kvp.Key] = r[kvp.Value];
                    }
                    else {
                        row[kvp.Key] = string.Empty;
                    }
                }
                result.ImportRow(row);
            }
            return dt;
        }
    
        /// <summary>
        /// 根据单元头的键转换成我们 需要的DataTable
        /// </summary>
        /// <param name="cellHeard">单元头的Key和Value:{ { "UserName", "姓名" }, { "Age", "年龄" } }</param>
        /// <param name="dt">数据源</param>
        /// <returns></returns>
        public static DataTable ChangeDataTableKey(Dictionary<string, string> cellHeard,DataTable dt)
        {
            DataTable result = createDataTableKey(cellHeard);
            DataRow row;
            foreach (DataRow r in dt.Rows)
            {
                row = result.NewRow();
                foreach (KeyValuePair<string, string> kvp in cellHeard)
                {
                    if (dt.Columns.Contains(kvp.Value))
                    {
                        row[kvp.Key] = r[kvp.Value];
                    }
                    else
                    {
                        row[kvp.Key] = string.Empty;
                    }
                }
                result.Rows.Add(row);
            }
            return result;
        }
    
        /// <summary>
        /// 根据单元头值转换成我们 需要的DataTable
        /// </summary>
        /// <param name="cellHeard">单元头的Key和Value:{ { "UserName", "姓名" }, { "Age", "年龄" } }</param>
        /// <param name="dt">数据源</param>
        /// <returns></returns>
        public static DataTable ChangeDataTableValue(Dictionary<string, string> cellHeard, DataTable dt)
        {
            DataTable result = createDataTableValue(cellHeard);
            DataRow row;
            foreach (DataRow r in dt.Rows)
            {
                row = result.NewRow();
                foreach (KeyValuePair<string, string> kvp in cellHeard)
                {
                    if (dt.Columns.Contains(kvp.Value))
                    {
                        row[kvp.Value] = r[kvp.Value];
                    }
                    else
                    {
                        row[kvp.Value] = string.Empty;
                    }
                }
                result.Rows.Add(row);
            }
            return result;
        }
    
        private static DataTable createDataTableValue(Dictionary<string, string> cellHeard)
        {
            DataTable dt = new DataTable();
            foreach (KeyValuePair<string, string> kvp in cellHeard)
            {
                DataColumn col = new DataColumn(kvp.Value);
                dt.Columns.Add(col);
            }
            return dt;
        }
    
        private static DataTable createDataTableKey(Dictionary<string, string> cellHeard)
        {
            DataTable dt = new DataTable();
            foreach (KeyValuePair<string, string> kvp in cellHeard)
            {
                DataColumn col = new DataColumn(kvp.Key);
                dt.Columns.Add(col);
            }
            return dt;
        }
    
        public static List<T> ConvertToList<T>(DataTable dt) where T : new()
        {
            // 定义集合  
            List<T> list = new List<T>();
    
            // 获得此模型的类型  
            Type type = typeof(T);
            //定义一个临时变量  
            string tempName = string.Empty;
            //遍历DataTable中所有的数据行  
    
            // 获得此模型的公共属性  
            PropertyInfo[] propertys = (new T()).GetType().GetProperties();
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                //遍历该对象的所有属性  
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;//将属性名称赋值给临时变量  
                    //检查DataTable是否包含此列(列名==对象的属性名)    
                    if (dt.Columns.Contains(tempName))
                    {
                        // 判断此属性是否有Setter  
                        if (!pi.CanWrite) continue;//该属性不可写,直接跳出  
                        //取值  
                        object value = dr[tempName];
                        //如果非空,则赋给对象的属性  
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
                //对象添加到泛型集合中  
                list.Add(t);
            }
    
            return list;
    
        }
    }
    
    
    [Serializable]
    public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
    {
        public SerializableDictionary() { }
        public void WriteXml(XmlWriter write)       // Serializer
        {
            XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue));
    
            foreach (KeyValuePair<TKey, TValue> kv in this)
            {
                write.WriteStartElement("SerializableDictionary");
                write.WriteStartElement("key");
                KeySerializer.Serialize(write, kv.Key);
                write.WriteEndElement();
                write.WriteStartElement("value");
                ValueSerializer.Serialize(write, kv.Value);
                write.WriteEndElement();
                write.WriteEndElement();
            }
        }
        public void ReadXml(XmlReader reader)       // Deserializer
        {
            reader.Read();
            XmlSerializer KeySerializer = new XmlSerializer(typeof(TKey));
            XmlSerializer ValueSerializer = new XmlSerializer(typeof(TValue));
    
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                reader.ReadStartElement("SerializableDictionary");
                reader.ReadStartElement("key");
                TKey tk = (TKey)KeySerializer.Deserialize(reader);
                reader.ReadEndElement();
                reader.ReadStartElement("value");
                TValue vl = (TValue)ValueSerializer.Deserialize(reader);
                reader.ReadEndElement();
                reader.ReadEndElement();
                this.Add(tk, vl);
                reader.MoveToContent();
            }
            reader.ReadEndElement();
    
        }
        public XmlSchema GetSchema()
        {
            return null;
        }
    }
    protected void btnUpload_Click(object sender, EventArgs e)
        {
            //DataTable enlist2 = MyExcelHelper.ChangeDataTableValue(GetHead(), MyExcelHelper.GetDataTable(@"E:代码&数据备份宁海专项资金1代码NhFundsSFWebSiteUpFilesExcelFiles地方贡献审核明细表模板.xls"));
            
            //datagrid1.DataSource = enlist2;
            //datagrid1.DataBind();
            //Session[_key] = enlist2;
    
            //return;
            StringBuilder errorMsg = new StringBuilder(); // 错误信息
            try
            {
    
                #region 1.获取Excel文件并转换为一个List集合
    
                // 1.1存放Excel文件到本地服务器
                HttpPostedFile filePost = Request.Files["filed"]; // 获取上传的文件
                if (filePost == null)
                {
                    Page.ClientScript.RegisterStartupScript(this.GetType(), Guid.NewGuid().ToString(), "alert('请选择文件上传');", true);
                    return;
                }
                string filePath = SaveExcelFile(filePost); // 保存文件并获取文件路径
                if (string.IsNullOrEmpty(filePath))
                {
                    Page.ClientScript.RegisterStartupScript(this.GetType(), Guid.NewGuid().ToString(), "alert('文件上传失败');", true);
                    return;
                }
    
                // 单元格抬头
                // key:实体对象属性名称,可通过反射获取值
                // value:属性对应的中文注解
                Dictionary<string, string> cellheader = GetHead();
    
                DataTable enlist = MyExcelHelper.ChangeDataTableValue(cellheader, MyExcelHelper.GetDataTable(filePath));
                List<lz.T_GongXian> list = MyExcelHelper.ConvertToList<lz.T_GongXian>(MyExcelHelper.ChangeDataTableValue(cellheader, enlist));
                datagrid1.DataSource = enlist;
                datagrid1.DataBind();
                Session[_key] = enlist;
                #endregion
    
    
                // 3.TODO:对List集合进行持久化存储操作。如:存储到数据库
    
                // 4.返回操作结果
    
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    
        private Dictionary<string, string> GetHead()
        {
           
                SerializableDictionary<string, string> cellheader = new SerializableDictionary<string, string>();
                cellheader.Add("id", "序号");
                cellheader.Add("QYMC", "企业名称");
                cellheader.Add("SBXM", "申报项目");
                cellheader.Add("SDBZJY", "审定补助金额");
                cellheader.Add("ZZS", "增值税(含免抵)");
                cellheader.Add("YYS", "营业税");
                cellheader.Add("GRSDS", "个人所得税(仅限个人独资企业)");
                cellheader.Add("QYSDS", "企业所得税");
                cellheader.Add("YHS", "印花税");
                cellheader.Add("CJS", "城建税");
                cellheader.Add("FCS", "房产税");
                cellheader.Add("TDSYS", "土地使用税");
                cellheader.Add("DFLCHJ", "地方留成合计数");
                cellheader.Add("BZCY", "地方留成合计数与审定补助合计数差额");
                cellheader.Add("HDBZZJ", "核定补助资金");
                cellheader.Add("remark", "备注");
               
            return cellheader;
     }
  • 相关阅读:
    波段是金牢记六大诀窍
    zk kafka mariadb scala flink integration
    Oracle 体系结构详解
    图解 Database Buffer Cache 内部原理(二)
    SQL Server 字符集介绍及修改方法演示
    SQL Server 2012 备份与还原详解
    SQL Server 2012 查询数据库中所有表的名称和行数
    SQL Server 2012 查询数据库中表格主键信息
    SQL Server 2012 查询数据库中所有表的索引信息
    图解 Database Buffer Cache 内部原理(一)
  • 原文地址:https://www.cnblogs.com/gxivwshjj/p/6102402.html
Copyright © 2011-2022 走看看