使用EPPlus与Web API导出Excel遇问题求助
问题分析与解决方案
1. Swagger要求输入参数的原因及解决
你的Export方法使用[HttpPost("Export")],且参数为OverallModel export,但代码中完全未使用该参数。Swagger会依据POST请求的参数定义,要求你传入该模型的内容。
解决方法:
- 若导出无需任何筛选/输入参数,直接改为
[HttpGet("Export")]并移除方法参数:[HttpGet("Export")] public async Task<IActionResult> Export() { // 原逻辑保留,去掉参数即可 } - 若确实需要通过POST传递筛选条件,确保
OverallModel属性有正确绑定特性(如[FromBody]),且在代码中用该参数过滤数据(例如var tasks = await _task.OverallModel.Where(t => ...).ToListAsync();)。
2. 导出失败的类型错误排查
你的代码存在一个明显语法错误,会导致文件名生成异常,进而引发导出失败:
错误点:字符串插值未生效
你写的文件名是:
string excelName = "Tasks-{DateTime.Now:yyyyMMddHHmmss}.xlsx";
这里的{DateTime.Now:...}不会被解析为当前时间,因为缺少字符串插值符号$,最终文件名会是字面量Tasks-{DateTime.Now:yyyyMMddHHmmss}.xlsx,可能导致文件处理异常。
修正为:
string excelName = $"Tasks-{DateTime.Now:yyyyMMddHHmmss}.xlsx";
其他可能的问题排查
- 数据类型兼容性:确保
OverallModel的属性(如Date、actualDate等)能正确写入Excel单元格。对于日期类型,若需格式化可手动转换:worksheet.Cells[row, 2].Value = task.Date?.ToString("yyyy-MM-dd"); - MemoryStream处理:你的代码已将
stream.Position重置为0,这是正确的,确保文件流从起始位置读取。 - MIME类型验证:返回的
File结果中,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"是xlsx格式的正确MIME类型,无需修改。
修正后的完整代码示例
[HttpGet("Export")] public async Task<IActionResult> Export() { var tasks = await _task.OverallModel.ToListAsync(); using (var package = new ExcelPackage()) { var worksheet = package.Workbook.Worksheets.Add("Sheet1"); // 表头设置 worksheet.Cells["A1"].Value = "Id"; worksheet.Cells["B1"].Value = "Date"; worksheet.Cells["C1"].Value = "Category"; worksheet.Cells["D1"].Value = "Actual Date"; worksheet.Cells["E1"].Value = "Assigned To"; worksheet.Cells["F1"].Value = "Task"; worksheet.Cells["G1"].Value = "Duration"; worksheet.Cells["H1"].Value = "Status"; worksheet.Cells["I1"].Value = "Priority"; int row = 2; foreach(var task in tasks) { worksheet.Cells[row, 1].Value = task.Id; worksheet.Cells[row, 2].Value = task.Date; worksheet.Cells[row, 3].Value = task.category; worksheet.Cells[row, 4].Value = task.actualDate; worksheet.Cells[row, 5].Value = task.assignedTo; worksheet.Cells[row, 6].Value = task.task; worksheet.Cells[row, 7].Value = task.timeTaken; worksheet.Cells[row, 8].Value = task.status; worksheet.Cells[row, 9].Value = task.priority; row++; } worksheet.Cells["A:I"].AutoFitColumns(); var stream = new MemoryStream(); package.SaveAs(stream); stream.Position = 0; string excelName = $"Tasks-{DateTime.Now:yyyyMMddHHmmss}.xlsx"; return File(stream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", excelName); } }
内容的提问来源于stack exchange,提问作者Vengat Ramanan
相关产品推荐
相关产品推荐

