如何在C#中使用OpenXml包创建Excel并解决邮件发送报错问题
问题排查与修复方案
你代码存在以下几处明显问题,按优先级修复即可:
- 语法错误:代码里
wbp.Workbook.sa是未完成的无效代码,直接删除这行即可,否则无法正常编译运行 - 流位置错误:将Excel内容写入MemoryStream后,流的当前位置处于内容末尾,直接传入Attachment读取时会获取到空内容,需要在创建附件前将流位置重置为0
- 附件格式不匹配:你用OpenXml生成的是标准XLSX格式Excel文件,不是CSV文件,附件名和MIME类型都配置错误,需要修改为对应XLSX的配置
- SMTP配置缺失:Gmail的SMTP SSL端口为587,你未指定端口会导致连接失败;且当前Gmail不支持直接用账号登录密码发信,需要先开启账号两步验证,生成应用专用密码填入认证字段
- 生成验证缺失:要确认Excel是否生成正常,只需要将内存流的字节数组写入本地磁盘,手动打开验证即可
修正后可运行代码
using System; using System.IO; using System.Net; using System.Net.Mail; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; namespace CreatingExcel { class Program { static void Main(string[] args) { MemoryStream ms = new MemoryStream(); MailMessage mail = new MailMessage(); mail.To.Add("rohithajare01@gmail.com"); mail.From = new MailAddress("rohithajare01@gmail.com"); mail.Subject = "Test for lookupcode"; try { // 生成Excel部分 SpreadsheetDocument sd = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook); WorkbookPart wbp = sd.AddWorkbookPart(); wbp.Workbook = new Workbook(); WorksheetPart wsp = wbp.AddNewPart<WorksheetPart>(); wsp.Worksheet = new Worksheet(new SheetData()); Sheets sheets = sd.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets()); Sheet sheet = new Sheet() { Id = sd.WorkbookPart.GetIdOfPart(wsp), SheetId = 1, Name = "mySheet" }; sheets.Append(sheet); wbp.Workbook.Save(); sd.Close(); // 验证Excel是否生成正常,取消注释即可将文件保存到本地查看 // File.WriteAllBytes(@"C:\test.xlsx", ms.ToArray()); // 重置流位置 ms.Position = 0; // 附件改为正确的XLSX格式 mail.Attachments.Add(new Attachment(ms, "test.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); // 配置SMTP var email = new SmtpClient(); email.Host = "smtp.gmail.com"; email.Port = 587; // 补充Gmail SMTP端口 email.Credentials = new NetworkCredential("你的Gmail账号", "你的应用专用密码"); email.EnableSsl = true; Console.WriteLine("Sending Email.."); email.Send(mail); Console.WriteLine("Email sent"); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } }
内容的提问来源于stack exchange,提问作者Rohit Hajare
相关产品推荐
相关产品推荐

