You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core Web API导出Excel仅导出当前页问题求助

问题原因

你的导出方法ExportMandateToExcelAsync调用了GetMandateAsync,而GetMandateAsync内部会执行分页逻辑(通过PaginationAsync方法),所以不管搜索结果有多少条,只会返回当前页的最多10条数据,导致Excel仅导出当前页内容。

解决方案

需要修改导出逻辑,直接获取所有符合过滤条件的数据,跳过分页步骤。以下两种方式均可实现:

方式1:新增全量数据获取方法(推荐)

步骤1:在仓储层新增方法

在仓储中添加方法,返回经过过滤和排序后的所有数据:

public async Task<IEnumerable<Mandate>> GetAllMandatesAsync(PagingFilter filter)
{
    var query = await GetMandateQueryAsync(filter);
    return await query.ToListAsync();
}

步骤2:修改服务层导出方法

修改ExportMandateToExcelAsync,跳过分页逻辑直接获取全量数据:

public async Task<Response<byte[]>> ExportMandateToExcelAsync(PagingFilter filter)
{
    try
    {
        // 获取所有符合过滤条件的数据,跳过分页
        var mandates = await _unitOfWork.MerchantMandates.GetAllMandatesAsync(filter);
        // 映射为MandateListDto
        var auditReports = _mapper.Map<IEnumerable<MandateListDto>>(mandates);

        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
        var excelPackage = new ExcelPackage();
        var worksheet = excelPackage.Workbook.Worksheets.Add("Mandate Reports");

        // 标题设置
        var title = "Reports";
        var titleCell = worksheet.Cells["A1:K1"];
        titleCell.Merge = true;
        titleCell.Value = title;
        titleCell.Style.Font.Size = 16;
        titleCell.Style.Font.Bold = true;
        titleCell.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
        titleCell.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
        titleCell.Style.Fill.PatternType = ExcelFillStyle.Solid;
        titleCell.Style.Fill.BackgroundColor.SetColor(Color.LightGray);

        // 表头设置
        var headers = new List<string>
        {
            "S.No.",
            "Merchant Name",
            "Reference Number",
            "Customer Account No.",
            "Branch",
            "Payment Frequency",
            "Start Date",
            "End Date",
            "Amount",
            "Approval Status",
            "Action Date"
        };
        for (int i = 0; i < headers.Count; i++)
        {
            worksheet.Cells[2, i + 1].Value = headers[i];
            worksheet.Cells[2, i + 1].Style.Font.Bold = true;
            worksheet.Cells[2, i + 1].Style.Fill.PatternType = ExcelFillStyle.Solid;
            worksheet.Cells[2, i + 1].Style.Fill.BackgroundColor.SetColor(Color.LightGray);
        }

        // 填充数据行
        var row = 3;
        var serialNumber = 1;
        foreach (var report in auditReports)
        {
            worksheet.Cells[row, 1].Value = serialNumber;
            worksheet.Cells[row, 2].Value = report.Merchant.MerchantName;
            worksheet.Cells[row, 3].Value = report.ReferenceNumber;
            worksheet.Cells[row, 4].Value = report.DrAccountNumber;
            worksheet.Cells[row, 5].Value = report.BankBranch.BranchName;
            worksheet.Cells[row, 6].Value = report.PaymentFrequency;
            worksheet.Cells[row, 7].Value = report.StartDate.Date.ToString("dd-MMM-yyyy");
            worksheet.Cells[row, 8].Value = report.EndDate.Date.ToString("dd-MMM-yyyy");
            worksheet.Cells[row, 9].Value = report.Amount.ToString("N2");
            worksheet.Cells[row, 10].Value = report.MandateApprovalStatus;
            worksheet.Cells[row, 11].Value = report.CreatedAt?.ToString("dd-MMM-yyyy") ?? string.Empty;

            row++;
            serialNumber++;
        }

        // 自动适配列宽
        worksheet.Cells.AutoFitColumns();

        var excelBytes = excelPackage.GetAsByteArray();

        return new Response<byte[]>()
        {
            StatusCode = (int)HttpStatusCode.OK,
            Successful = true,
            Data = excelBytes,
            Message = "Successful.",
            ResponseCode = EnumResponseCodes.SUCCESS.GetStringValue(),
            ResponseDescription = EnumResponseCodes.SUCCESS.ToString()
        };
    }
    catch (Exception ex)
    {
        _logger.Error(ex, "An error occurred.");
        return new Response<byte[]>()
        {
            StatusCode = (int)HttpStatusCode.InternalServerError,
            Successful = false,
            Message = "An error occurred.",
            ResponseCode = EnumResponseCodes.FAILED.GetStringValue(),
            ResponseDescription = EnumResponseCodes.FAILED.ToString()
        };
    }
}

方式2:临时修改分页参数(快速实现)

如果不想新增仓储方法,可以在导出时临时将分页参数设置为总记录数,强制获取所有数据:

public async Task<Response<byte[]>> ExportMandateToExcelAsync(PagingFilter filter)
{
    try
    {
        // 先获取符合条件的总记录数
        var query = await _unitOfWork.MerchantMandates.GetMandateQueryAsync(filter);
        var totalRecords = await query.CountAsync();
        
        // 构建导出专用的过滤参数,设置PageSize为总记录数
        var exportFilter = new PagingFilter
        {
            SearchQuery = filter.SearchQuery,
            StartDate = filter.StartDate,
            EndDate = filter.EndDate,
            SortBy = filter.SortBy,
            IsSortAscending = filter.IsSortAscending,
            PageNumber = 1,
            PageSize = totalRecords
        };
        
        var auditReportsResponse = await GetMandateAsync(exportFilter);
        var auditReports = auditReportsResponse.Data.PageItems;

        // 后续Excel生成逻辑保持不变...
    }
    catch (Exception ex)
    {
        // 异常处理逻辑保持不变...
    }
}
注意事项
  • 如果数据量极大(如上万条),直接导出全量数据可能引发内存过高问题,建议添加数据量限制,或实现异步分批导出逻辑。
  • 确保_mapper.Map能正确完成Mandate到MandateListDto的对象映射。

内容的提问来源于stack exchange,提问作者Ayobamilaye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:04:50