/// <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 ? "\n" : "\t";
                    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 ? "\n" : "\t";
                        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
    }

Excel导入导出帮助类的更多相关文章

  1. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  2. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  3. java Excel导入导出工具类

    本文章,导入导出依赖提前定义好的模板 package com.shareworx.yjwy.utils; import java.io.File; import java.io.FileInputSt ...

  4. java中excel导入\导出工具类

    1.导入工具 package com.linrain.jcs.test; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import ...

  5. 【原创】POI操作Excel导入导出工具类ExcelUtil

    关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.Th ...

  6. poi excel导入导出

    pom <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artif ...

  7. ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码

    实用类:UtilityClass 包含如下方法 判断对象是否为空或NULL,如果是空或NULL返回true,否则返回false 验证手机号是否正确 13,15,18 验证邮箱 验证网址 MD5加密,返 ...

  8. 利用反射实现通用的excel导入导出

    如果一个项目中存在多种信息的导入导出,为了简化代码,就需要用反射实现通用的excel导入导出 实例代码如下: 1.创建一个 Book类,并编写set和get方法 package com.bean; p ...

  9. Excel导入导出的业务进化场景及组件化的设计方案(上)

    1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候 ...

随机推荐

  1. Live555研究之二Sleep实现

    Live555通过一个while循环来不断读取socket,判断是否有连接进来,但是Live555并没有使用Sleep函数来让线程休眠多少毫秒来降低CPU占用率.Live555是通过select函数来 ...

  2. 利用文件实现Free Pascal中的简单排序功能

    此程序主要是验证文件功能的读写功能,总结到的东西有:①文件无论是读还是写,都要先建立链接关系才可以进行;②读与写不能同时进行,必须分开操作,这也可以理解,在实际鼠标操作时也是如此的!③读写后必须用cl ...

  3. openCV 直方图统计

    直方图显示 #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc ...

  4. [原]SyntaxHighlighter使用笔记

    [Date]2013-09-21 [Environment]SyntaxHighlighter 3.0.83 [Author]wintys (wintys@gmail.com) http://wint ...

  5. [假期总结]Self

    8月底返校,这一周也没有勤学苦练.假期3周的时间学习了nodejs. 1.nodejs的学习 学习了一本书上的例程,搭建了个博客.这种程度等于是能够动手开发的阶段,前路还很漫长. 2.个人网站的建设 ...

  6. Windows性能监视器之CPU、硬盘、IO等监控方法详解-摘自网络

    一般操作系统性能主要涉及到的问题主要有:处理器使用情况.内存占有量.磁盘I/0操作以及网络流量等. 查看Windows性能情况,大部分情况下是通过 “Windows任务管理器”,可以通过在 ”命令行” ...

  7. 一切不以用户为中心的O2O 都是耍流氓

    今天去万达广场逛街,手机搜了下附近的Wifi,发现有万达的免费Wifi,想起前些日子网上说万达要做O2O的试运营,于是尝试连接了下,结果弹出页面,要输入手机号,然后发送验证码才能登陆,结果输入手机号, ...

  8. [C++]VS与第三方工具下载

    名称:Qt 5.1.1 (商业版与开放源码许可GPL/LGPL) 说明:Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架 下载:http://www.qt.io/downl ...

  9. [iOS基础控件 - 6.3] 使用可视化连线方式指定dataSource、delegate

    对着要指定dataSource或者delegate的控件右击,然后拖动线到指定的控制器上

  10. svn访问权限控制

    [customer:/]qa = rwreadonly = ryinqixian = r@haowu_partner_dev = r@admin = rw[customer:/branches/v1. ...