淘宝联盟网站建设,dw做网站首页长宽设置多少,网店erp系统哪个好,海淀区seo搜索优化1、问题 工作中遇到一个需求#xff0c;接收一个zip包#xff0c;读取其中的excel文件并处理#xff0c;减少用户多次选择目录和文件的痛点#xff0c;该zip包包含多级目录
2、依赖 需要用到apache的Workbook类来操作Excel#xff0c;引入以下依赖
dependency接收一个zip包读取其中的excel文件并处理减少用户多次选择目录和文件的痛点该zip包包含多级目录
2、依赖 需要用到apache的Workbook类来操作Excel引入以下依赖
dependencygroupIdorg.apache.poi/groupIdartifactIdpoi-ooxml/artifactIdversion3.9/version
/dependency3、具体实现
public ListWorkbook getExcelsFromZip(MultipartFile multipartFile) {ZipInputStream zis null;ListWorkbook workbooks new ArrayList();try {// 构建zip流zis new ZipInputStream(multipartFile.getInputStream());// 获取文件条目,此方法读取的问zip包中所有条目(目录和文件),多级目录下的所有文件和目录均会被读取ZipEntry zipEntry zis.getNextEntry();while (zipEntry ! null) {// 判断类型是否为文件if (!zipEntry.isDirectory()) {// 获取文件名String fileName zipEntry.getName();/* 后缀名 */int suffixIndex fileName.lastIndexOf(.);String suffix suffixIndex 0 ? fileName.substring(suffixIndex) : ;// 判断是否为excel文件if (.xls.equals(suffix) || .xlsx.equals(suffix)) {/* 读取文件 */ByteArrayOutputStream out new ByteArrayOutputStream();byte[] buffer new byte[1024];int len;// 在调用了getNextEntry()后,zis就指向了获取到的ZipEntry,读取zis流实际就是读取当前ZipEntry,不会读取到其他条目while ((len zis.read(buffer)) 0) {out.write(buffer, 0, len);}ByteArrayInputStream in new ByteArrayInputStream(out.toByteArray());/* 构建Workbook */Workbook wb;if (.xls.equals(suffix)) {// 老版excel格式,使用HSSFWorkbookwb new HSSFWorkbook(in);}else {// 新版excel格式,使用XSSFWorkbookwb new XSSFWorkbook(in);}workbooks.add(wb);// 关闭当前ZipEntry,确保不会重复处理zis.closeEntry();// 获取下一条目zipEntry zis.getNextEntry();}}}} catch (IOException e) {throw new RuntimeException(e);}finally {if (zis ! null) {try {zis.close();} catch (IOException e) {throw new RuntimeException(e);}}}return workbooks;}3、技术要点
1ZipInputStream.getNextEntry()方法 【1】该方法可获取到zip包内的各级目录及各级目录下的文件并不需要进行递归处理。 【2】ZipInputStream实例调用该方法后将会指向获取到的条目这时使用ZipInputStream实例操作的就是获取到的ZipEntry对象。可通过ZipInputStream.closeEntry()和ZipInputStream.getNextEntry()迭代到下一个ZipEntry条目。
2为什么选择ByteArrayInputStream和ByteArrayInputStream获取Workbook 二者是在内存中处理字节的IO流不同于磁盘IO流会在磁盘中创建临时文件读写处理速度会更快在内存中处理数据也符合业务需求。
3为什么不使用Workbook wb WorkbookFactory.create(zis);直接转化 实测使用WorkbookFactory.create(zis)会关闭流导致无法读取后续条目