java实现导出图片+数据的excel文件并返回文件流

java 实现Excel导出(包含图片)

最近做的项目中涉及到了利用poi进行excel导出,本身导出没有什么难度的,但是遇到一个需要导出图片的需求,在实现上有一点阻力,现在解决了,记录一下。

一、所需依赖:

 
        <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poiartifactId>
            <version>4.1.0version>
        dependency>
        <dependency>
            <groupId>org.apache.poigroupId>
            <artifactId>poi-ooxmlartifactId>
            <version>4.1.0version>
        dependency>
        

二、主要代码:

这个代码是我写的一个简单版的,工具类可以自行编码

/**
	 * 合同下主成品信息成品条形码 excel导出
	 *
	 * @param fileName 下载文件的名称
	 * @param list 导出excel数据
	 * @throws IOException
	 */
	public void saveContractMainFpCodes(HttpServletResponse response, String fileName, List<FinishedProductDto> list) throws IOException {
		Workbook workbook = new XSSFWorkbook();
		Sheet sheet = workbook.createSheet("sheet页名称");
		//标识位,用于标识sheet的行号
		int rowIndex = 1;
		Row rowTitle = sheet.createRow(0);
		//自定义行头标题的内容
		String[] titles = new String[]{};
		for (int i = 0; i < titles.length; i++) {
			rowTitle.createCell(i).setCellValue(titles[i]);
		}
		try {
			//循环写入主表数据
			for (Iterator<FinishedProductDto> iter = list.iterator(); iter.hasNext(); ) {
				FinishedProductDto product = iter.next();
				Row row = sheet.createRow(rowIndex);

				Cell cell0 = row.createCell(2);
				cell0.setCellValue(product.getPactId());

				Cell cell2 = row.createCell(3);
				cell2.setCellValue(product.getMaTally());

				Cell cell3 = row.createCell(4);
				cell3.setCellValue(product.getMaName());

				Cell cell5 = row.createCell(5);
				cell5.setCellValue(product.getDeliveryTime().toString());

				Cell cell6 = row.createCell(6);
				cell6.setCellValue(product.getBreakTime().toString());
				//调用Drawing对象进行绘画操作
				XSSFDrawing drawingPatriarch = (XSSFDrawing) sheet.createDrawingPatriarch();
				//使用Anchor进行图片位置等方面的调节
				XSSFClientAnchor anchor = new XSSFClientAnchor(300, 75, 700, 250, (short) 0, rowIndex, (short) 1, rowIndex + 1);
				//product.getBarcodeImg()是一个byte[]
				//根据anchor和图片的byte[]来进行创建
				drawingPatriarch.createPicture(anchor, workbook.addPicture(product.getBarcodeImg(), XSSFWorkbook.PICTURE_TYPE_JPEG));
				//y = (x + 0.72)*256
				//x是excel表格宽度
				//x是代码宽度
				int width = (int) ((15 + 0.72) * 256);
				if (rowIndex == 1) {
					width = (int) ((32 + 0.72) * 256);
				}
				if (rowIndex == 3) {
					width = (int) ((30 + 0.72) * 256);
				}
				
				//这里对每一个单元格的宽高进行了设置,具体的宽高以图片宽高为核心
				sheet.setColumnWidth(rowIndex - 1, width);
				row.setHeight((short) 900);
				//显示网格
				sheet.setDisplayGridlines(true);
				Cell cell1 = row.createCell(1);
				cell1.setCellValue(product.getMainFpBarcode());

				rowIndex++;
			}
			//设置reponse一些响应属性,返回文件流给前端
			response.setContentType("APPLICATION/OCTET-STREAM");
			response.reset();
			response.addHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
			OutputStream fos = response.getOutputStream();
			workbook.write(fos);
			fos.flush();
			fos.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

附:POI中文文档

三、实现效果:

java实现导出图片+数据的excel文件并返回文件流_第1张图片

四、注意事项:

  1. 代码中使用了URLEncoder.encode(“String类型”,“UTF-8”),解决乱码、url编解码等一些问题。但是在导入包的时候注意要导入 import java.net.URLEncoder; 如果导入com.sun.deploy.net的包就会出现你在本地测试前后端下载是没有问题的,但是部署到服务器上就可能会导致报500,原因就是找不到com.sun.deploy.net中的类。

你可能感兴趣的:(POI,poi,excel,java)