因为之前做的导出都是导出数据的基本信息不含图片的那种,一直也没做过导出图片的excel,正好这两天做这个需求就做了一个,好 废话不多说,直接上图 ,因为我这边是根据模板导出数据 先看下模板
然后上代码 都写的注释
因为我这个是生成三个sheet 所以调用了三次这个excel导出方法,
/**
* @param list (表格的数据)
* @param out (输出流)
* @throws Exception
* @Description: 导出Excel
*/
public XSSFWorkbook exportImgData(XSSFWorkbook workbook,
List<Map<Integer, Object>> list,
OutputStream out,String type) throws Exception {
/*
XSSFWorkbook workbook = new XSSFWorkbook();
*/
int index = 0;
//判断当前类型 多个sheet
if(type.equalsIgnoreCase(UserTypeEnum.LEARNNER_INFO_TYPE.getCode())){
index = 0;
}else if(type.equalsIgnoreCase(UserTypeEnum.LEARNNER_STUDY_INFO_TYPE.getCode())){
index = 1;
}else if(type.equalsIgnoreCase(UserTypeEnum.LEARNNER_EXAM_INFO_TYPE.getCode())){
index = 2;
}
XSSFSheet sheet = workbook.getSheetAt(index); //读取第一个工作簿
/*
Sheet sheet = workbook.createSheet(sheetTitle);
*/
/* workbook.setSheetName(sheetNum, sheetTitle);*/
Set<ByteArrayOutputStream> set = new HashSet<ByteArrayOutputStream>();
XSSFDrawing patriarch = (XSSFDrawing) sheet.createDrawingPatriarch();
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth((short) 20);
// 生成一个样式
XSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);//垂直
// 生成一个字体
XSSFFont font = workbook.createFont();
font.setColor(HSSFColor.BLACK.index);
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
style.setFont(font);
// 指定当单元格内容显示不下时自动换行
style.setWrapText(true);
//创建行
int a = 3;
for(int j= 0;j<list.size();j++){
Map<Integer,Object> map = list.get(j);
//创建行
Row rowContent = sheet.createRow(a+j);
//rowContent.setHeightInPoints((float) 30); 可以设置高度
//循环创建列(3列)
for(int i=0;i<=map.size()-1;i++){
Cell cellContent = rowContent.createCell(i);
if (map.get(i) instanceof String) {
cellContent.setCellValue((String) map.get(i));
} else if (map.get(i) instanceof Integer) {
cellContent.setCellValue((int) map.get(i));
} else if (map.get(i) instanceof Double) {
cellContent.setCellValue((double) map.get(i));
} else if (map.get(i) instanceof ByteArrayOutputStream){
//anchor主要用于设置图片的属性
XSSFClientAnchor anchor3 = new XSSFClientAnchor(0, 0, 0, 0,(short) cellContent.getColumnIndex(), cellContent.getRowIndex(), (short) (cellContent.getColumnIndex()+1), cellContent.getRowIndex()+1);
ByteArrayOutputStream byteArrayOut3 = (ByteArrayOutputStream) map.get(i);
set.add(byteArrayOut3);
int ptype = workbook.PICTURE_TYPE_PNG;
//插入图片
patriarch.createPicture(anchor3, workbook.addPicture(byteArrayOut3.toByteArray(), ptype));
}
cellContent.setCellStyle(style);
}
}
return workbook;
}
红框内是因为我这边业务的需求,所以才这么写,各位可以根据自己的业务需求,修改一下。(这块重点提一下,数据的问题,含有图片的时候,不能放路径,要转换成ByteArrayOutputStrea(字符数据输出流)。
好了,最后给大家看一下效果图