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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:21:59