如何在Java中读取解析.msg文件并写入Excel?遇依赖及格式问题
解决Java解析.msg文件并导出Excel的方案
一、修复Maven依赖冲突问题
使用Apache POI的poi-scratchpad模块处理.msg文件,确保所有POI相关依赖版本统一,避免类加载或方法缺失错误。在pom.xml中添加以下依赖:
<dependencies> <!-- .msg文件解析核心依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>5.2.5</version> </dependency> <!-- Excel文件生成依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version> </dependency> </dependencies>
二、解析.msg文件生成可读格式
通过POI的MAPIMessage类提取邮件核心字段,拼接为空格分隔的可读文本:
import org.apache.poi.hsmf.MAPIMessage; import java.io.FileInputStream; import java.util.ArrayList; import java.util.List; public class MsgParser { public static List<String> parseMsgFiles(String... filePaths) throws Exception { List<String> parsedContents = new ArrayList<>(); for (String path : filePaths) { try (FileInputStream fis = new FileInputStream(path)) { MAPIMessage msg = new MAPIMessage(fis); // 提取核心字段并以空格分隔 String content = String.join(" ", "发件人:" + msg.getDisplayFrom(), "收件人:" + msg.getDisplayTo(), "主题:" + msg.getSubject(), "正文:" + (msg.getTextBody() != null ? msg.getTextBody().trim() : "无") ); parsedContents.add(content); } } return parsedContents; } }
如需更多字段(如抄送人、发送时间),可调用MAPIMessage的getDisplayCc()、getMessageDate()等方法补充。
三、将解析内容写入Excel
使用POI的XSSFWorkbook创建Excel文件,将每条解析结果写入单独行:
import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.util.List; public class ExcelExporter { public static void exportToExcel(List<String> contents, String outputPath) throws Exception { try (XSSFWorkbook workbook = new XSSFWorkbook(); FileOutputStream fos = new FileOutputStream(outputPath)) { XSSFSheet sheet = workbook.createSheet("邮件解析结果"); // 写入表头 XSSFRow headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue解析内容"); // 写入数据行 for (int i = 0; i < contents.size(); i++) { XSSFRow row = sheet.createRow(i + 1); row.createCell(0).setCellValue(contents.get(i)); } workbook.write(fos); } } }
调用示例
public class Main { public static void main(String[] args) { try { List<String> parsedData = MsgParser.parseMsgFiles("C:/test1.msg", "C:/test2.msg"); ExcelExporter.exportToExcel(parsedData, "C:/邮件解析结果.xlsx"); System.out.println("Excel导出完成"); } catch (Exception e) { e.printStackTrace(); } } }
内容的提问来源于stack exchange,提问作者Naganika
相关产品推荐
相关产品推荐

