• Excel导入导出帮助类


       /// <summary>
        /// Excel导入导出帮助类
        /// 记得引入 NPOI
        /// 下载地址   http://npoi.codeplex.com/releases/
        /// </summary>

    public class ExcelHelper
        {
            #region 导出Excel

            /// <summary>
            /// 导出Excel  注:model 字段必须加[DisplayName("XXX")]不要导出的标为[DisplayName("null")],并且不要导出的字段放在最后,要导出的放前面
            /// </summary>
            /// <param name="p_List">数据集合</param>
            /// <param name="p_Title">Excel路径</param>
            /// <param name="ColumnsCount">总列数</param>
            public void ToExcel<T>(List<T> p_List, string p_Title, int ColumnsCount)
            {
                if (p_List == null || p_List.Count <= 0 || ColumnsCount <= 0)
                {
                    return;
                }
                PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));

                if (properties.Count <= 0)
                {
                    return;
                }

                StringBuilder ExcelInfo = new StringBuilder();
                string sign = string.Empty;
                string DisplayName = string.Empty;
                //写表头
                for (int i = 0; i < ColumnsCount; i++)
                {
                    DisplayName = properties[i].DisplayName;
                    if (!string.IsNullOrEmpty(DisplayName) && DisplayName != "null" && DisplayName != "Id")
                    {
                        sign = i == ColumnsCount - 1 ? " " : " ";
                        ExcelInfo.AppendFormat("{0}{1}", DisplayName, sign);
                    }
                }

                //写表内容
                for (int i = 0; i < p_List.Count; i++)
                {
                    for (int j = 0; j < ColumnsCount; j++)
                    {
                        DisplayName = properties[j].DisplayName;
                        if (!string.IsNullOrEmpty(DisplayName) && DisplayName != "null" && DisplayName != "Id")
                        {
                            sign = j == ColumnsCount - 1 ? " " : " ";
                            object obj = properties[j].GetValue(p_List[i]);
                            obj = obj == null ? string.Empty : obj.ToString();
                            ExcelInfo.AppendFormat("{0}{1}", obj, sign);
                        }
                    }
                }

                HttpResponse p_Response = HttpContext.Current.Response;
                p_Response.Clear();
                p_Response.ClearContent();
                p_Response.Buffer = true;

                //设置Http的头信息,编码格式
                p_Response.AppendHeader("Content-Disposition", "attachment;filename=" + p_Title + ".xls");
                p_Response.ContentType = "application/ms-excel";

                //设置编码
                p_Response.Charset = "gb2312";
                p_Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
                p_Response.Write(ExcelInfo);
                p_Response.Flush();
                p_Response.Close();
                p_Response.End();
            }

            #endregion


            #region 导入Excel数据

            /// <summary>
            /// OleDB连接Excel文件 --> DataSet
            /// </summary>
            /// <param name="xlsFilePath">.xls文件路径</param>
            /// <returns></returns>
            public static DataSet XlsToDataSet(string xlsFilePath)
            {
                OleDbConnection oleDBConn = new OleDbConnection();
                OleDbDataAdapter oleAdMaster = new OleDbDataAdapter();
                DataSet ds = new DataSet();

                try
                {
                    FileInfo file = new FileInfo(xlsFilePath);
                    if (!file.Exists)
                    {
                        throw new Exception("文件不存在。");
                    }

                    string extension = file.Extension.ToLower();
                    StringBuilder oleDBConnStr = new StringBuilder();
                    switch (extension)
                    {
                        case ".xls":
                            oleDBConnStr.AppendFormat("Provider=Microsoft.Jet.Oledb.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=NO;IMEX=1';", xlsFilePath);//此连接只能操作Excel2007之前(.xls)文件
                            //备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。
                            //      "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。
                            break;
                        case ".xlsx":
                            oleDBConnStr.AppendFormat("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';", xlsFilePath);
                            break;
                        default:
                            oleDBConnStr.AppendFormat("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=Excel 8.0;HDR=YES;IMEX=1;", xlsFilePath);
                            break;
                    }

                    oleDBConn = new OleDbConnection(oleDBConnStr.ToString());
                    oleDBConn.Open();

                    DataTable tableStructure = oleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                    if (tableStructure != null && tableStructure.Rows.Count > 0)
                    {
                        tableStructure.TableName = tableStructure.Rows[0]["TABLE_NAME"].ToString();
                        StringBuilder sqlStr = new StringBuilder();
                        sqlStr.AppendFormat("select * from [{0}]", tableStructure.TableName);

                        oleAdMaster = new OleDbDataAdapter(sqlStr.ToString(), oleDBConn);
                        oleAdMaster.Fill(ds, "m_tableName");

                        if (ds.Tables["m_tableName"].Rows.Count <= 0)
                        {
                            throw new Exception("excel文件中没有有客户数据,请录入数据。");
                        }
                    }
                    else
                    {
                        throw new Exception("未能找到该上传的excel文件。");
                    }
                }
                finally
                {
                    oleAdMaster.Dispose();
                    oleDBConn.Close();
                    oleDBConn.Dispose();
                }

                return ds;
            }

            #endregion

            #region NPOI 导出Excel

            private const Int32 MaxRowPerSheet = 65535;
            private Int32 rowPerSheet = 1000;
            public Int32 RowPerSheet
            {
                get { return rowPerSheet; }
                set
                {
                    if (value < 0 || value > MaxRowPerSheet)
                    {
                        throw new ArgumentOutOfRangeException("RowPerSheet");
                    }
                    else
                    {
                        rowPerSheet = value;
                    }
                }
            }


            HSSFWorkbook hssfworkbook;

            public void Export<T>(IList<T> records)
            {
                if (records.Count == 0)
                    throw new ArgumentNullException("无导出数据。");

                PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
                int ColumnsCount = properties.Count;
                PropertyInfo[] props = new PropertyInfo[ColumnsCount];
                string DisplayName = string.Empty;
                for (int i = 0; i < ColumnsCount; i++)
                {
                    DisplayName = properties[i].DisplayName;
                    if (!string.IsNullOrEmpty(DisplayName) && DisplayName != "null" && DisplayName != "Id")
                    {
                        props[i] = typeof(T).GetProperty(properties[i].Name); //注意属性数组仍然可以有元素为null
                    }
                }

                ISheet sheet = null;
                IRow row = null;

                for (int r = 0; r < records.Count; r++)
                {
                    if ((r % RowPerSheet) == 0)
                    {
                        Int32 sheetIndex = (Int32)((Double)r / RowPerSheet) + 1;
                        sheet = hssfworkbook.CreateSheet("Sheet" + sheetIndex);
                        row = sheet.CreateRow(0);
                        for (int i = 0; i < ColumnsCount; i++)
                        {
                            DisplayName = properties[i].DisplayName;
                            if (!string.IsNullOrEmpty(DisplayName) && DisplayName != "null" && DisplayName != "Id")
                            {
                                row.CreateCell(i).SetCellValue(properties[i].DisplayName);
                            }
                        }
                        Console.WriteLine();
                    }

                    //注意CreateRow(Int32 rownum)中参数rownum虽然从第0行开始,但因为表头存在,每次得往下一行
                    row = sheet.CreateRow(r % RowPerSheet + 1);
                    for (int i = 0; i < props.Length; i++)
                    {
                        if (props[i] != null) //注意null检查
                        {
                            Object value = props[i].GetValue(records[r], null);
                            if (value != null)
                            {
                                row.CreateCell(i).SetCellValue(value.ToString());
                            }
                        }
                    }
                }

                for (Int32 i = 0; i < hssfworkbook.NumberOfSheets; i++)
                {
                    sheet = hssfworkbook.GetSheetAt(i);
                    for (Int32 h = 0; h < ColumnsCount; h++)
                    {
                        sheet.AutoSizeColumn(h); //每列宽度自适应
                    }
                }
            }

            /// <summary>
            /// 导出Excel
            /// </summary>
            /// <typeparam name="T">泛型</typeparam>
            /// <param name="records">数据</param>
            /// <param name="filename">Excel名称</param>
            public void SaveToExcel<T>(IList<T> records, string fileName)
            {
                RowPerSheet = 100;

                string userAgent = HttpContext.Current.Request.ServerVariables["http_user_agent"].ToLower();
                if (userAgent.IndexOf("firefox") == -1)//判断是否是火狐浏览器
                    fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);

                HttpResponse p_Response = HttpContext.Current.Response;
                p_Response.ContentType = "application/vnd.ms-excel";
                p_Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
                p_Response.Clear();

                InitializeWorkbook();
                Export<T>(records);
                GetExcelStream().WriteTo(p_Response.OutputStream);
                p_Response.End();
            }

            MemoryStream GetExcelStream()
            {
                //Write the stream data of workbook to the root directory
                MemoryStream file = new MemoryStream();
                hssfworkbook.Write(file);
                return file;
            }

            void InitializeWorkbook()
            {
                hssfworkbook = new HSSFWorkbook();

                ////create a entry of DocumentSummaryInformation
                DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
                // dsi.Company = "NPOI Team";
                hssfworkbook.DocumentSummaryInformation = dsi;

                ////create a entry of SummaryInformation
                SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
                //  si.Subject = "NPOI SDK Example";
                hssfworkbook.SummaryInformation = si;
            }

            #endregion

            #region NPOI 导入Excel

            /// <summary>
            /// Excel转换DataTable
            /// </summary>
            /// <param name="FilePath">文件的绝对路径</param>
            /// <returns>DataTable</returns>
            public static DataTable ExcelInput(string FilePath)
            {
                DataTable dt = new DataTable();

                HSSFWorkbook hssfworkbook;
                using (FileStream file = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
                {
                    hssfworkbook = new HSSFWorkbook(file);
                }
                ISheet sheet = hssfworkbook.GetSheetAt(0);
                System.Collections.IEnumerator rows = sheet.GetRowEnumerator();

                IRow headerRow = sheet.GetRow(0);
                int cellCount = headerRow.LastCellNum;

                for (int j = 0; j < cellCount; j++)
                {
                    ICell cell = headerRow.GetCell(j);
                    dt.Columns.Add(cell.ToString());
                }

                for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
                {
                    IRow row = sheet.GetRow(i);
                    DataRow dataRow = dt.NewRow();

                    for (int j = row.FirstCellNum; j < cellCount; j++)
                    {
                        if (row.GetCell(j) != null)
                            dataRow[j] = row.GetCell(j).ToString();
                    }

                    dt.Rows.Add(dataRow);
                }
                return dt;
            }

            #endregion
        }

  • 相关阅读:
    PTA中如何出Java编程题?
    20145120黄玄曦 《java程序设计》 寒假学习总结
    java EE技术体系——CLF平台API开发注意事项(1)——后端开发
    相信自己、相信未来—2017半年总结
    API生命周期第三阶段:API实施:使用swagger codegen生成可部署工程,择取一个作为mock service
    API生命周期第三阶段:API实施模式,以及结合swagger和项目现状的最佳模式
    API生命周期第二阶段——设计:如何设计API(基于swagger进行说明)
    API生命周期第二阶段——设计:采用swagger进行API描述、设计
    API生命周期
    API经济时代的思考(转载目的:为之后写API-first模式的生命周期治理做准备)
  • 原文地址:https://www.cnblogs.com/change4now/p/5141740.html
Copyright © 2020-2023  润新知