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

使用Mailkit发送Xlsio生成的Excel附件时格式无效问题求助

问题分析与解决方案

核心问题

  1. 格式与扩展名不匹配:你用ExcelSaveType.SaveAsXLS生成的是旧版二进制Excel(.xls格式),但文件名和ContentType都配置为.xlsx,导致系统识别错误。
  2. Stream位置未重置:Workbook保存到Stream后,指针停留在末尾,后续读取时无法获取完整文件内容。
  3. 附件加载方式冗余易出错:MimeEntity.Load搭配ReadAsBytes()的操作没必要,且容易因Stream状态问题导致数据损坏。

修复步骤

1. 统一Excel格式与扩展名

如果要生成.xlsx文件,修改保存类型为ExcelSaveType.SaveAsXLSX,同时重置Stream指针:

FileStream stream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
// 用SaveAsXLSX匹配.xlsx扩展名
workbook.SaveAs(stream, ExcelSaveType.SaveAsXLSX);
// 重置Stream指针到开头,确保后续读取完整内容
stream.Position = 0;

FileAttachementDto file = new()
{                    
    FileName = fileName, // 确保fileName后缀为.xlsx
    File = stream              
};

如果需要保留.xls格式,需将文件名后缀改为.xls,并把ContentType调整为application/vnd.ms-excel。

2. 简化附件添加逻辑

直接通过BodyBuilder.Attachments.Add方法添加,无需额外的MimeEntity.Load操作:

// 再次确认Stream指针在开头
myFile.File.Position = 0;
// 添加附件,自动匹配对应ContentType
bodyBuilder.Attachments.Add(myFile.FileName, myFile.File);

也可手动指定ContentType(需与文件格式严格匹配):

myFile.File.Position = 0;
var contentType = new ContentType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet");
bodyBuilder.Attachments.Add(myFile.FileName, myFile.File, contentType);

关键注意事项

  • 必须保证保存格式、文件名后缀、ContentType三者一致:
    • .xlsx对应:ExcelSaveType.SaveAsXLSX + application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
    • .xls对应:ExcelSaveType.SaveAsXLS + application/vnd.ms-excel
  • 任何从Stream读取数据的操作前,都要执行Position = 0,避免读取空内容或不完整数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:50:37