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

这篇博客介绍了如何使用C#后端生成包含合并单元格和复杂表头的Excel订单导出文件。通过订单状态筛选,结合前端请求参数,实现不同状态的订单数据导出,并以HTML字符串形式生成Excel内容,最后返回给前端进行下载。
摘要由CSDN通过智能技术生成

今天做了一个关于订单得导出得,一个订单一般都是多个商品,那么就会出现单元格合并得情况,还有复杂表头得情况,现在拿我做得,给大家一个小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合并单元格,可以使用 `Microsoft.Office.Interop.Excel` 库。下面是一个示例代码,演示了如何导出一个 DataTable 并合并某些单元格: ```csharp using System; using System.Data; using System.IO; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; namespace ExcelExportDemo { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void ExportButton_Click(object sender, EventArgs e) { // 创建一个新的 Excel 应用程序实例 Excel.Application excelApp = new Excel.Application(); excelApp.Visible = false; // 创建一个工作簿并获取其工作表 Excel.Workbook workbook = excelApp.Workbooks.Add(); Excel.Worksheet worksheet = workbook.ActiveSheet; // 获取 DataTable 的列数和行数 int columnCount = dataTable.Columns.Count; int rowCount = dataTable.Rows.Count; // 写入标题行 for (int i = 0; i < columnCount; i++) { worksheet.Cells[1, i + 1] = dataTable.Columns[i].ColumnName; } // 写入数据行 for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { worksheet.Cells[i + 2, j + 1] = dataTable.Rows[i][j].ToString(); } } // 合并单元格 Excel.Range range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[1, columnCount]]; range.Merge(); // 设置合并后单元格的样式 range.Font.Size = 16; range.Font.Bold = true; range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; // 保存 Excel 文件 SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Excel 文件|*.xlsx"; saveFileDialog.Title = "保存 Excel 文件"; saveFileDialog.ShowDialog(); if (saveFileDialog.FileName != "") { workbook.SaveAs(saveFileDialog.FileName); workbook.Close(); excelApp.Quit(); MessageBox.Show("导出成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("未选择文件路径!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } ``` 在这个示例中,我们首先在标题行上合并了所有单元格,并设置了合并后单元格的样式。你可以根据需要更改合并的范围、样式等。 希望这个示例对你有所帮助!如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值