需求

通过读取Outlook保存的msg类型邮件文件,解析邮件内容中的表格,并导出成Excel

工具介绍

outlook-message-parser : 一个Outlook邮件(.msg文件)解析工具
myexcel : 一个集导入、导出、加密Excel等多项功能的工具包

编码操作

引入maven依赖

<dependency>
    <groupId>org.simplejavamail</groupId>
    <artifactId>outlook-message-parser</artifactId>
    <version>1.7.8</version>
    <exclusions>
    <!-- 排除poi,避免与myexcel冲突 -->
        <exclusion>
            <artifactId>poi</artifactId>
            <groupId>org.apache.poi</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.github.liaochong</groupId>
    <artifactId>myexcel</artifactId>
    <version>2.1.1</version>
</dependency>

发送一个含有表格的邮件,在outlook中另存为.msg文件
邮件内容可参考下图:
邮件内容

使用outlook-message-parser工具解析.msg文件内容
解析.msg文件代码:

File msgFile = new File("C:\\Users\\symon\\Desktop\\demo1.msg");
OutlookMessageParser parser = new OutlookMessageParser();
OutlookMessage msg = parser.parseMsg(msgFile);
System.out.println(msg.toString());

运行结果如下,可以看到打印的邮件具体信息:

From: "Symon" <symoncn@outlook.com>
To: "symoncn@163.com" <'symoncn@163.com'>Date: Sat, 10 Oct 2020 18:00:04 CST
Subject: 表格
0 outlookAttachments.

然后使用 OutlookMessage 的 getConvertedBodyHTML() 方法获取html格式的邮件内容,这里我们把html格式的字符串写入一个文件,使用浏览器预览一下,代码如下:

File msgFile = new File("C:\\Users\\symon\\Desktop\\demo1.msg");
OutlookMessageParser parser = new OutlookMessageParser();
OutlookMessage msg = parser.parseMsg(msgFile);
//msg解析获取html内容写入到文件
File htmlFile = new File("C:\\Users\\symon\\Desktop\\demo1.html");
try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(htmlFile), "UTF-8")) {
    writer.write(msg.getConvertedBodyHTML());
} catch (IOException e) {
    e.printStackTrace();
}

执行之后,浏览器预览如下图:
html预览
使用myexcel工具,将上一步获取的html解析成Workbook并写出到excel文件
代码如下:

File msgFile = new File("C:\\Users\\symon\\Desktop\\demo1.msg");
OutlookMessageParser parser = new OutlookMessageParser();
//将msg文件解析成OutlookMessage对象
OutlookMessage msg = parser.parseMsg(msgFile);
//将html解析成Workbook对象
Workbook wb = HtmlToExcelFactory.readHtml(msg.getConvertedBodyHTML()).useDefaultStyle().build();
//将Workbook写出到excel文件
File excelFile = new File("C:\\Users\\symon\\Desktop\\demo1.xls");
try (FileOutputStream outputStream = new FileOutputStream(excelFile)) {
    wb.write(outputStream);
} catch (Exception e) {
    e.printStackTrace();
}

执行之后,查看excel文件内容如下图:
html预览

至此,该需求的实现就已经结束了,如果需要操作解析msg获取的html,可使用jsoup工具,另外MyExcel工具的功能不仅限于此,详细功能如下:

  • 可生成任意复杂表格:本工具使用迭代单元格方式进行excel绘制,可生成任意复杂度excel,自适应宽度、高度;
  • 零学习成本:使用html作为模板,学习成本几乎为零;
  • 支持常用背景色、边框、字体等样式设置:具体参见文档-Style-support(样式支持)部分;
  • 支持.XLS、.XLSX:支持生成.xls、.xlsx后缀的excel;
  • 支持低内存SXSSF模式:支持低内存的SXSSF模式,可利用极低的内存生成.xlsx;
  • 支持生产者消费者模式导出:支持生产者消费者模式导出,无需一次性获取所有数据,分批获取数据配合SXSSF模式实现真正意义上海量数据导出;
  • 支持多种模板引擎:已内置Freemarker、Groovy、Beetl等常用模板引擎Excel构建器(详情参见文档Getting started),默认内置Beetl模板引擎(推荐引擎,Beetl文档);
  • 提供默认Excel构建器,直接输出简单Excel:无需编写任何html,已内置默认模板,可直接根据POJO数据列表输出;
  • 支持一次生成多sheet:以table作为sheet单元,支持一份excel文档中多sheet导出;

MyExcel相关文档