代码编织梦想

近期项目开发设计一个批处理报表数据的展示,原本是将数据以前台模板Thymylef的形式下展示发送邮件的,近期生产报出严重问题数据量太大超过200m无法发送成功邮件,以致添加新的需求,将数据放到附件excel发送。

注意我们的方法不生成文件,再服务器上生成文件再取再存入附件太过麻烦,而且大多数生产服务器是不允许你有这个权限,所以我们用流的方式存储。POI生成流

public static ByteArrayOutputStream createExcel(List<Map<String, Object>> excelDataList) {
        try {
            // 1、创建一个流文件
            ByteArrayOutputStream excel = new ByteArrayOutputStream();
            //创建一个excel
            WritableWorkbook workbook = Workbook.createWorkbook(excel);

            //  2、创建一个Excel的工作表sheet
            WritableSheet sheet = workbook.createSheet("指标群异常数据", 0);

            //  3、样式设置
            WritableFont bold = new WritableFont(WritableFont.createFont("微软雅黑"), 12, WritableFont.BOLD);
            WritableFont noBold = new WritableFont(WritableFont.createFont("微软雅黑"), 12, WritableFont.NO_BOLD);

            WritableCellFormat titleFormate = new WritableCellFormat(bold);
            // 设置单元格中的内容水平方向居中、垂直方向居中设置边框
            titleFormate.setAlignment(jxl.format.Alignment.CENTRE);
            titleFormate.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
            titleFormate.setBorder(Border.ALL, BorderLineStyle.THIN);

            // 设置正文内容样式,单元格样式控制对象
            WritableCellFormat textFormat = new WritableCellFormat(noBold);
            //  单元格中的内容水平方向居中、垂直方向居中、设置边框
            textFormat.setAlignment(jxl.format.Alignment.CENTRE);
            textFormat.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
            textFormat.setBorder(Border.ALL,BorderLineStyle.THIN);

            //  3.4、窗口冻结第一行
            sheet.getSettings().setVerticalFreeze(1);
            //sheet.getSettings().setHorizontalFreeze(2);//冻结 2列两行

            //  3.5、设置行高--第一行标题行
            sheet.setRowView(0,500);

            //  3.6、设置列宽
            sheet.setColumnView(0,15);
            sheet.setColumnView(1,25);
            sheet.setColumnView(2,30);
            sheet.setColumnView(3,15);
            sheet.setColumnView(4,15);
            sheet.setColumnView(5,20);


            //  4、构造表头
            ExcelUtil.setSheetHeader(sheet, titleFormate);

            //  5、填充数据
            ExcelUtil.setSheetData(sheet, textFormat, 1, excelDataList);
            workbook.write();
            workbook.close();
            return excel;
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("创建邮件失败");
        }
    }

因为生成的临时文件我不需要放到本地,所以这里直接用了一个字节流来存储excel信息

private static void setSheetHeader(WritableSheet sheet, WritableCellFormat titleFormate) throws WriteException {
        // 构造表头
        //mergeCells(0, 0, 0, 0) 表示不合并; sheet.mergeCells(1,0,2,0)表示第2列和第3列合并成一列
        //Label label_20 = new Label(2, 0, "描述", cellFormat); 前面的数字表示第几列,第几行
        //4.1、创建表数据
        List<String> titleList = Arrays.asList("测试1", "测试2", "测试3", "测试4", "测试5", "测试6");
        for (int i = 0; i < titleList.size(); i++) {
            Label label_00 = new Label(i,0, titleList.get(i), titleFormate);
            sheet.addCell(label_00);
        }

    }

表头以及信息方便展示,我就是固定死了,也可以用数据库中的数据

private static void setSheetData(WritableSheet sheet, WritableCellFormat textFormat, int startRow, List<Map<String,Object>> excelDataList) throws WriteException {
        for (int i = 0; i < excelDataList.size(); i++, startRow++) {
            Map excelData = excelDataList.get(i);
            Label label_02 = new Label(0, startRow, (String) excelData.get("INDEX_CODE"), textFormat);
            sheet.addCell(label_02);
            Label label_12 = new Label(1, startRow, (String) excelData.get("INDEX_NAME"), textFormat);
            sheet.addCell(label_12);
            Label label_22 = new Label(2, startRow, (String) excelData.get("IND_CONDITION"), textFormat);
            sheet.addCell(label_22);
            Label label_32 = new Label(3, startRow, (String) excelData.get("STATISTICAL_FREQUENCY"), textFormat);
            sheet.addCell(label_32);
            Label label_42 = new Label(4, startRow, (String) excelData.get("exceptionDate"), textFormat);
            sheet.addCell(label_42);
            Label label_52 = new Label(5, startRow, (String) excelData.get("msg"), textFormat);
            sheet.addCell(label_52);
        }
    }

excelDataList就是要插入的行数据了,通过循环将数据插入到这些列中。当然列信息也是可以写成动态的,不过我只需要几列,也是固定死了。

上面代码执行完成之后,就得到了一个ByteArrayOutputStream类的excel流文件

// 将流文件存到字节数组缓冲区 (以上的所有代码可放在一个方法体中 设置格式设置字体添加信息转换字节流 然后将ByteArrayInputStream作为return的对象返回,因为mail附件的格式是要求是InputStream格式的)
        ByteArrayInputStream excelAttachment = new ByteArrayInputStream(excel.toByteArray());
        

然后将流文件放到字节数组缓冲区中,以待使用。接下来就是创建邮件发送类

try {
            // 创建邮件发送类
            JavaMailSenderImpl javaMailSender = setMailSender();

            // 创建邮件信息类
            MimeMessage msg = javaMailSender.createMimeMessage();
            // 创建MimeMessageHelper对象,MimeMessage的辅助类
            MimeMessageHelper message = new MimeMessageHelper(msg, true);

            message.setFrom(javaMailSender.getUsername());
            String[] emailArray = emailList.toArray(new String[emailList.size()]);
//            message.setTo(emailArray);
            // 要发送的账号
            message.setTo("***********@qq.com");

            // 标题
            message.setSubject(INDEX_CODE + "——" + INDEX_NAME + "——" + STATISTICAL_FREQUENCY + "——指标异常");

            // 主体
            message.setText(generateEmailMsg(item));

            ByteArrayDataSource file = new ByteArrayDataSource(excelAttachment, "application/vnd.ms-excel;charset=UTF-8");
            // 附件 关键部分
            message.addAttachment(MimeUtility.encodeWord("指标异常数据信息.xls","utf-8","B"),file);

            javaMailSender.send(msg);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("邮件发送失败!" + e);
        }

至于发送邮件以及类的方法我就不一一展示了,说一下注意的坑点。我之前者应部署后会报一个错误JavaMailSender with Exception writing Multipart。

  • 使用存在方法检查文件是否在FileSystemResource中退出
  • 请发布完整的异常堆栈跟踪。
    我去搜了解决办法是因为它默认判断我的主体是空的,所以我把 message.setText 放在添加附件代码的下面就行了按循序执行就可以正常发送了。很神奇

           
            ByteArrayDataSource file = new ByteArrayDataSource(excelAttachment, "application/vnd.ms-excel;charset=UTF-8");
            // 附件 关键部分
            message.addAttachment(MimeUtility.encodeWord("指标异常数据信息.xls","utf-8","B"),file);
            message.setText(generateEmailMsg(item));
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42283142/article/details/129814746

java生成excel文件邮件发送给多个人-爱代码爱编程

需要一个临时系统功能可以查询数据结果生成excel文件,在指定时间把excel文件发送个多个人,并抄送给多个人。 技术要点:Java使用poi生成excel文件通过javamail邮件发送给多个人;数据库mysql 代码有部分删减剪!!只能参考修改,不能直接使用!! =========================

java使用阿里邮箱生成excle邮件附件发送_码农陈二狗的博客-爱代码爱编程

需求背景 日常工作中,对于一个码农来说,熟练使用框架之外,还需要灵活使用各类工具类,类似于导入导出,上传下载,邮件短信,语音视频等常用功能也是非常常见的需求,网上搜索的相关资料也是非常的多,今天就描述一个需求的场景,难度不

java实现通过poi把数据查出来放在模板excel中并作为附件发送邮件_pistanuts的博客-爱代码爱编程

Java 实现通过poi把需要发送的附件信息数据从数据库中查出来,放在excel模板中,并作为附件发送邮件。 要点: 1.java代码 2.poi 3.从数据库中查出数据 4.把数据显示到模板(excel)中 5

java中使用apache poi插件生成excel表格及实现以附件的形式文件下载-爱代码爱编程

Java中使用apache poi插件生成excel表格及文件下载 简介 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,所以我们平时对这些操作比较多,众所周知,在程序中

java POI 读取Excel文件 将图片、表格生成到PPT-爱代码爱编程

临时有个需求,要求通过读取EXCEL文件,然后通过文件名称去给定的文件夹内查找图片,并将图片写入PPT中,详情以表格的形式写到图片右侧,每张图片一页PPT。效果如图所示: 用到的jar包如下(maven): <dependency> <groupId>net.sourceforge.jexcelapi&l

java实现 生成excel附件表格 群发/单发 附件 到邮箱-爱代码爱编程

使用javax.mail和poi生成excel表格 群发/单发 附件 到邮箱 maven导入依赖:`<!--poi生成excel依赖--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml

java excel生成_java 中 excel生成并文件下载保存到本地(三)-爱代码爱编程

package com.dragon.action; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import jav

java邮件中添加excel_基于javaMail的邮件发送--excel作为附件-爱代码爱编程

基于JavaMail的Java邮件发送 Author xiuhong.chen@hand-china.com Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用户发送邮件,然后我就简单学习了SMTP. 电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMA

Java POI 导出excel附件,附件中设置超链接到其他文件或网址-爱代码爱编程

依赖: <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi-ooxml</artifactId>            <version>3.15-beta2</

java使用poi实现Excel数据填充并生成文件-爱代码爱编程

本文均以Demo形式给出代码,复制可直接用,如果要结合实际业务请自行应变。内容仅做参考,有啥可改进的或者有更好的思路的欢迎评论、私信哦。 依赖 <dependency> <groupId>org.apache.poi</groupId> <arti

java使用poi导出excel文件_wildcata的博客-爱代码爱编程

Java使用POI导出Excel文件 POI概述Apache POI 下载依赖引用关系图如下所示:直接下载Maven下载POI实例总结 POI概述 HSSF 是 POI 项目的 Excel '97(-2007) 文件格式的纯 Java 实现。XSSF 是 POI 项目的 Excel 2007 OOXML (.xlsx) 文件格式的纯 J

获取excel模板复制到临时文件中并写入数据作为附件发送邮件_往事不堪回首..的博客-爱代码爱编程

import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xssf.usermodel.*; import org.spring

java读取hbase数据,使用poi操作excel模板,并定时发送带有excel附件的邮件_获取hbase数据 存入excel-爱代码爱编程

文章目录 前言一、读取Excel模板二、读取Hbase数据1.创建Hbase连接和查询条件2.获取数据 三、向Excel模板写入相关数据,并生成本地文件四、将新生成的Excel以流的方式,进行邮件发送五、

常用的poi格式设置以及使用poi生成excel文件并转为multipartfile类型上传到服务器_poi上传文件-爱代码爱编程

1. 常用的POI格式设置以及使用POI生成EXCEL文件并转为MultipartFile类型上传到服务器 // 根据数据设置文档大小 Integer dataCount = purGoo

baklib支招:高效管理知识碎片的工具和要点_文件知识碎片个人数据库工具-爱代码爱编程

在信息爆炸的时代,我们收集的信息越来越多,但是我们对这些信息的管理却越来越困难。这就需要我们学会如何高效地管理知识碎片,以便随时利用这些碎片来解决问题或者做决策。在这里,我们将介绍一些高效管理知识碎片的工具和要点。 工具分享: 1. 笔记类工具 笔记类工具是一种常见的管理知识碎片