c# 导出复杂excel ,合并单元格

C# DataTable 导出 Excel 进阶 多行表头、合并单元格、中文文件名乱码 本文原创地址:http://blog.csdn.net/ranbolwb/article/details/8083983 ,转载请保留本行。 本例子是上一篇 DataTable 导出 Excel 的进阶,除了上一篇提到的处理乱码问题,本例还添加了处理多行表头、合并单元格的功能及处理中文文件名乱码问题,应该可以满足日常开发的需要了。 废话不多说了,直接上代码: using System; 阅读详情

今天做了一个关于订单得导出得,一个订单一般都是多个商品,那么就会出现单元格合并得情况,还有复杂表头得情况,现在拿我做得,给大家一个小demo

先看最终效果

后台实现:

代码:

 [HttpGet]
        [ValidateInput(false)]
        public ActionResult Order_Export()
        {
            int showType;
            int ws_userid;
            int.TryParse(Request["ws_userid"], out ws_userid);
            int.TryParse(Request["showType"], out showType);

            string keywords = Request["keywords"];

            string starttime = Request["starttime"];
            string endtime = Request["endtime"];
            ws_orderManager ws_OrderManager = new ws_orderManager();
            string fileName = "订单导出";
            int count = 0;
            var data = ws_OrderManager.GetOrderExportList(showType, ws_userid, keywords, 1, 1000, starttime, endtime, ref count);

            switch (showType)
            {
                case 1:
                    fileName += "-待付款";
                    break;
                case 2:
                    fileName += "-待发货";
                   
                    break;
                case 3:
                    fileName += "-待收货";
                    
                    break;
                case 4:
                    fileName += "-交易成功";
                    
                    break;
                case -1:
                    fileName += "-交易关闭";
                    
                    break;
                default:
                    fileName += "-全部订单";
                    
                    break;
            }
            if (!string.IsNullOrWhiteSpace(starttime) && !string.IsNullOrWhiteSpace(endtime))
            {
                fileName += "-" + starttime + "——" + endtime;
            }
            return ExportFundDataToExcel(data, fileName);
        }

 
public ActionResult ExportFundDataToExcel(List<OrderViewModel> listData, string filename)
        {
            var fileHtml = getFundDataCollect(listData, filename);
            if (fileHtml == "")
            {
                return Json(JsonHelper.LayuiRsulit("当前没有数据需要导出", false));
            }
            byte[] fileContents = Encoding.UTF8.GetBytes(fileHtml);
           
            return File(fileContents, "application/ms-excel; charset=UTF8", filename + ".xls");
        }
        public string AddExcelbottom()
        {

            StringBuilder sb = new StringBuilder();

            sb.Append("</body>");

            sb.Append("</html>");

            return sb.ToString();

        }
        public string AddExcelHead()
        {

            StringBuilder sb = new StringBuilder();

            sb.Append("<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\">");

            sb.Append(" <head>");

            sb.Append(" <!--[if gte mso 9]><xml>");

            sb.Append("<x:ExcelWorkbook>");

            sb.Append("<x:ExcelWorksheets>");

            sb.Append("<x:ExcelWorksheet>");

            sb.Append("<x:Name></x:Name>");

            sb.Append("<x:WorksheetOptions>");

            sb.Append("<x:Print>");

            sb.Append("<x:ValidPrinterInfo />");

            sb.Append(" </x:Print>");

            sb.Append("</x:WorksheetOptions>");

            sb.Append("</x:ExcelWorksheet>");

            sb.Append("</x:ExcelWorksheets>");

            sb.Append("</x:ExcelWorkbook>");

            sb.Append("</xml>");

            sb.Append("<![endif]-->");

            sb.Append(" </head>");

            sb.Append("<body>");

            return sb.ToString();



        }
        public string getFundDataCollect(List<OrderViewModel> dt, string taskname)
        {

            if (null == dt)
            {
                return "";
            }
            if (dt.Count < 1)
            {
                return "";
            }
            var fileHtml = new StringBuilder();
            fileHtml.Append(AddExcelHead());
            fileHtml.Append("<table border=\"1\" style=\"table-layout:fixed;\" cellspacing='0' cellpadding='0'>");
            fileHtml.Append("<tr>");
            fileHtml.Append("<td colspan=\"9\" style=\"font-size: 16px; font-family: 宋体; text-align: center; height: 30px;\">");
            fileHtml.AppendFormat(" <strong> {0}</strong>", taskname);
            fileHtml.Append("</td>");
            fileHtml.Append(" </tr>");

            fileHtml.Append("<tr>");
            
            fileHtml.Append("<td>订单号</td>" );

            fileHtml.Append("<td>下单时间</td>");
            fileHtml.Append("<td>商品名称</td>");
            fileHtml.Append("<td>商品数量</td>");
            fileHtml.Append("<td>商品SKU</td>");
            fileHtml.Append("<td>总金额</td>");
            fileHtml.Append("<td>收货人</td>");
            fileHtml.Append("<td>收货电话</td>");
            fileHtml.Append("<td>收货地址</td>");
            fileHtml.Append(" </tr>");
          
            for (var j = 0; j < dt.Count; j++)
            {
                fileHtml.Append("<tr>");

                fileHtml.AppendFormat("<td rowspan=\"{0}\" style=\"text-align: center;\">'{1}</td>",dt[j].goodsList.Count, dt[j].order_sn);
                fileHtml.AppendFormat("<td rowspan=\"{0}\" style=\"text-align: center;\">'{1}</td>", dt[j].goodsList.Count, dt[j].add_time);
                StringBuilder nextStr = new StringBuilder();
               
                if(dt[j].goodsList.Count == 1)
                {
                    
                    fileHtml.AppendFormat("<td  style=\"text-align: center;\">{0}</td>", dt[j].goodsList[0].goods_name);
                    fileHtml.AppendFormat("<td  style=\"text-align: center;\">{0}</td>", dt[j].goodsList[0].number);
                    fileHtml.AppendFormat("<td  style=\"text-align: center;\">{0}</td>", dt[j].goodsList[0].goods_specifition_name_value);
                }
                else
                {
                   
                    fileHtml.AppendFormat("<td  style=\"text-align: center;\">{0}</td>", dt[j].goodsList[0].goods_name);
                    fileHtml.AppendFormat("<td  style=\"text-align: center;\">{0}</td>", dt[j].goodsList[0].number);
                    fileHtml.AppendFormat("<td  style=\"text-align: center;\">{0}</td>", dt[j].goodsList[0].goods_specifition_name_value);
                   
                    for (int i = 1; i < dt[j].goodsList.Count; i++)
                    {
                        nextStr.Append("<tr>");
                        nextStr.AppendFormat("<td  style=\"text-align: center;\">{0}</td>", dt[j].goodsList[i].goods_name);
                        nextStr.AppendFormat("<td  style=\"text-align: center;\">{0}</td>", dt[j].goodsList[i].number);
                        nextStr.AppendFormat("<td  style=\"text-align: center;\">{0}</td>", dt[j].goodsList[i].goods_specifition_name_value);
                        nextStr.Append("</tr>");
                    }
                   
                }
               
                fileHtml.AppendFormat("<td rowspan=\"{0}\" style=\"text-align: center;\">{1}</td>", dt[j].goodsList.Count, dt[j].actual_price);
                fileHtml.AppendFormat("<td rowspan=\"{0}\" style=\"text-align: center;\">{1}</td>", dt[j].goodsList.Count, dt[j].name);
                fileHtml.AppendFormat("<td rowspan=\"{0}\" style=\"text-align: center;\">{1}</td>", dt[j].goodsList.Count, dt[j].mobile);
                fileHtml.AppendFormat("<td rowspan=\"{0}\" style=\"text-align: center;\">{1}</td>", dt[j].goodsList.Count, dt[j].ProvinceName + dt[j].CityName + dt[j].DistrictName + dt[j].address);
                fileHtml.Append("</tr>");
                fileHtml.Append(nextStr.ToString());

            }
           
            fileHtml.Append("</table>");
            fileHtml.Append(AddExcelbottom());
            return fileHtml.ToString();
        }

我得数据结构是这样得:

最外层是订单信息,里面有一个数组,goodsList,这个是订单中得商品

前台请求,这样访问:

window.location='/@ViewContext.RouteData.DataTokens["area"]/@ViewContext.RouteData.Values["controller"].ToString()/Order_Export?page=1&limit=9999999&showType=' + showType+'&keywords='+$("#keywords").val() + '&starttime='+$("#starttime").val()+'&endtime=' + $("#endtime").val();

这样就会自动进行下载了,欢迎各位评论!

C# 常用Excel导出的几种常见方式及实现步骤 在C#中,常用的Excel 文件导出方式包括:使用 Microsoft Office Interop Excel 组件,使用 NPOI 组件导出 Excel 文件,使用 EPPlus 组件导出Excel文件,使用 ClosedXML 组件导出 Excel 文件四种常用方式,以下仅根据这四种Excel导出方式展开介绍其实现步骤,并列举出示例代码,仅供大家学习参考,欢迎大家留言 阅读详情

相关推荐

2019年07月09日 NPOI导出Excel(C#,.NET)

NPOI导出Excel(C#,.NET) 前言   需求:使用NPOI导出Excel   技术: NPOI   语言: C# .NET MVC 代码 (注:下面的代码无法复制正常运行,需进行对应业务绑定后方可执行) //NPOI导出,核心功能 public static XSSFWorkbook npoiGetExcelContent() { //重点! XSSFWorkbook 操作 Of...

糊里糊涂的小码农的博客 529

NPOI简单示例

导出常用方法示例(使用该方法时需先引入NPOI.dll文件): /// <summary> /// 导出基本操作示例方法 /// </summary> public static void ExportExcel() { try { //...

weixin_30908707的博客 330

C#语言实现快速Excel导出教程

本文还有配套的精品资源,点击获取 简介:本文详细介绍了使用C#结合NPOI库来实现Excel文件快速导出的步骤。NPOI是一个.NET平台上的开源库,支持读写Microsoft Office文件格式,尤其适用于不需要安装Office的服务器端环境。文章提供了一个基本流程,涵盖创建Excel工作簿、添加工作表、设置数据、读取DataTable以及写入文件等操作。同时,提及了在...

weixin_34535286的博客 1201

C#DataTable导出Excel,并实现合并单元格

asp.net webwofrm后台代码----------建议Framework4.0及以上,3.5试过出现好多莫名错误... 首先导入两个程序集。我的是 office2003,引用的COM里面的Microsoft.office.Interop.Excel 14.0 和 程序集里的Microsoft Excel 12.0 Object Library。有多个版本,根据自己的of...

dia6934的博客 969

2026开源API网关横评:微服务与AI流量治理如何选型

API网关作为微服务架构的流量入口,承担着路由转发、安全管控、限流熔断等核心职责,是分布式系统治理的基础设施。随着大模型应用的普及,AI流量对网关提出了新的要求,如流式响应支持、Token级限流、多模型路由和成本分账等能力。传统网关通过插件拼凑AI功能,而AI原生网关则将这些能力内建。面对众多开源方案,如何根据业务场景做出合理选型?本文对Kong、APISIX、Higress、Envoy Gateway、MAI Gateway等主流开源API网关进行横向评测,从性能、动态性、K8s集成度、AI流量治理等维度

weixin_34242819的博客 482

Mumax3代码模板:从基础设置到材料参数优化

本文提供了一份详尽的Mumax3微磁学模拟代码模板,从基础网格设置、边界条件到核心材料参数(如钴的Msat、Aex、Ku1)配置与优化均有涵盖。文章深入解析了特征长度计算、初始化方法、弛豫与动力学模拟流程,并分享了并行计算与参数扫描等效率提升技巧,旨在帮助用户快速上手并优化模拟工作流。

moss5的博客 702

C#.netCore导出Excel,带合并单元格自定义字体样式支持导出文件格式后缀为.xlsx

本次Excel数据导出优点: 可以自由编辑 合并Excel单元格。 导出的Excel文件可以是.xlsx后缀,不比必须是.xls(原来的那个如果导出的文件是.xlsx后缀会报数据格式错误,导致无法正常打开文件,,必须改为.xls才可以)。 可以自由添加多个标签页。 可以自由设计导出数据的字体样式单元格大小和边框等。 其余优点咱们使用者自行发觉。

阿浩丫的博客 1701

智能枕头

睡觉和吃饭是一样重要的,一个人想要健康的体魄,不仅要饮食得当,更需要有一个好的睡眠质量。随着人们生活品质的提高,人们对于睡眠的要求越来越高,那么就非常需要一款舒适的枕头。为了适应市场的需求,我爱物联网推出了智能枕头。因为智能枕头可以给头部及颈椎一个良好的承托力,舒适、柔软、放松,让人更好的进入睡眠。 目录 一、智能枕头方案介绍 二、智能枕头的优点 三、智能枕头功能介绍 四、智能枕头APP开发 五、...

6108我爱物联网方案开发优快云博客 3660

C#导出Excel

    本教程可以实现在C#中导出Excel表格,并且设置Excel多级表头的情况。     简单来说,是在MemoryStream中进行的操作。     只提供一部分实现代码,具体需要的api或者方法请自行百度。 1 //引用 2 3 using Aspose.Cells; 4 5   protected MemoryStream...

weixin_30425949的博客 136

GD32F303开发实战(一):从零搭建MDK工程与时钟配置详解

本文详细介绍了如何从零开始为GD32F303微控制器搭建一个清晰、可维护的MDK工程模板。内容涵盖开发环境准备、工程目录结构规划、文件分组管理、关键工程配置,并重点解析了时钟树原理,手把手指导配置108MHz系统时钟。通过实战步骤与常见问题排查,帮助开发者构建一个稳定可靠的开发基础,便于后续功能扩展。

weixin_29174141的博客 270

Claude Code 官方文档+3 个高活跃社区+5 个可复用开源项目:14.4 节持续学习资源实测清单

揭示 Claude Code 的核心交互范式是「状态机驱动的对话式编程」,强调官方文档实为配置契约、社区是直觉验证场、开源项目是配置能力校准器;通过真实故障案例解析上下文丢失根源,提出以工程化方式管理 claude.config.json、CLAUDE.md 和技能配置。

weixin_28728443的博客 326

C# 中Excel导出,可以自由设置导出的excel格式

Excel导出,不管在java,C#等后台语言,或者是javascrit,jquery等脚本语言,有很多种方式都可以将查出的数据导成excel的格式。我这次是从公司的一个同事那里学来的一个方法。是有关C#的winform的程序的。我们在实际应用中,是将导出的数据进行了复杂的处理,进行了合并单元格,处理单元格的边框,excel显示的字体,颜色,样式等等,都在导出excel的过程中用到了,而且导...

weixin_34032792的博客 332

第20期-英伟达笔试题型解析

英伟达作为AI领域的缔造者及硬件基石,是这几年最为炙手可热的公司。英伟达以其高性能GPU设计闻名,硬件工程师岗位的招聘通常包括笔试和技术面试,考察领域涵盖数字电路设计、处理器架构、嵌入式系统和信号处理等。通过搜索公开平台,收集了候选人的面试经历和相关技术问题,,通过分析公开平台收集的笔试面试经验,结合英伟达的GPU架构特点,整理出可能涉及的典型题目,并提供详细解析。 以下是基于英伟达(Nvidia)硬件工程师笔试题型的解析与总结,涵盖核心知识点、解题思路及案例分析。

启芯硬件的博客 746

C# NPOI复杂表头导出

C# NPOI复杂表头导出

个人记录 1312

合肥工业大学操作系统实验9

依据操作系统课程所介绍的页面置换算法与动态内存分配的原理,本实验的目的是掌握OPT、FIFO、LRU、LFU、Clock等页面置换算法;掌握可用空间表及分配方法;掌握边界标识法以及伙伴系统的内存分配方法和回收方法。从而深入理解操作系统的内存管理。从而加深对教材上页面置换算法与动态内存分配的理解。

Martin-share的博客 1094

【win10】win 10 电脑喇叭音频显示红叉的处理方法

目录 一、报错情况 二、“音频服务未运行”解决方法 三、“未插入扬声器或耳机”解决方法 一、报错情况 (1)当电脑的扬声器喇叭图标上带有红X符号,提示“音频服务未运行”时: (2)小喇叭上面有红叉,显示“未插入扬声器或耳机”时: 二、“音频服务未运行”解决方法 (1)开始菜单搜索“服务”: (2)没有启动的点击“启动”,已启动的点击“重新启动”: (3)继续,右...

顾三殇 —— 博客空间(软件测试) 17万+

ASP.NET导出到EXCEL(控件式样)

导出到excel

k195514239的博客 1431

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

c#后台如何导出excel到本地_惊了!如何通过阿里 EasyExcel 7 行代码, 优雅地实现 Excel 文件导出功能?...

目录一、前言二、Apache poi、jxl 的缺陷三、阿里出品的 EasyExcel,安利一波四、EasyExcel 解决了什么五、快速上手六、特殊场景支持七、Web 下载示例代码八、需要注意的点九、总结一、前言关于导出 Excel 文件,可以说是大多数服务中都需要集成的功能。那么,要如何优雅快速地(偷懒地)去实现这个功能呢?你可能第一想法是:这还不简单?用 Apache 开源框架 p...

weixin_39860946的博客 1059

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

后台数据转化成execl

#region 将数据表保存到Excel表格中 /// <summary> /// 将数据表保存到Excel表格中 /// </summary> /// <param name="addr">Excel表格存放地址</param> ...

weixin_30512043的博客 105

ASP.net(C#)导出Excel----普通表头,多层表头。

在工作中,使用ASP.net(C#)从页面上导出Excel文件。要求是复杂表头 所以就试了几种方法,列出来供大家参考: 第一种方法呢,主要针对简单的Excel的导出,只有一行列名和数据。 在页面上,有一个导出的按钮。下面只写出按钮事件的代码: [csharp] view plain copy try  {      System.Data.DataTable t

u010953586的博客 2292

NPOI 导出模板Excel winform

NPOI.dll 下载地址:http://files.cnblogs.com/MyLBlogs/NPOI.zip 因最近做的两个项目里面都用到了NPOI 导出模板Excel ,不胜厌烦,所以在这里简略写一下有关 NPOI导出Excle NPOI 导出模板Excel 好处:用模板来导出Excel 方便,快捷,易维护。 c# winform 与 asp.net 导出Excel 不同之处在于...

weixin_34321977的博客 312

POI合并单元格后边框显示问题

POI合并单元格后边框显示问题 最近在做导出Excel报表业务. 牵扯到一个复杂表头… 首先我分成3层来为表头数据装配样式. 但是两大行中因为牵扯到一个合并问题,没有附上边框, 之后也百度了前辈们总结的经验, 附上代码: //合并单元格添加边框 解决合并单元格后没有边框 CellRangeAddress cellAddrss = new CellRangeAddress(startr...

weixin_42635705的博客 2833

【NPOI】导出Excel复杂表格并支持导出图片

cell.CellStyle = GetContentrStyle(wb, Stylexls.默认);icell1top0.CellStyle = GetCellStyle(wb, Stylexls.头);icell1top.CellStyle = GetCellStyle(wb, Stylexls.头);icell3top.CellStyle = GetCellStyle(wb, Stylexls.头);

beeter1的博客 2033

NPOI导出Excel及使用问题

因为最近公司质管部门提出了一个统计报表的需求:要求导出一个2016及2017年度深圳区域的所有供应商的费用成本计算——一个22列的Excel表,其中还包括多列的合并单元格;说实话,统计报表功能其实我还是很少涉及的,以前都是直接用DataTable+输出流导出Excel,因为涉及到合并单元格,明显用输出流就不合适了,此时NPOI开源框架就很合适了;当然还有其他组件可以选择,比如,微软自带组件,以及收费的;因为资料比较多且公司用的组件也是这个,所以就选择它了;

极客神殿 747

导出excel 手动拼装复杂表头

导出excel的时候,需要自己设计复杂表头,如下: 首先理解下表格的位置,二维的,从0开始,依次增加。 表格1:理解表格的位置 红色表示单个的位置 合并语法: new CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol); 为合并单元格操作方式, 四个参数分别是:起始行,结束行,起始列,结束列 。 如果是单个的,不用设置CellRangeAddress,不然会报错的 只要设置需要..

qq_58148854的博客 1626
上一篇: artDialog弹出框使用
下一篇: sql server 查询,表中有多少条重复记录
Little_Code
博客等级 码龄10年 62粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值