如何在C#中读取MSG文件附件并提取PDF文件名写入Excel
提取MSG文件中PDF附件的文件名并写入Excel
你已经有了读取MSG附件的基础代码,接下来只需要补充筛选PDF格式附件和将文件名写入Excel这两个关键步骤就行,我帮你把整个流程完善好:
先完善附件筛选逻辑
你的现有代码会遍历所有附件,我们加个判断,只挑后缀是.pdf的(兼容大写.PDF的情况),同时把这些文件名收集起来方便后续使用:
public static List<string> GetPdfAttachmentNames(string msgPath) { var pdfFileNames = new List<string>(); // 用using确保资源被正确释放 using (var message = new OutlookStorage.Message(msgPath)) { foreach (var attachment in message.Attachments) { // 检查附件是否为PDF,忽略大小写差异 if (Path.GetExtension(attachment.FileName).Equals(".pdf", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("找到PDF附件: '{0}'", attachment.FileName); pdfFileNames.Add(attachment.FileName); } } } return pdfFileNames; }
再实现写入Excel的功能
要写入Excel,推荐用EPPlus这个轻量好用的.NET库(先通过NuGet包管理器安装EPPlus),下面是写入逻辑:
public static void WritePdfNamesToExcel(List<string> pdfFileNames, string excelOutputPath) { // 创建Excel包 using (var excelPackage = new ExcelPackage(new FileInfo(excelOutputPath))) { // 获取第一个工作表,没有就新建一个 var worksheet = excelPackage.Workbook.Worksheets.FirstOrDefault() ?? excelPackage.Workbook.Worksheets.Add("PDF附件列表"); // 设置表头,加粗突出 worksheet.Cells[1, 1].Value = "PDF附件文件名"; worksheet.Cells[1, 1].Style.Font.Bold = true; // 逐行写入文件名 for (int i = 0; i < pdfFileNames.Count; i++) { worksheet.Cells[i + 2, 1].Value = pdfFileNames[i]; } // 自动调整列宽,让内容完整显示 worksheet.Column(1).AutoFit(); // 保存Excel文件 excelPackage.Save(); } }
最后整合起来调用
把两个方法组合,就完成从MSG提取到Excel写入的全流程了:
public static void ProcessMsgAndExportExcel(string msgFilePath, string excelSavePath) { try { var pdfNames = GetPdfAttachmentNames(msgFilePath); if (pdfNames.Count == 0) { Console.WriteLine("这个MSG文件里没有PDF附件哦~"); return; } WritePdfNamesToExcel(pdfNames, excelSavePath); Console.WriteLine($"搞定!已经把{pdfNames.Count}个PDF文件名写入到: {excelSavePath}"); } catch (Exception ex) { Console.WriteLine("处理时出错了: {0}", ex.Message); } } // 调用示例(替换成你的文件路径) // ProcessMsgAndExportExcel(@"D:\my_msg_file.msg", @"D:\pdf_attachments_list.xlsx");
一些小提醒
- 确保你已经安装了
OutlookStorage(读取MSG的库)和EPPlus,直接在NuGet搜索就能安装。 - 如果你的机器装了Outlook,也可以用
Microsoft.Office.Interop.Outlook读取MSG,但OutlookStorage不需要依赖Outlook客户端,更适合无Outlook的环境。 - 如果处理超大MSG文件,记得关注内存占用,必要时可以分批处理。
内容的提问来源于stack exchange,提问作者karthik
相关产品推荐
相关产品推荐

