记录工作中使用导出excel功能,导出的excel带图片。前端传过来的是图片的url,那么请求参数就是字符串类型的url,把这条url转成流,生成文件并输出,返回值类型就是文件类型file。下面是先把图片下载,再压缩的工具类:
/**
* URL转成图片并压缩
*/
public class UrlImageUtil {
public static File downloadAndCompress(String url,float quality) throws IOException{
/**
* 下载图片
*/
File file = null;
InputStream inputStream = null;
FileOutputStream fos = null;
try {
file = File.createTempFile("image", "jpg");
URL urlFile = new URL(url);
inputStream = urlFile.openStream();
fos = new FileOutputStream(file);
byte[] bytes = new byte[8192];
int bytesRead = 0;
while ((bytesRead = inputStream.read(bytes,0,8192)) != -1){
fos.write(bytes,0,bytesRead);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (null != fos){
fos.close();
}
if (null != inputStream){
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 指定压缩图片的方式、参数等
*/
ImageWriter imageWriter = ImageIO.getImageWritersByFormatName("jpg").next();
ImageWriteParam imageWriteParam = new JPEGImageWriteParam(null);
imageWriteParam.setCompressionMode(imageWriteParam.MODE_EXPLICIT);
imageWriteParam.setCompressionQuality(quality);
imageWriteParam.setProgressiveMode(imageWriteParam.MODE_DISABLED);
ColorModel colorModel = ImageIO.read(file).getColorModel();
imageWriteParam.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel,colorModel.createCompatibleSampleModel(32,32)));
FileOutputStream out;
if (!file.exists()){
throw new FileNotFoundException("文件不存在");
}else{
BufferedImage bufferedImage = ImageIO.read(file);
out = new FileOutputStream(file);
imageWriter.reset();
imageWriter.setOutput(ImageIO.createImageOutputStream(out));
imageWriter.write(null,new IIOImage(bufferedImage,null,null),imageWriteParam);
out.flush();
out.close();
}
return file;
}
}
下面是导出的实现方法:
/**
* 导出excel的接口
* @param response
* @param workerListReqVO
* @throws IOException
*/
@GetMapping(value = "/imageExportXls")
public void imageExportXls(HttpServletResponse response, WorkerListReqVO workerListReqVO) throws IOException {
try {
int a = 0;
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
String fileName = "人员信息表" + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
int rowNum = 1;
String[] headers = {"姓名","性别","年龄","身份证号","工种","头像"};
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
sheet.setColumnWidth(i,4000);
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
List<WorkerListRespVO> list = workerBasicInfoService.queryWorkerInfoExport(workerListReqVO);
for (WorkerListRespVO worker : list) {
HSSFRow row1 = sheet.createRow(rowNum);
row1.setHeight((short) 1000);
row1.createCell(0).setCellValue(worker.getWorkerName());
row1.createCell(1).setCellValue(worker.getGender_dictText());
row1.createCell(2).setCellValue(String.valueOf(worker.getAge()));
row1.createCell(3).setCellValue(worker.getIdCardNumber());
row1.createCell(4).setCellValue(worker.getWorkType_dictText());
if (worker.getHeadImageUrl() == null) {
row1.createCell(5).setCellValue("暂无头像");
} else {
File file = UrlImageUtil.downloadAndCompress(worker.getHeadImageUrl(), 0.0005f);
setImage(workbook, sheet, a, file);
}
rowNum++;
a++;
}
response.reset();
String excelFileName = new String(fileName.getBytes(), "iso-8859-1");
response.setHeader("Disposition","attachment;filename=" + excelFileName + ".xls");
response.setContentType("application/octet-stream;charset=UTF-8");
OutputStream os = response.getOutputStream();
workbook.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
response.sendRedirect("error.action");
}
}
public void setImage(HSSFWorkbook workbook,HSSFSheet sheet,int a,File file){
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
ByteArrayOutputStream byteArrayOps = new ByteArrayOutputStream();
try {
BufferedImage image = ImageIO.read(file);
ImageIO.write(image,"jpg",byteArrayOps);
HSSFClientAnchor anchor = new HSSFClientAnchor(50, 55, 900, 200, (short) 5, a + 1, (short) 5, a + 1);
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_DONT_RESIZE);
patriarch.createPicture(anchor,workbook.addPicture(byteArrayOps.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
} catch (IOException e) {
e.printStackTrace();
}
}
注意在传入多条url,只要有一条无效的url那它就不会有文件file生成,运行时会直接抛出空指针异常导致无法成功导出,所以注意做判空操作。