• 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;
     }
  • 相关阅读:
    Android开发笔记——WebView
    字符串_最小表示法求循环串的最小序列(HDU_4162)
    STL_map简单应用(HDU_1075)
    DP_最大子序列和(HDU_1003)
    STL map 使用方法(转)
    数学_线性筛法建立素数表(HDU_1262)
    學習筆記 ADO數據庫訪問技術
    C#多线程学习
    Java容器
    选取单元格的基本语句
  • 原文地址:https://www.cnblogs.com/gxivwshjj/p/6102402.html
Copyright © 2020-2023  润新知