通过需求,要对上传的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
由于依赖没有引入导致,处理方法为引入依赖
org.apache.commons commons-collections4 4.1
这里用的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
org.apache.poi poi 3.8 org.apache.poi poi-ooxml-schemas 3.8 org.apache.xmlbeans xmlbeans 2.6.0 org.apache.poi poi-ooxml 3.8 commons-collections commons-collections 3.2.1 org.apache.commons commons-collections4 4.1