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

给孩子做的饭网站电脑版传奇

给孩子做的饭网站,电脑版传奇,wordpress微信缩略图不显示,wordpress安装包一、背景 有一次项目的需求要求导出excel#xff0c;并且将不同的数据分别写到不同的sheet中。 二、 方案概述 首先一开始使用easyexcel去导出excel#xff0c;结果发现导出时间需要3秒左右。于是想着能不能缩短excel导出时间#xff0c;于是第一次尝试使用异步线程去查询数…一、背景 有一次项目的需求要求导出excel并且将不同的数据分别写到不同的sheet中。 二、 方案概述 首先一开始使用easyexcel去导出excel结果发现导出时间需要3秒左右。于是想着能不能缩短excel导出时间于是第一次尝试使用异步线程去查询数据库却发现接口的时间并没有明显缩短于是自己就开始排查耗时的操作于是发现是写sheet的时候是串行执行并且每个写sheet的时间并不短尤其在sheet比较多的时候会导致导出的时间比较长。于是想着能不能使用异步线程并发去写sheet但是使用的时候报错。后来去找报错的原因是因为easyexcel并不支持并发写。于是我就转战POI。尝试是否能够并发写入多个sheet。 使用easyexcel写入多个sheet try {response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet);response.setCharacterEncoding(utf-8);// 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系String fileName URLEncoder.encode(EXCEL, UTF-8).replaceAll(\\, %20);response.setHeader(Content-disposition, attachment;filename*utf-8 fileName .xlsx);AtomicInteger atomicInteger new AtomicInteger(0);ExcelWriter build EasyExcel.write(response.getOutputStream(),VirtualInstanceDataPoint.class).build();list.stream().map(i - CompletableFuture.supplyAsync(() - {return service.list();}, executor)).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList()).forEach(r-{int andIncrement atomicInteger.getAndIncrement();WriteSheet build1 EasyExcel.writerSheet(andIncrement, r.get(0).getDevice() andIncrement).build();build.write(r, build1);});build.finish();response.flushBuffer();} catch (Exception e) {// 重置responseresponse.reset();response.setContentType(application/json);response.setCharacterEncoding(utf-8);response.getWriter().println(JSON.toJSONString(R.error().message(e.getMessage()).code(20007))); } 并发写入多个sheet会报 org.apache.poi.openxml4j.exceptions.PartAlreadyExistsException: A part with the name /xl/worksheets/sheet1.xml already exists : Packages shall not contain equivalent part names and package implementers shall neither create nor recognize packages with equivalent part names. [M1.12] POI写入多个sheet String[] EXPORT_HEADER {head1,head2};GetMapping(export3)ApiOperation(value excel导出信息)SneakyThrowspublic void export3(HttpServletResponse response) {OutputStream outputStream response.getOutputStream();response.reset();response.setContentType(application/vnd.ms-excel);response.setHeader(Content-disposition, attachment;filenametemplate.xls);AtomicInteger atomicInteger new AtomicInteger();HSSFWorkbook workbook new HSSFWorkbook();Font font workbook.createFont();font.setBold(true);HSSFCellStyle cellStyle workbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setFont(font);ListIndexData indexDatas new ArrayList();indexDatas.add(new IndexData(1,1.1));indexDatas.add(new IndexData(2,2.2));indexDatas.add(new IndexData(3,3.3));for (IndexData indexData : indexDatas) {HSSFSheet sheet workbook.createSheet(indexData.getStr());HSSFRow row sheet.createRow(0);// 创建表头for (int i 0; i EXPORT_HEADER.length; i) {HSSFCell cell row.createCell(i);cell.setCellValue(EXPORT_HEADER[i]);cell.setCellStyle(cellStyle);}row sheet.createRow(1);row.createCell(0).setCellValue(indexData.getStr());row.createCell(1).setCellValue(indexData.getDoubleData());}workbook.write(outputStream);outputStream.flush();outputStream.close();}static class IndexData {public IndexData(String string, Double doubleData) {this.str string;this.doubleData doubleData;}public String getStr() {return str;}public Double getDoubleData() {return doubleData;}private String str;private Double doubleData;} POI多线程写多个sheet String[] EXPORT_HEADER {head1,head2};GetMapping(export3)ApiOperation(value excel导出)SneakyThrowspublic void export3(HttpServletResponse response) {OutputStream outputStream response.getOutputStream();response.reset();response.setContentType(application/vnd.ms-excel);response.setHeader(Content-disposition, attachment;filenametemplate.xls);AtomicInteger atomicInteger new AtomicInteger();HSSFWorkbook workbook new HSSFWorkbook();Font font workbook.createFont();font.setBold(true);HSSFCellStyle cellStyle workbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setFont(font);ListIndexData indexDatas new ArrayList();indexDatas.add(new IndexData(1,1.1));indexDatas.add(new IndexData(2,2.2));indexDatas.add(new IndexData(3,3.3));indexDatas.stream().map(data -CompletableFuture.runAsync(() -{HSSFSheet sheet workbook.createSheet(data.getStr());HSSFRow row sheet.createRow(0);// 创建表头for (int i 0; i EXPORT_HEADER.length; i) {HSSFCell cell row.createCell(i);cell.setCellValue(EXPORT_HEADER[i]);cell.setCellStyle(cellStyle);}row sheet.createRow(1);row.createCell(0).setCellValue(data.getStr());row.createCell(1).setCellValue(data.getDoubleData());})).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList());workbook.write(outputStream);outputStream.flush();outputStream.close();}static class IndexData {public IndexData(String string, Double doubleData) {this.str string;this.doubleData doubleData;}public String getStr() {return str;}public Double getDoubleData() {return doubleData;}private String str;private Double doubleData;}但是有时候会报错 java.lang.IllegalArgumentException: calculated end index (2576) is out of allowable range (2564..2569) 是因为在 子线程中创建sheet产生并发。 一个解决方案是主线程预先创建sheet 另一个方案是为创建sheet的操作加锁 GetMapping(export1)ApiOperation(value excel导出信息)SneakyThrowspublic void export2(HttpServletResponse response) {OutputStream outputStream response.getOutputStream();response.reset();response.setContentType(application/vnd.ms-excel);response.setHeader(Content-disposition, attachment;filenametemplate.xls);AtomicInteger atomicInteger new AtomicInteger();HSSFWorkbook workbook new HSSFWorkbook();Font font workbook.createFont();font.setBold(true);HSSFCellStyle cellStyle workbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setFont(font);list.stream().map(instanceId - CompletableFuture.runAsync(() - {List collect service.list();HSSFSheet sheet workbook.createSheet(collect.get(0).getDevice() atomicInteger.getAndIncrement());HSSFRow row sheet.createRow(0);// 创建表头for (int i 0; i EXPORT_HEADER.length; i) {HSSFCell cell row.createCell(i);cell.setCellValue(EXPORT_HEADER[i]);cell.setCellStyle(cellStyle);}for (int i 0; i collect.size(); i) {row sheet.createRow(i 1);row.createCell(0).setCellValue(collect.get(i).getInstanceId());row.createCell(1).setCellValue(collect.get(i).getDevice());row.createCell(2).setCellValue(collect.get(i).getDataId());row.createCell(3).setCellValue(collect.get(i).getDataName());}}, executor)).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList());workbook.write(outputStream);outputStream.flush();outputStream.close();} 以下使用加锁方式 String[] EXPORT_HEADER {head1,head2};GetMapping(export3)ApiOperation(value excel导出信息)SneakyThrowspublic void export3(HttpServletResponse response) {OutputStream outputStream response.getOutputStream();response.reset();response.setContentType(application/vnd.ms-excel);response.setHeader(Content-disposition, attachment;filenametemplate.xls);AtomicInteger atomicInteger new AtomicInteger();HSSFWorkbook workbook new HSSFWorkbook();Font font workbook.createFont();font.setBold(true);HSSFCellStyle cellStyle workbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setFont(font);ListIndexData indexDatas new ArrayList();indexDatas.add(new IndexData(1,1.1));indexDatas.add(new IndexData(2,2.2));indexDatas.add(new IndexData(3,3.3));indexDatas.stream().map(data -CompletableFuture.runAsync(() -{HSSFSheet sheet getSheet(data, workbook);HSSFRow row sheet.createRow(0);// 创建表头for (int i 0; i EXPORT_HEADER.length; i) {HSSFCell cell row.createCell(i);cell.setCellValue(EXPORT_HEADER[i]);cell.setCellStyle(cellStyle);}row sheet.createRow(1);row.createCell(0).setCellValue(data.getStr());row.createCell(1).setCellValue(data.getDoubleData());})).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList());workbook.write(outputStream);outputStream.flush();outputStream.close();}org.jetbrains.annotations.NotNullprivate synchronized static HSSFSheet getSheet(IndexData data, HSSFWorkbook workbook) {HSSFSheet sheet workbook.createSheet(data.getStr());return sheet;} 但是这种方式还是会有一些并发带来的错误。 java.lang.NullPointerException: null     at org.apache.poi.hssf.record.SSTSerializer.serialize(SSTSerializer.java:70)     at org.apache.poi.hssf.record.SSTRecord.serialize(SSTRecord.java:279)     at org.apache.poi.hssf.record.cont.ContinuableRecord.getRecordSize(ContinuableRecord.java:60)     at org.apache.poi.hssf.model.InternalWorkbook.getSize(InternalWorkbook.java:1072)     at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWorkbook.java:1474)     at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1386)     at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:1374) 但是在本机实测100个线程10个循环出错的个数在20-30之间 我们可以捕获这些错误使用do while循环当出错的时候可以清空状态再次重试。 总结 该方法只是本菜鸡的愚见使用这种方式的确可以完成并发写sheet缩短接口的相应速度将3秒左右的接口降低到50ms左右。应该能适合sheet略多但并发量、数据量不多的excel导出但本人也是第一次使用POI,所以可能有错误希望大佬们能够多多指点。
http://www.hkea.cn/news/14428086/

相关文章:

  • 西安网易网站建设wordpress开发西瓜
  • 北京建站模板展示移动应用开发是做什么的
  • 平面设计师参考网站建设企业网站登录入口
  • 网站 关键词 出现频率网站建设一对一培训班
  • 龙华做网站联系电话小程序源码加密
  • 网站做成小程序一般通过男网友
  • 怎么做网站有利于收录jsp网站设计教学做一体化教程
  • 昌邑微信网站建设公司在天极网做网站有效果吗
  • 出色的网站设计南京网站的优化
  • 完成网站集约化建设wordpress 注册功能
  • 大连哪家公司做网站比较好wordpress 购买会员
  • 商务网站建设期末考试19年做网站
  • 岳阳手机网站制作手机 网站服务器
  • 建网站的步骤采集微信公众号 做网站
  • 网站备案证书怎么下载不了淘宝网的网络营销方式
  • 东山网站建设wordpress最新app
  • 增长超人做网站多少钱视频解析网站
  • 你第一个物流网站建设方案个人网站建设的计划书
  • 注册公司网站源码有网站如何做淘宝客
  • 网站关键词排名优化系统c 网站开发案例详解
  • 东阳网站建设深圳家园网社区论坛
  • 长沙网站制作合作商企业网站优化的弊端
  • 上市公司网站建设方案小型教育网站的开发建设开题报告
  • 同仁网站建设公司网站app建站多少钱
  • 做神马网站快ireal 网站建设
  • 找南昌兼职做网站的站长工具备案查询
  • 北京网站制作公司哪家好纸箱 技术支持 东莞网站建设
  • 房地产公司网站建设模板广东圆心科技网站开发建站教程详解
  • 有口碑的常州网站建设18款未成年软件入口
  • 品牌网站建设哪家公司好模板素材