前言

之前说了导入和导出,也提供了自定义的表模的导入,可见LinqToExcel可以做的事情不仅仅如此

这次我们来演示比较复杂的导出Excel,导出复杂的Excel与导入复杂的Excel原理基本是一样的!

所以本节来演示如何使用ClosedXML来导入复杂的Excel

一起来看一个例子

注:信息量偏少,但是原理是一样的,你再复杂的Excel表都只是那几个操作方式。

分析

从图中可以看出有几个知识点:

  • 1.创建作业本
  • 2.添加工作簿(信息表,可以同时导出多个sheet)
  • 3.添加标题(合并列)
  • 4.填充数据(制定填充或者列表填充,列表填充参考简单导出一节)
  • 5.格式化数据(格式化销售额为美元)
  • 6.计算平均值(销售额平均值)

看起来很困难,但是ClosedXML都帮我们做好了,具体如下:

  • 1.对指定单元格进行和并
  • 2.格式化化数据(可以格式化日期,数字,自定义格式应有尽有,非常方便)
  • 3.计算(可以对范围的值进行求和,求平均,求条数,求最大小值等等,异常方便)
  • 4.设置Excel的各种样式(边框,单元格颜色,宽度等等)

说到底:ClosedXML能输出你任何想定制的格式给客户《客户看了都说好》

实现方式

1.创建作业本

var wb = new XLWorkbook();

2.添加工作簿(信息表,可以同时导出多个sheet)

 var ws = wb.Worksheets.Add("信息表");

3.添加标题

 ws.Cell("B2").Value = "联系人信息表";

4.填充数据

   //姓名
            ws.Cell("B3").Value = "姓名";
            ws.Cell("B4").Value = "牛掰掰";
            ws.Cell("B5").Value = "很多岁";
            ws.Cell("B6").SetValue("光头强");  //另一种值得设置方式

            //性别
            ws.Cell("C3").Value = "性别";
            ws.Cell("C4").Value = "女";
            ws.Cell("C5").Value = "男";
            ws.Cell("C6").SetValue("未知"); 

            // 年龄
            ws.Cell("D3").Value = "年龄";
            ws.Cell(;
            ws.Cell(;
            ws.Cell();

            //电话
            ws.Cell("E3").Value = "电话";
            ws.Cell(";
            ws.Cell(";
            ws.Cell("); 

            //金额
            ws.Cell("F3").Value = "本季度销售业绩";
            ws.Cell(";
            ws.Cell(";
            ws.Cell("); 

5.合并标题的列

 var rngTable = ws.Range("B2:F6");

6.格式化数据

 var rngNumbers = rngTable.Range("E3:E5"); rngNumbers.Style.NumberFormat.Format = "$ #,##0";

取得销售额一列,并进行格式化,前面加个$的符号和,其他格式,参考官方文档

7.输出表格到Excel的位置

var rngData = ws.Range("B3:F6");
var excelTable = rngData.CreateTable();

注意:这是要输出出到Excel中的位置

8.调整内容的宽度

ws.Columns().AdjustToContents(); 

9.保存Excel表(或者直接用流的方式输出给用户下载)

wb.SaveAs("ExcelSample.xlsx");
  var wb = new XLWorkbook();
            var ws = wb.Worksheets.Add("信息表");
            ws.Cell("B2").Value = "联系人信息表";
            //姓名
            ws.Cell("B3").Value = "姓名";
            ws.Cell("B4").Value = "牛掰掰";
            ws.Cell("B5").Value = "很多岁";
            ws.Cell("B6").SetValue("光头强");  //另一种值得设置方式
            //性别
            ws.Cell("C3").Value = "性别";
            ws.Cell("C4").Value = "女";
            ws.Cell("C5").Value = "男";
            ws.Cell("C6").SetValue("未知");
            // 年龄
            ws.Cell("D3").Value = "年龄";
            ws.Cell(;
            ws.Cell(;
            ws.Cell();
            //电话
            ws.Cell("E3").Value = "电话";
            ws.Cell(";
            ws.Cell(";
            ws.Cell("); 

            //金额
            ws.Cell("F3").Value = "本季度销售业绩";
            ws.Cell(";
            ws.Cell(";
            ws.Cell(");
            var rngTable = ws.Range("B2:F6");

            var rngDates = rngTable.Range("D3:D5");
            var rngNumbers = rngTable.Range("E3:E5");

            rngNumbers.Style.NumberFormat.Format = "$ #,##0";
            rngTable.FirstCell().Style
                .Font.SetBold()
                .Fill.SetBackgroundColor(XLColor.AppleGreen)
                .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
            rngTable.FirstRow().Merge(); 

            var rngHeaders = rngTable.Range("A2:E2");
            rngHeaders.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
            rngHeaders.Style.Font.Bold = true;
            rngHeaders.Style.Font.FontColor = XLColor.DarkBlue;
            rngHeaders.Style.Fill.BackgroundColor = XLColor.Aqua;
            var rngData = ws.Range("B3:F6");
            var excelTable = rngData.CreateTable();

            excelTable.ShowTotalsRow = true;

            excelTable.Field("本季度销售业绩").TotalsRowFunction = XLTotalsRowFunction.Average;

            excelTable.Field("电话").TotalsRowLabel = "平均值:";

            ws.RangeUsed().Style.Border.OutsideBorder = XLBorderStyleValues.Thick;

            ws.FirstColumn().Style.Border.LeftBorder = XLBorderStyleValues.Thick;
            ws.LastColumn().Style.Border.RightBorder = XLBorderStyleValues.Thick;
            ws.FirstRow().Style.Border.TopBorder = XLBorderStyleValues.Thick;
            ws.LastRow().Style.Border.BottomBorder = XLBorderStyleValues.Thick;

完整代码

效果如图:

总结

基本上所有场景都在代码展示,再复杂的导出我们应该都能拼凑出来!有问题我们留言探讨一下

下载代码:动起手来,稳固知识

链接:http://pan.baidu.com/s/1pL30drd 密码:1yrc

---------------------------------------------------

参考代码:https://github.com/closedxml/closedxml

ASP.NET MVC5+EF6+EasyUI 后台管理系统(88)-Excel导入和导出-自定义表模导出的更多相关文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(44)-工作流设计-设计表单

    系列目录 设计表单是比较复杂的一步,完成一个表单的设计其实很漫长,主要分为四步. 开始之前先说说表的结构. 其实表Flow_Form与Flow_FormContent设计是有一个缺陷的.我总共是设置最 ...

  2. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(转)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库 您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB 升级后界面效果如下: 日程管理   http://ww ...

  3. ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-前言与目录(持续更新中...)

    开发工具:VS2015(2012以上)+SQL2008R2以上数据库  您可以有偿获取一份最新源码联系QQ:729994997 价格 666RMB  升级后界面效果如下: 任务调度系统界面 http: ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入

    系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统-WebApi的用法与调试

    1:ASP.NET MVC5+EF6+EasyUI 后台管理系统(1)-WebApi与Unity注入 使用Unity是为了使用我们后台的BLL和DAL层 2:ASP.NET MVC5+EF6+Easy ...

  6. ASP.NET MVC5+EF6+EasyUI 后台管理系统(51)-系统升级

    系统很久没有更新内容了,期待已久的更新在今天发布了,最近花了2个月的时间每天一点点,从原有系统 MVC4+EF5+UNITY2.X+Quartz 2.0+easyui 1.3.4无缝接入 MVC5+E ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(88)-Excel导入和导出-主从表结构导出

    前言 前面一篇详细讲解了导入导出,本节演示混合结构的导出功能!同时提供代码下载.. 代码下载 vs2015+无数据库 先看效果图:这个一个混合的Excel,列表与自定义信息的混合! 我们的步骤大概分为 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(58)-DAL层重构

    系列目录 前言:这是对本文系统一次重要的革新,很久就想要重构数据访问层了,数据访问层重复代码太多.主要集中增删该查每个模块都有,所以本次是为封装相同接口方法 如果你想了解怎么重构普通的接口DAL层请查 ...

  9. ASP.NET MVC5+EF6+EasyUI 后台管理系统(34)-文章发布系统①-简要分析

    系列目录 最新比较闲,为了学习下Android的开发构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(1)-前言与,虽然有点没有目的的学习,但还是了解了Andro ...

  10. ASP.NET MVC5+EF6+EasyUI 后台管理系统(54)-工作流设计-所有流程监控

    系列目录 先补充一个平面化登陆页面代码,自己更换喜欢的颜色背景 @using Apps.Common; @{ Layout = null; } <!DOCTYPE html> <ht ...

随机推荐

  1. nginx知识点简单回顾

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  2. 怎么用SQL语句备份和恢复数据库?

    BACKUP DATABASE "mydb" TO DISK ='C:\mybak.db' with init RESTORE DATABASE "mydb" ...

  3. 我的three.js学习记录(三)

    此次的亮点不是three.js的3d部分,而是通过调用摄像头然后通过摄像头的图像变化进行简单的判断后进行一些操作.上篇中我通过简单的示例分析来学习three.js,这次是通过上一篇的一些代码来与摄像头 ...

  4. C#同步方法转异步

    public async Task DelayAsync() { await Task.Run(()=>Delay()); } private void Delay() { } 本作品采用知识共 ...

  5. 【Windows 10 应用开发】使用x:Bind标记动态获得计算结果

    UWP 在传统(WPF)的Binding标记上引入了 Bind 标记,Bind 基于编译阶段生成,因而具有较高的性能.但是,你得注意,这个性能上的优化是免去了运行阶段动态绑定的开销,这是不包括数据源的 ...

  6. 基于FFMPEG的跨平台播放器实现(二)

    基于FFMPEG的跨平台播放器实现(二) 上一节讲到了在Android平台下采用FFmpeg+surface组合打造播放器的方法,这一节讲一下Windows平台FFmpeg + D3D.Linux平台 ...

  7. pycharm快捷键(转载)

    1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + Enter 语句完成Ctrl + ...

  8. 【NOIP2015提高组】Day2 T1 跳石头

    题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不含起点和终 点的岩石).在比赛过程中,选手们将从 ...

  9. linux 生成随机密码和wordlist常用方法

    注:文章内容来自网络收集 关于下面这10个方法,估计很多人也知道了,这里也是为了自己以后用收集一下,不过顺便吐槽下,google第一页,只要是“linux 随机密码”这几个类似的关键字,蹦出来的全特么 ...

  10. Yii2之ListView小部件

    ListView是yii框架中类似GridView,也是用于展示多条数据的小部件,相比GridView,ListView可以更加灵活地设置数据展示的格式. 下面以我自己做的一个使用ListView来展 ...