当前位置: 首页 > news >正文

网站空间的控制面板首页网站建设维护的知识

网站空间的控制面板首页,网站建设维护的知识,以绿色为主色调的网站,wordpress防止ddos插件1、问题 工作中遇到一个需求&#xff0c;接收一个zip包&#xff0c;读取其中的excel文件并处理&#xff0c;减少用户多次选择目录和文件的痛点&#xff0c;该zip包包含多级目录 2、依赖 需要用到apache的Workbook类来操作Excel&#xff0c;引入以下依赖 <dependency>&l…

1、问题

 工作中遇到一个需求,接收一个zip包,读取其中的excel文件并处理,减少用户多次选择目录和文件的痛点,该zip包包含多级目录

2、依赖

 需要用到apache的Workbook类来操作Excel,引入以下依赖

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

3、具体实现

public List<Workbook> getExcelsFromZip(MultipartFile multipartFile) {ZipInputStream zis = null;List<Workbook> 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、技术要点

(1)ZipInputStream.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)会关闭流,导致无法读取后续条目

http://www.yayakq.cn/news/731413/

相关文章:

  • 携程网站建设目的北京发布会直播回放
  • 钰鸣厦门网站建设做渔家乐推广的有哪些好网站
  • 工作做ppt课件的网站在阿里云里网站建设的步骤过程
  • 成都网站建设推广教师网络培训和服务平台
  • 苏州找工作网站有哪些谷歌做新媒体运营的网站
  • 网站关键词优化办法公司网站站建设协议
  • 怎么提高网站的百度收录旅游网站建设有哪些不足
  • 贵州省住房和城乡建设厅网站首页织梦装修设计网站模板
  • 有域名如何做免费网站做网站需要会什么编程
  • 做电商网站的上海公司店面设计多少钱一个平方
  • 百度付费推广的费用百度seo优化技巧
  • 阿里云虚拟主机网站营销推广方案案例
  • 贵阳58同城做网站公司百度投诉电话
  • 最新公司起名大全免费长沙seo网站排名优化公司
  • 网站更新内容wordpress指定ip登陆
  • 成都郫县网站建设关于网站建设外文文献
  • 公司网站建设需要注意的地方网站建设的开发的主要方法
  • 电商网站建设讯息网站栏目建设图
  • 视频播放网站模板荆州 网站建设
  • 济南快速网站制作公司企业网站建设定制网站建设公司
  • 电脑网站首页设计网络运营商无服务
  • 产品微信网站建设建模师培训机构有哪些
  • 做网站建设很赚钱吗wordpress 显示当前位置
  • 宿州网站建设报价网站软件开发招聘
  • 如何创建广告网站东莞建站公司速推全网天下首选
  • 南宁网站建设seo优化营销制作菏泽做企业网站
  • 大庆网站开发制作百度手机助手官网下载
  • 著名外国网站网页ui素材
  • 一个网站源代码概多大网站的类型是什么意思
  • 龙岩做网站开发价格wordpress刷关键词