tnblog
首页
视频
资源
登录

abp中文件下载,将内存数据导出到Excel并下载

3312人阅读 2022/4/11 15:39 总访问:1056306 评论:0 收藏:0 手机
分类: ABP

1.数据导出为Excel的Stream

using System;
using System.Collections.Generic;
using System.IO;
using Abp.Collections.Extensions;
using OfficeOpenXml;
using System.Web;
using Abp.Web.Models;

namespace Common.Exporting
{
    public static class ExcelExporter<T>
    {
        /// <summary>
        /// 导出Excel文件
        /// </summary>
        /// <returns></returns>
        public static AjaxResponse GetFileResponse(string fileName, string sheetName, IList<T> dtoList, string[] header, Func<T, object>[] propertySelectors)
        {
            AjaxResponse res = new AjaxResponse();
            try
            {
                byte[] data = ExportExcelStream(sheetName, dtoList,header, propertySelectors);

                var Response = HttpContext.Current.Response;
                Response.ContentType = "applicationnd.ms - excel";
                Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
                Response.Clear();
                Response.BinaryWrite(data);
                Response.End();

                res.Success = true;
            }
            catch (Exception ex)
            {
                res.Success = false;
                res.Error = new ErrorInfo();
                res.Error.Code = 500;
                res.Error.Message = "导出数据错误";
                res.Error.Details = ex.ToString();
            }

            return res;
        }

        public static byte[] ExportExcelStream(string sheetName, IList<T> dtoList, string[] header, Func<T, object>[] propertySelectors)
        {
            return CreateExcelStream(
                    excelPackage =>
                    {
                        var sheet = excelPackage.Workbook.Worksheets.Add(sheetName);
                        sheet.OutLineApplyStyle = true;
                        AddHeader(sheet, header);
                        AddObjects(sheet, 2, dtoList, propertySelectors);

                        for (var i = 1; i <= header.Length; i++)
                        {
                            sheet.Column(i).AutoFit();
                        }
                    });
        }

        public static byte[] CreateExcelStream(Action<ExcelPackage> creator)
        {
            using (var excelPackage = new ExcelPackage())
            {
                creator(excelPackage);
                MemoryStream ms = new MemoryStream();
                excelPackage.SaveAs(ms);
                return ms.GetBuffer();
            }
        }

        public static void AddHeader(ExcelWorksheet sheet, params string[] headerTexts)
        {
            if (headerTexts.IsNullOrEmpty())
            {
                return;
            }

            for (var i = 0; i < headerTexts.Length; i++)
            {
                AddHeader(sheet, i + 1, headerTexts[i]);
            }
        }

        public static void AddHeader(ExcelWorksheet sheet, int columnIndex, string headerText)
        {
            sheet.Cells[1, columnIndex].Value = headerText;
            sheet.Cells[1, columnIndex].Style.Font.Bold = true;
        }

        public static void AddObjects<T>(ExcelWorksheet sheet, int startRowIndex, IList<T> items, params Func<T, object>[] propertySelectors)
        {
            if (items.IsNullOrEmpty() || propertySelectors.IsNullOrEmpty())
            {
                return;
            }

            for (var i = 0; i < items.Count; i++)
            {
                for (var j = 0; j < propertySelectors.Length; j++)
                {
                    sheet.Cells[i + startRowIndex, j + 1].Value = propertySelectors[j](items[i]);
                }
            }
        }
    }
}

2.在ABP的AppServer应用服务层调用:

/// <summary>
        /// 导出列表到Excel
        /// </summary>
        /// <param name="search">查询条件对象</param>
        public AjaxResponse ExportListToExcel(ContractSearch search)
        {
            int rowCount = 0;
            List<ContractList> dtoList = Search(search, out rowCount, false);
            string fileName = "List.xlsx";
            string sheetName = "列表";
            const int columnCount = 11;
            string[] header = new string[columnCount] { "签订日期", "编号", "价格", "付款方式", "执行期", "状态", "负责人" };
            Func<ContractList, object>[] propertySelectors = new Func<ContractList, object>[columnCount] {
                new Func<ContractList, object>(l => l.SignDateString),
                new Func<ContractList, object>(l => l.Code),
                new Func<ContractList, object>(l => l.CoalType),
                new Func<ContractList, object>(l => l.TotalNumber),
                new Func<ContractList, object>(l => l.TotalAmount),
                new Func<ContractList, object>(l => l.PayMethods),
                new Func<ContractList, object>(l => l.ValidPeriod),
                new Func<ContractList, object>(l => l.ContractStatusName),
                new Func<ContractList, object>(l => l.AdminName)
            };
            return ExcelExporter<ContractList>.GetFileResponse(fileName, sheetName, dtoList, header, propertySelectors);
        }

转载:https://www.cnblogs.com/xytmj/p/7607110.html

评价
没有个性,不需要签名
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
欢迎加群交流技术