领导最近交给一个任务,要求定时任务,发送邮件。
具体要求为,要求指定数据库库中查出指定数据,并且放到Excel表格中,最后发送到指定邮箱,但是要求文件不落地。
java中能把数据从流转为excel文件的由两种包,一种是apache开发的poi另一种是net.sourceforge.jexcelapi,听说是一个韩国人开发的包。
我尽量两种包都写到。在公司要求中我使用的是poi。我先用poi实现了这个转换。其中没有设置表格的样式内容。
poi设置Excel单元格样式:https://www.cnblogs.com/linkstar/p/5910916.html
具体代码借鉴了这个老哥的思路:https://blog.csdn.net/yixin605691235/article/details/82429156
具体实现如下(poi实现):
数据转Excel工具类:
package com.www.kx;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
public class Data2Excel {
/**
* 对象转Excel文件
*
* @param list
* 传入的数据
* 对应的
* @param sheetSize
* 工作表的大小
* @param request
* 网页传来的请求
* @param response
* 网页传来的相应
* @param fileName
* 文件名
* @param sheetName
* 工作表名字
* @param title
* 表头
* key-为英文表头 表要javabean对应所以要遵循如下规则
* 根据带路径或不带路径的属性名获取属性值,即接受简单属性名,如userName等,又接受带路径的属性名,如student.department.name等
* value-对应中文在excel中产生的表头名
*/
public static void list2ExcelFile(List<T> list, int sheetSize, HttpServletRequest request,
HttpServletResponse response, String fileName, String sheetName, LinkedHashMap<String, String> title) {
OutputStream outputStream = null;
// 首先判断list里面是不是有值
if (list == null || list.size() == 0) {
// 如果空或者大小为0就直接return 或者抛出异常
return;
// throw new Exception("传入的数据为空或者大小为零");
}
try {
// 前台页面显示下载
setResp(request, response, fileName);
outputStream = response.getOutputStream();
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet(sheetName);
fillVeticalSheet(sheet, list, title);
wb.write(outputStream);
if (wb != null) {
wb.close();
}
} catch (Exception e) {
// TODO: handle exception
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 对象转流
*
* @param list
* 传入的数据
* @param sheetSize
* 工作表的大小
* @param request
* 网页传来的请求
* @param response
* 网页传来的相应
* @param fileName
* 文件名
* @param sheetName
* 工作表名字
* @param title
* 表头
* key-为英文表头 表要javabean对应所以要遵循如下规则
* 根据带路径或不带路径的属性名获取属性值,即接受简单属性名,如userName等,又接受带路径的属性名,如student.department.name等
* value-对应中文在excel中产生的表头名
* @return ByteArrayInputStream 字节流对象
* @throws Exception
* 传入数据为空
*/
public static ByteArrayInputStream list2EcelStream(List