java实现传入URL下载图片并压缩,导出到excel

记录工作中使用导出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生成,运行时会直接抛出空指针异常导致无法成功导出,所以注意做判空操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值