NPOI 生成Excel

记录使用NPOI生成Excel的通用方法

NPOI安装,使用Nuget:

Install-Package NPOI

使用泛型方法,反射两种方式实现生成Excel

第一种方法

有指定Header类型的方式:

 /// <summary>
        /// 指定表头,根据List生成Excel
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filePath"></param>
        /// <param name="excelHeaders"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static bool CreateExcel<T>(string filePath, List<ExcelHeader> excelHeaders, List<T> data) where T : class
        {
            try
            {
            XSSFWorkbook workbook = new XSSFWorkbook();
            ISheet sheet1 = workbook.CreateSheet("Sheet1");
            //新增一个Row
            IRow headerRow = sheet1.CreateRow(0);
                for (int i = 0; i < excelHeaders.Count; i++)
                {
                    //新增单元格
                    headerRow.CreateCell(i).SetCellValue(excelHeaders[i].HeaderName);
                }

            int count = 1;
            foreach (T item in data)
            {
                //循环新增
                IRow row = sheet1.CreateRow(count);
                for (int i = 0; i < excelHeaders.Count; i++)
                {
                    //反射处理
                    Type t = item.GetType();
                    PropertyInfo propertyInfo = t.GetProperties().FirstOrDefault(w => w.Name == excelHeaders[i].ColumnName);
                    if (propertyInfo != null)
                    {
                        row.CreateCell(i).SetCellValue(propertyInfo.GetValue(item, null).ToString());
                    }
                }
                count++;
            }
                //保存文件
                using (var f = File.Create(filePath))
                {
                    workbook.Write(f);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return true;
        }

ExcelHeader类:

    public class ExcelHeader
    {
        public string HeaderName { get; set; }
        public string ColumnName { get; set; }
    }

第二种方法

这个减少去手动指定需要生成Excel内容的字段信息。会根据List<T>全部生成Excel,逻辑都是一样的:

 /// <summary>
        /// T 实体类必须指定DisplayName,根据DisplayName 生成列名
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="filePath"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static bool CreateExcel<T>(string filePath, List<T> data) where T:class
        {
            try
            {
                XSSFWorkbook workbook = new XSSFWorkbook();
                ISheet sheet1 = workbook.CreateSheet("Sheet1");

                IRow headerRow = sheet1.CreateRow(0);
                //列名
                 PropertyInfo[] columnsPropertyInfo = data.FirstOrDefault().GetType().GetProperties();
                int cellCount = 0;
                foreach (var column in columnsPropertyInfo)
                {
                    //根据实体类中DisplayName 生成列名
                    headerRow.CreateCell(cellCount).SetCellValue(column.GetCustomAttribute<DisplayNameAttribute>().DisplayName);
                    cellCount++;
                }
                //item
                int rowCount = 1;
                foreach (T item in data)
                {
                    IRow row = sheet1.CreateRow(rowCount);
                    int count = 0;
                    foreach (PropertyInfo propertyInfo in item.GetType().GetProperties())
                    {
                        row.CreateCell(count).SetCellValue(propertyInfo.GetValue(item, null).ToString());
                        count++;
                    }
                    rowCount++;
                }

                using (var f = File.Create(filePath))
                {
                    workbook.Write(f);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return true;
        }

这里展示在MVC项目中的使用方法:

             public ActionResult DownLoad()
        {
            //获取需要查询的数据集
            var data = GetAllData();
            //根据查询出数据实体类,指定对应需要生成Excel类容的字段名信息
            List<ExcelHeader> headers = new List<ExcelHeader>();
            headers.Add(new ExcelHeader() { ColumnName = "AcquittanceId", HeaderName = "收据号" });
            headers.Add(new ExcelHeader() { ColumnName = "Company", HeaderName = "公司" });
            headers.Add(new ExcelHeader() { ColumnName = "TaxId", HeaderName = "税号" });
            headers.Add(new ExcelHeader() { ColumnName = "BackName", HeaderName = "开户行" });
            headers.Add(new ExcelHeader() { ColumnName = "BankAccount", HeaderName = "银行账号" });
            headers.Add(new ExcelHeader() { ColumnName = "UserName", HeaderName = "姓名" });
            headers.Add(new ExcelHeader() { ColumnName = "PhoneNo", HeaderName = "联系方式" });
            headers.Add(new ExcelHeader() { ColumnName = "Email", HeaderName = "地址" });
            headers.Add(new ExcelHeader() { ColumnName = "CreateTime", HeaderName = "提交时间" });
            //生成物理路径
            string fileName = Server.MapPath(string.Format("~/Download/{0}.xlsx",DateTime.Now.ToString("yyyyMMddhhmmss")));
            //调用生成 第一种方式
            //if (ExcelHelper.CreateExcel<SurverTemp>(fileName, headers, data))
            //{
            //下载
            //     DownloadHelper.Download(fileName);
            //}
            //调用生成 第二种方式
            if (ExcelHelper.CreateExcel<SurverTemp>(fileName,data))
            {
                //下载
                DownloadHelper.Download(fileName);
            }
            return null;
        }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,652评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,085评论 25 707
  • 如果有一天 生命走近了终点 我希望自己 帅气、体面、坦然的离去 如果有一天 非得给自己的人生添一丝波澜 我宁可困难...
    西春阅读 177评论 6 11
  • 完成100本书中的第二本《富爸爸之年轻退休》。 开篇作者讲了关于杠杆的意义 杠杆就是力量 人类发明的杠杆工具越来越...
    KWANN阅读 503评论 0 0
  • 我的青春与白衬衣无关 我的青春与柠檬草的清香无关 我的青春与午后的阳光无关 理所当然 也与你无关
    打勾阅读 185评论 0 1