通过需求,要对上传的EXCEL文件进行数据读取并入库。由于EXCEL是由前端直传到阿里云,所以只有一个上传后的文件路径。对于先下载在读取在删除的方式觉得十分耗时且无用,所以试图直接根据URL地址来读取流,生成EXCEL对象并读取数据。代码如下:
public static void main(String[] args) throws IOException {
URL httpurl=new URL("http://*******.xlsx");
URLConnection urlConnection = httpurl.openConnection();
InputStream is = urlConnection.getInputStream();
XSSFWorkbook wb = new XSSFWorkbook (is);
XSSFSheet sheet = wb.getSheetAt(0);
int rowNo = sheet.getLastRowNum();
for (int i = 1; i < rowNo; i++) {s
XSSFRow row = sheet.getRow(i);
XSSFCell cell1 = row.getCell((short) 1);
XSSFCell cell2 = row.getCell((short) 2);
XSSFCell cell3 = row.getCell((short) 3);
String ce1 = cell1 == null?"空":cell1.getStringCellValue();
String ce2 = cell2 == null?"空":cell2.getStringCellValue();
String ce3 = cell3 == null?"空":cell3.getStringCellValue();
System.out.println(ce1 + "\t" + ce2 + "\t" + ce3);
}
}
期间出现的问题有:
1、POI异常解决:java.lang.ClassNotFoundException: org.apache.commons.collections4.ListValuedMap
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
这里用的4.1版本,4.0版本还是解决不了。其他版本的没有试过不知道是否可行。
2、生成EXCEL对象的时候,产生异常。解决readerror和org.apache.poi.poifs.filesystem.OfficeXmlFileException异常
由于HSSFWorkbook针对是 EXCEL2003 版本,扩展名为 .xls;所以 此种的局限就是 导出的行数 至多为 65535 行,此种 因为行数不足七万行 所以 一般不会发生 内存不足的情况(OOM)但是如果读取的文件为2007则会报出此异常。解决办法是使用XSSFWorkbook对象,这种形式的出现 是由于 第一种HSSFWorkbook 的局限性而产生的,因为其所导出的行数比较少,所以 XSSFWookbook应运而生 其 对应的是EXCEL2007+(1048576行,16384列)扩展名 .xlsx,最多可以 导出 104 万行,不过 这样 就伴随着一个问题---OOM 内存溢出,原因是 你所 创建的 book sheet row cell 等 此时是存在 内存的 并没有 持久化,那么 随着 数据量增大 内存的需求量也就增大,那么很大可能就是要 OOM了,那么 怎么解决呢?就需要SXSSFWorkbook poi.jar 3.8+ 因为数据量过大 导致内存吃不消 那么 可以 让内存 到量持久化 吗?答案是 肯定的,此种的情况 就是 设置 最大 内存条数 比如 设置 最大内存量为5000 rows --new SXSSFWookbook(5000),此时 当 行数 达到 5000 时,把 内存 持久化 写到 文件中,以此 逐步 写入 避免OOM,那么这样 就完美解决了 大数据下 导出 的问题
URL httpurl=new URL("http://media-zoomdu.oss-cn-shanghai.aliyuncs.com/trip-file/2640/55443249742470250302167.xlsx");
URLConnection urlConnection = httpurl.openConnection();
InputStream is = urlConnection.getInputStream();
XSSFWorkbook wb = new XSSFWorkbook (is);
3、解决 POI 操作2007格式的Excel报错问题:java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlOptionsz
使用POI库,在实例化XSSFWorkbook对象时(如图2),报 java.lang.ClassNotFoundException: org.apache.xmlbeans.XmlOptions 的错误,经检查,是因为官方包里默认是不包含xmlbean.jar包的,需要自己添加xmlbeans.jar这个包, 如下是需要的依赖JAR
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
4、使用POI扩展包的时候出现「POI java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException」异常,如何解决?
第 1 步
先检查 POI 的其中一个名为「xmlbeans-2.3.0.jar」(版本可能不同)的扩展包是否已经在扩展包目录下了,或者是否已经添加到项目的 Library 里面了。
注:Mac下JRE的扩展包目录为:~/Library/Java/Extensions/
Windows下JRE的扩展包目录为:\java\jre6\lib\ext
第 2 步
检查调用了 POI 的程序里面,XSSFCell 的实例 cell 在调用方法之前有没有检查 cell 是否为 null。若 cell 为 null,同样会抛出「POI java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlException」异常。
文章转自https://blog.csdn.net/u013111003/article/details/79386613