替换excel模板中的内容并使用JavaMail发送邮件
阅读原文时间:2023年07月08日阅读:1

由于在公司工作,常年出差,每天都要以日报的形式向公司汇报当天的工作内容。而日报的内容大体上就只有当天工作的主要内容时变化的,其余的都是不变 的。 而我的电脑刚打开excel有点卡,因此决定使用JavaMail结合poi写一个简单excel模板替换并使用JavaMail发送邮件的小程序。

主要思路如下:

1.加载配置文件(使用yaml作为配置文件)

配置文件中存放的是发送邮件需要用的一些配置信息和excel模板中需要替换的数据

比喻:邮件使用的协议、发送人、收件人、等等信息

2.加载excel模板,读取模板,使用上一步中配置信息替换掉模板中的数据,然后生成excel文件

3.使用JavaMail发送邮件

要注意乱码的处理。

4.将代码打包成一个可执行的Jar包(最终只需要修改一下配置文件即可使用)

5.项目的源代码,用附件上传失败了。   链接:http://pan.baidu.com/s/1dDCU593 密码:6xpi

项目采用maven构建,但是为了修改配置文件方便,并没有使用maven的规范,将配置文件放到src/main/resources目录中。

代码如下:

/**
 * 读取yaml配置文件,读取excel模板并生成excel文件,在使用JavaMail发送。
 *
 * @author huan
 *
 */
public class App {

    // 配置文件的名称
    private static final String CONFIGER_YAML_FILE_NAME = "sendMailConfig.yaml";
    // 日报的excel模板
    private static final String EXCEL_TEMPLETE = "ExcelTemplete.xls";

    public static void main(String[] args) {
        // 1.加载属性文件
        Map<String, String> propMap = null;
        try {
            propMap = loadConfigYamlFile();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
            System.out.println("加载yaml文件失败");
            System.exit(1);
        }
        // 将当前日期放到map中
        propMap.put("${currDate}", new SimpleDateFormat("yyyyMMdd").format(new Date()));
        System.out.println("输出配置文件信息开始...");
        for (Map.Entry<String, String> entry : propMap.entrySet()) {
            System.out.println(entry.getKey() + " --> " + entry.getValue());
        }
        System.out.println("输出配置文件信息结束...");
        // 2.加载excel模板
        Workbook workbook = loadExcelTemplete();
        if (workbook == null) {
            return;
        }
        // 3.获取第一个sheet页
        Sheet sheet = workbook.getSheetAt(0);
        if (null == sheet) {
            System.out.println("获取第一个sheet页失败");
            return;
        }
        String dayReportName = "Test-日报-" + propMap.get("${reportPer}") + "-" + propMap.get("${currDate}") + ".xls";
        System.out.println("生成新的日报的名称:" + dayReportName);
        // 替换模板中的内容
        for (Row row : sheet) {
            for (Cell cell : row) {
                int cellType = cell.getCellType();
                // 根据单元格的中内容的类型,得到单元格中的值
                String cellContent = getCellContentByCellType(cell, cellType);
                if (propMap.containsKey(cellContent)) {
                    setCellValue(propMap, cell, cellContent);
                }
            }
        }
        // 将替换后的数据excel保存到本地
        BufferedOutputStream bos = null;
        try {
            bos = new BufferedOutputStream(new FileOutputStream(dayReportName));
            workbook.write(bos);
            workbook.close();
            bos.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        System.out.println(dayReportName + " --> 生成成功!!!");
        // 发送邮件开始
        try {
            sendMail(propMap, dayReportName);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("邮件发送失败");
            System.exit(1);
        }
        System.out.println("邮件发送成功");
        // 归档文件
        archiveFile(dayReportName);
    }

    // 归档日报
    private static void archiveFile(String dayReportName) {
        // 1.判断目录是否存在
        Calendar calendar = Calendar.getInstance();
        int _month = calendar.get(Calendar.MONTH) + 1;
        String month = _month + "";
        if (_month < 10) {
            month = "0" + _month;
        }
        String dir = "日报归档" + File.separator + month;
        File dirFile = new File(dir);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
            System.out.println("创建目录:" + dirFile.getAbsolutePath());
        }
        File dayReportFile = new File(dayReportName);
        File f = new File(dir, dayReportName);
        dayReportFile.renameTo(f);
        System.out.println("文件归档成功:" + f.getAbsolutePath());
    }

    /**
     * 发送日报
     *
     * @param propMap
     * @param dayReportName
     * @throws MessagingException
     * @throws IOException
     */
    private static void sendMail(final Map<String, String> propMap, String dayReportName) throws MessagingException, IOException {
        Properties props = new Properties();
        props.setProperty("mail.host", propMap.get("${mail.host}"));
        props.setProperty("mail.smtp.auth", propMap.get("${mail.smtp.auth}"));
        props.setProperty("mail.transport.protocol", propMap.get("${mail.transport.protocol}"));
        Authenticator auth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 邮箱的用户名和密码
                return new PasswordAuthentication(propMap.get("${sendPer}"), propMap.get("${sendPerPwd}"));
            }
        };
        // 1.创建邮件的第一步: 创建session对象
        Session session = Session.getInstance(props, auth);
        // 设置调试模式 可以关闭
        session.setDebug(true);
        // 2.创建邮件的第二步:创建MimeMessage对象
        // 创建邮件对象
        MimeMessage msg = new MimeMessage(session);
        // 设置发送人
        msg.setFrom(new InternetAddress(propMap.get("${sendPer}")));
        // 设置收件人
        msg.addRecipients(RecipientType.TO, InternetAddress.parse(propMap.get("${receivePer}")));
        // 设置收件人 类型为 抄送
        msg.addRecipients(RecipientType.CC, InternetAddress.parse(propMap.get("${CC}")));
        // 设置邮件的主题
        msg.setSubject(dayReportName);
        MimeMultipart partList = new MimeMultipart();
        // 写签名
        MimeBodyPart part1 = new MimeBodyPart();
        System.out.println(propMap.get("${mailSign}"));
        part1.setContent(propMap.get("${mailSign}"), "text/html;charset=utf-8");
        // 写附件
        MimeBodyPart part2 = new MimeBodyPart();
        part2.attachFile(new File(dayReportName));
        part2.setFileName(MimeUtility.encodeText(dayReportName));
        // 把部件添加到集合中
        partList.addBodyPart(part1);
        partList.addBodyPart(part2);
        msg.setContent(partList);
        // 3. 创建邮件的第三步,发送 Transport
        Transport.send(msg);
    }

    /**
     * 设置单元格的样式
     *
     * @param propMap
     * @param cell
     * @param cellContent
     */
    private static void setCellValue(Map<String, String> propMap, Cell cell, String cellContent) {
        if (cellContent.equals("${currDate}")) {// 日期单独处理
            System.out.println("替换[" + cellContent + "]为[" + new SimpleDateFormat("yyyyMMdd").format(new Date()) + "]");
            cell.setCellValue(new Date());
        } else {
            String cellValue = propMap.get(cellContent);
            System.out.println("替换[" + cellContent + "]为[" + cellValue + "]");
            cell.setCellValue(cellValue);
        }
    }

    /**
     * @param cell
     * @param cellType
     */
    private static String getCellContentByCellType(Cell cell, int cellType) {
        String cellContent = "";
        switch (cellType) {
        case Cell.CELL_TYPE_STRING:
            cellContent = cell.getStringCellValue();
            break;
        case Cell.CELL_TYPE_BLANK:
            cellContent = "";
            break;
        case Cell.CELL_TYPE_NUMERIC:
            cellContent = cell.getNumericCellValue() + "";
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            cellContent = cell.getBooleanCellValue() + "";
            break;
        default:
            System.err.println("出现未知的单元格类型,系统退出。");
            System.exit(1);
            break;
        }
        return cellContent;
    }

    /**
     * 生成Excel的模板
     *
     * @throws IOException
     * @throws FileNotFoundException
     */
    private static Workbook loadExcelTemplete() {
        try {
            Workbook workbook = WorkbookFactory.create(new FileInputStream(new File(EXCEL_TEMPLETE)));
            return workbook;
        } catch (Exception e) {
            System.out.println("加载Excel模板出错...");
            e.printStackTrace();
        }
        return null;
    }

    // 加载配置文件文件
    @SuppressWarnings("unchecked")
    private static Map<String, String> loadConfigYamlFile() throws FileNotFoundException {
        Yaml yaml = new Yaml();
        Iterable<Object> iterable = yaml.loadAll(new FileInputStream(new File(CONFIGER_YAML_FILE_NAME)));
        Iterator<Object> it = iterable.iterator();
        Map<String, String> configerMap = new HashMap<String, String>();
        while (it.hasNext()) {
            Map<String, String> map = (Map<String, String>) it.next();
            for (Map.Entry<String, String> entry : map.entrySet()) {
                configerMap.put("${" + entry.getKey().trim() + "}", entry.getValue().trim());
            }
        }
        return configerMap;
    }
}

项目截图如下:

 最终打包成的目录如下:

点击run.bat执行后,就可以看到

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章