将数据导出到excel并插入图片(保持图片比例)
- 一、先看效果
- 二、上代码
- 1.依赖:
- 2.工具类:
- 3.功能代码:
一、先看效果
二、上代码
1.依赖:
<poi.version>3.15</poi.version>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>${poi.version}</version>
</dependency>
2.工具类:
在项目中我使用了一个封装好的工具类方便使用,可在网上搜索ExportExcelUtil查找。这里列出两个主要方法(篇幅问题就不列全了),:
/**
* 创建Excel
*
* @param excelName 要导出的excel名称
* @param excelTitle 要导出的excel表中工作表的标题
* @param list 要导出的数据集合
* @param fieldMap 中英文字段对应Map,即要导出的excel表头
* @param response 使用response可以导出到浏览器
* @param <T> 虚拟类型参数
* @return 工作簿HSSFWorkbook对象
*/
public static <T> HSSFWorkbook createExcel(String excelName, String excelTitle, List<T> list, LinkedHashMap<String, String> fieldMap, HttpServletResponse response) {
HSSFWorkbook wb = null;
// 设置默认文件名为当前时间:年月日时分秒
if (excelName == null || "".equals(excelName)) {
excelName = new SimpleDateFormat("yyyyMMddhhmmss").format(
new Date()).toString();
}
// exportExcel(excelName, response);
try {
//创建一个WorkBook,对应一个Excel文件
wb = new HSSFWorkbook();
//在Workbook中,创建一个sheet,对应Excel中的工作表(sheet)
HSSFSheet sheet = wb.createSheet(excelName);
// 填充工作表
fillSheet(sheet, excelTitle, list, fieldMap, getColumnTopStyle(wb), getStyle(wb));
} catch (Exception e) {
logger.info("创建Excel失败!");
logger.error(e.getMessage());
}
return wb;
}
/**
* 导出Excel
*
* @param wb 工作簿HSSFWorkbook对象
* @param excelName 工作表名称
* @param excelName 工作表后缀名
* @param response http响应
*/
public static void exportExcel(HSSFWorkbook wb, String excelName, String suffix, HttpServletResponse response) {
try {
// 设置response头信息
response.reset(); // 清除buffer缓存
response.setContentType("application/vnd.ms-excel;charset=utf-8"); // 改成输出excel文件
//通知浏览器不要缓存
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", -1);
//通知客户端以下载的方式打开
response.setHeader("Content-Disposition", "attachment; filename="
+ new String(excelName.getBytes("utf-8"), "ISO-8859-1") + suffix);
//将excel文件输出到response输出流
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();
} catch (Exception e) {
logger.info("导出Excel失败!");
logger.error(e.getMessage());
}
}
3.功能代码:
public void exportData( HttpServletResponse response) {
Person person = new Person();
person.setName("libai");
person.setAge(43);
List<Person> list=new ArrayList<Person>();
list.add(person);
List<Person> personList = list;
String excelName = "节假日排班表";
String excelTitle = "节假日排班表";
LinkedHashMap<String, String> fieldMap = new LinkedHashMap<String, String>();
fieldMap.put("name", "姓名");
fieldMap.put("age", "年龄");
HSSFWorkbook wb = ExportExcelUtil.createExcel(excelName, excelTitle, personList, fieldMap, response);
ExportExcelUtil.setTopLineFont(wb.getSheet(excelName), "黑体", 18);
ExportExcelUtil.setAllColumnsWidth(wb.getSheet(excelName), 2, fieldMap.size());
/************上面是设置表格文本内容,下面进行插入图片处理的部分***************/
BufferedImage bufferImg = null;
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
//加载图片
try {
//这里file路径换成需要插入的图片路径
bufferImg = ImageIO.read(new File("C:\\Users\\11727\\Pictures\\Saved Pictures\\569259599 (1).jpg"));
ImageIO.write(bufferImg, "jpg", byteArrayOut);
HSSFSheet sheet1 = wb.getSheet(excelName);
// 这里获取上面插入数据后表格的最后一行
int lastRowNum = sheet1.getLastRowNum();
// 设置B列的宽度为35*256;
sheet1.setColumnWidth(1, 35 * 256);
int row=lastRowNum+1; //要插入的行
int col=1; //要插入的列
int width = bufferImg.getWidth();//原始宽度
int height = bufferImg.getHeight();//原始高度
// 一个12号字体的宽度为13,前面已设置了列的宽度为30*256,故这里的等比例高度计算如下
height = (int) Math.round((height * (30 * 13) * 1.0 / width));
// excel单元格高度是以点单位,1点=2像素; POI中Height的单位是1/20个点,故设置单元的等比例高度如下
HSSFRow row = sheet1.createRow(row);
row.setHeight((short) (height / 2 * 20));
// 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
HSSFPatriarch patriarch = sheet1.createDrawingPatriarch();
// anchor主要用于设置图片的属性
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) col, row , (short) col, row);
anchor.setAnchorType(3);
// 插入图片
patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
} catch (Exception e) {
e.printStackTrace();
}
/*********最后使用工具类导出设置好的表格************/
ExportExcelUtil.exportExcel(wb, excelName, ".xls", response);
}
希望对大家有用,能导出数据和合适的图片到excel中。
参考: Java Web篇:导出等比例图片到Excel.