使用POI在Excel中添加外部图片

本篇的代码主要参考自poi讨论组:http://apache-poi.1045710.n5.nabble.com/Load-remote-image-inside-excel-sheet-td5709821.html

在通常情况下,我们在Excel中添加图片,只要是通过流的方式将图片写入excel特定的picture对象中。网上也有很多的例子,本文主要讲的是如何将一个外部的图片以链接的方式添加进excel中。这样,图片以外链的方式存储,在后台写excel文件时不需要处理图片存储的问题,在下载excel时也不用担心文件太大的问题了。

首先在excel添加外部图片,在添加图片时,只需要选择 以 链接的方式添加即可。这样,在excel时存储时并不需要存储实际图片的内容。这种方式也支持添加网络上的图片。分析这2种不同的添加方式,通过将xlsx文件进行解压(直接将文件修改为zip后缀,再解压即要)之后,在路径 \xl\drawings\_rels下面的文件drawing1.xml.rels可看到以下的不同内容:

<!-- 外部引用存储 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="file:///C:\Users\Administrator\Desktop\图像%202.png" TargetMode="External"/></Relationships>
<!-- 内部引用存储 -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="../media/image1.png"/></Relationships>

同上可以看出,两者的区别就在于一个是引用一个../media的内部地址,实际上就是把整个图片写在内部压缩文件的一个位置上。而外部存储,则实际上直接写的是一个原始的地址。以协议名://地址的方式进行引用。
当然,不相同的地址肯定不只这一种,以上图片只是标识。虽然poi不支持添加外部图片,但通过poi自带的相关API,我们仍是可以添加外部图片的,使用的API,就是poi内部使用的工具openxml4j。

继续阅读“使用POI在Excel中添加外部图片”

使用POI中的SXSSFWorkbook保存大数量级数据信息

在使用jxl保存excel数据时,经常碰到的问题就是保存的数据量太小,超过一定数据量(如7000条)时,就会报内存错误,原因在于所有的数据信息均被保存在内存中,数据量太大时java对象自然增多,内存自然就会出错了。使用poi的常规Excel操作也会出现同样的问题。
解决方法有许多种,比如将excel保存为xml文档,用户直接下载一个xml文档,然后使用excel打开。这种方式不便的就是用户需要显式地进行转换操作。不过值得高兴的是,最新的poi3.8版本,已经提供了以流的方式进行大数据量级的excel写入了。

使用的pom.xml文件如下所示:

              <dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.8-beta3</version>
		</dependency>

注意这里的poi-ooxml版本,一定是3.8-beta3版本,因为3.8正式版还没有。其中使用的写excel操作与常规的写法是一样的。比如如下代码:

  Workbook workbook = new SXSSFWorkbook();//最重要的就是使用SXSSFWorkbook,表示流的方式进行操作
		Sheet sheet = workbook.createSheet();
		int rows = 50000;
		int cols = 20;
		for(int row = 0;row < rows;row++) {
			Row writeRow = sheet.createRow(row);
			for(int col = 0;col < cols;col++) {
				org.apache.poi.ss.usermodel.Cell cell = writeRow.createCell(col);
				cell.setCellStyle(cellStyle);
				cell.setCellValue(row + "-" + col);
			}
		}

		FileOutputStream stream = new FileOutputStream("d:/x.xlsx");
		workbook.write(stream);//最终写入文件
		stream.close();