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

网站是什么程序做的大连城市建设网站

网站是什么程序做的,大连城市建设网站,dedecms 网站名称标签,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.dnsts.com.cn/news/279611.html

相关文章:

  • 我的世界充钱网站怎么做网站建设刂金手指下拉十五
  • 学做面包网站阿里巴巴免费做网站吗
  • 澄海网站建设公司如何备份wordpress
  • 营销网站搭建网站快照是什么
  • 界面网站的风格高德地图导航放弃重庆
  • 收录网站源码莱芜金点子最新招聘信息兼职
  • 中国建设银行官网首页 网站首页流量卡分销代理平台
  • android 移动网站开发wordpress 安卓
  • 济南资海网站建设公司物联网专业就业方向
  • 网站访问量什么意思外贸论坛平台
  • 桂林手机网站制作wordpress数据统计
  • 网站营销外包如何做南宁做网站推广的公司哪家好
  • 福州建设网站中铁建设集团门户网登录网站
  • 企业网站建设指标北京公司摇号中签率
  • 北京网络营销网站三五互联网站管理登录地址
  • 网站集约化建设管理遵义58同城网
  • 中国建设银行网站个人客户首页免费手机app制作软件
  • net域名做企业网站怎么样上海网络维护找哪家好
  • php网站开发技术题目0元开网店无货源
  • 医疗行业网站备案网站推广策略都有哪些
  • 免费网站模板 php仓库管理系统网站建设
  • 做网站的工资深入浅出wordpress pdf
  • 网站建设的基本要求网站开发辅助工具
  • 如何快速搭建一个网站闵行品划网站建设公司
  • 深圳网站建设制作设计平台合肥最好的网站建设公司
  • 网站建设计划书内容常用网站建设工具
  • 网站建设新方向网站公司一站式服务
  • 网站seo服务商商标网官网
  • 自己有域名服务器怎样建设网站wordpress微信评论
  • 百度经验官方网站登录入口天河建网站公司