Java分页导出Excel文件

  • 1、开发微信小程序接入广告获取收益
  • 技术: Springboot + mongodb + maven +Layui + thymeleaf

上一篇博客已经讲解了Java怎样导出Excel,但是遇到数据量大时导出时就会有性能问题于是就写了分页导出Excel

1、开发微信小程序接入广告获取收益

技术: Springboot + mongodb + maven +Layui + thymeleaf

导入jar包

 <!-- Excel文件导入 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency>

前端页面

<div style="padding-bottom: 10px;"><button id="js-export" type="button" class="layui-btn btn btn-primary">导出Excel</button>
</div>//Js
//导出所有数据到Excel ps:参数是你要查询导出数据的条件,全部导出不用加条件
$('#js-export').click(function(){window.location.href="/admin/signUserInfo/export?name=" + $("#name").val() + "&sex=" + $("#sex").val() + "&phone=" + $("#phone").val();
});

util工具类

package com.huan.qycq.util;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class ExcelUtil {/**** @Description: 根据接口 生成 相应的 excel* @author cheng.hao* @param title  excelsheet名称* @param headers  thead* @param jarray   json 返回的jarray* @param infields  传入的 要显示的字段*/@SuppressWarnings("deprecation")public static HSSFSheet createExcelSheet(String title, String[] headers, JSONArray jarray, String[] infields, HSSFWorkbook workbook) throws Exception {// 生成一个sheet 并设置名称HSSFSheet sheet = workbook.createSheet(title);// 设置表格默认列宽度为15个字节sheet.setDefaultColumnWidth((short) 20);//sheet.setDefaultRowHeightInPoints((float)1.4) ;// 生成一个样式HSSFCellStyle style = workbook.createCellStyle();// 设置这些样式style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 生成一个字体HSSFFont font = workbook.createFont();font.setColor(HSSFColor.VIOLET.index);font.setFontHeightInPoints((short) 12);font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 把字体应用到当前的样式style.setFont(font);// 生成并设置另一个样式HSSFCellStyle style2 = workbook.createCellStyle();style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);style2.setBorderRight(HSSFCellStyle.BORDER_THIN);style2.setBorderTop(HSSFCellStyle.BORDER_THIN);style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 生成另一个字体HSSFFont font2 = workbook.createFont();font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);// 把字体应用到当前的样式style2.setFont(font2);/*// 声明一个画图的顶级管理器HSSFPatriarch patriarch = sheet.createDrawingPatriarch();*/// 产生表格标题行HSSFRow row = sheet.createRow(0);for (short i = 0; i < headers.length; i++) {HSSFCell cell = row.createCell(i);cell.setCellStyle(style);HSSFRichTextString text = new HSSFRichTextString(headers[i]);cell.setCellValue(text);}// 遍历集合数据,产生数据行// Iterator<T> it = dataset.iterator();int sames  = 0 ;JSONArray j_array_combile = new JSONArray() ;for(int i = 0 ;i<jarray.size();i++){j_array_combile.add(jarray.getJSONObject(i)) ;// 是否是最后一条记录的开关boolean last = (i == jarray.size() - 1);// 取出相邻的两条记录进行比较JSONObject csl1 = null;JSONObject csl2 = null;if (!last) {csl1 = jarray.getJSONObject(i);csl2 = jarray.getJSONObject(i + 1);} else {// 防止最后一条记录无法加入集合csl1 = jarray.getJSONObject(i);if (jarray.size() != 1)csl2 = jarray.getJSONObject(i - 1);elsecsl2 = jarray.getJSONObject(i);}// 默认 是 表头的  第一个字段 进行合并if(!csl1.get(infields[0]).toString().equals(csl2.get(infields[0]).toString())){JSONObject t_jobj = new JSONObject() ;t_jobj.put("sames", sames) ;j_array_combile.add(t_jobj) ;sames = 0  ;}else{sames++ ; //}}int index = 0;for (int i = 0; i < j_array_combile.size(); i++) {JSONObject jobj = j_array_combile.getJSONObject(i);if(jobj.get("sames")==null){index++;row = sheet.createRow(index);// 根据传入的 字段数组 取值int cellIndex  = 0 ;for (String field : infields) {HSSFCell cell = row.createCell(cellIndex);cell.setCellStyle(style2);Object value = jobj.get(field);// 判断值的类型后进行强制类型转换String textValue = "";if(!WebUtils.isEmpty(value)){textValue = value.toString();}if (textValue != null) {Pattern p = Pattern.compile("^//d+(//.//d+)?$");Matcher matcher = p.matcher(textValue);if (matcher.matches()) {// 是数字当作double处理cell.setCellValue(Double.parseDouble(textValue));} else {HSSFRichTextString richString = new HSSFRichTextString(textValue);HSSFFont font3 = workbook.createFont();font3.setColor(HSSFColor.BLUE.index);richString.applyFont(font3);cell.setCellValue(richString);}}cellIndex++ ;}}else{int same = jobj.getIntValue("sames") ;// 进行合并if(same!=0)sheet.addMergedRegion(new CellRangeAddress((index-same), index, 0, 0));//  横向 合并    第几行 到第几行  第几列 到第几列}}return sheet;}
}

Controller

/*** 导出报表* @return*/@RequestMapping(value = "/export")@ResponseBodypublic void export(HttpServletResponse response,@RequestParam(value = "name", required = false) String name,@RequestParam(value = "sex", required = false) String sex,@RequestParam(value = "phone", required = false) String phone) throws Exception {File file = new File("exportexcel.xls");try {// 声明一个工作薄HSSFWorkbook workbook2 = new HSSFWorkbook();//获取头部标题String[] headers = {"用户code","用户名","电话","地址","性别","签到次数"};//查询要导出的数据,第一页查1000条Page<SignUserInfo> page = signUserInfoService.queryFindSignUserInfos(1, 1000, name, sex, phone);//获取显示字段String[] infields = {"userCode","name","phone","address","sex","count"};//循环分页查询,每页1000条int pageNo = 1;while(null != page.getData() && page.getData().size() > 0){JSONArray jsonArray = new JSONArray();for (SignUserInfo entity: page.getData()) {JSONObject jsonObj = new JSONObject();jsonObj.put("userCode", entity.getUserCode());jsonObj.put("name", entity.getName());jsonObj.put("phone", entity.getPhone());jsonObj.put("address", entity.getAddress());jsonObj.put("sex", entity.getSex());jsonObj.put("count", entity.getCount());jsonArray.add(jsonObj);}//调用util的方法,写入excelExcelUtil.createExcelSheet("签到信息" + pageNo, headers, jsonArray, infields, workbook2);pageNo++;//这里循环查要导出的数据,每查一次就是一页page = signUserInfoService.queryFindSignUserInfos(pageNo, 1000, name, sex, phone);}// 告诉浏览器用什么软件可以打开此文件response.setHeader("content-Type", "application/vnd.ms-excel");// 下载文件的默认名称response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("签到信息.xls", "utf-8"));ServletOutputStream out = response.getOutputStream();workbook2.write(out);out.close();} catch (FileNotFoundException e) {logger.error(""+e);} catch (Exception e) {logger.error(""+e);}}

效果图:

Java分页导出Excel文件相关推荐

  1. java导入导出excel文件

    前言:该文章使用java集成poi来操作excel文件,此处只对poi相关api进行代码编写,对于poi的理论性知识,可在学习完这篇文章后,自行百度学习.建议大家跟着文章敲一遍代码. 创建一个mave ...

  2. java ajax 导出excel文件_springMVC(4)---生成excel文件并导出

    springMVC(4)---生成excel文件并导出 在开发过程中,需要将数据库中的数据以excel表格的方式导出. 首先说明.我这里用的是Apache的POI项目,它是目前比较成熟的HSSF接口, ...

  3. java后端导出excel文件流,前端vue接收下载

    1.后端excel导出工具类 主要依赖 <!--工具包--><dependency><groupId>cn.hutool</groupId><ar ...

  4. Java web导出excel文件 - poi

    Javaweb项目加入导出excel功能只需要2个步骤: 1.在需要的controller里面加入下面接口代码: /*** excel导出controller层代码** @param params* ...

  5. JAVA导入/导出EXCEL文件,自定义校验,错误回写excel,使用简单快捷

    github地址: https://github.com/alan-et/alanpoi/tree/develop/alanpoi-analysis 项目中使用: <dependency> ...

  6. Java poi插件导出Excel文件合并多sheet页

    文章目录 一.java导出excel格式文件 二.excel文件多sheet页合并 前言:2020年第一篇文章,就写这两天工作中遇到的这个小需求吧,导出多excel,每个excel有多个sheet页, ...

  7. java导入、导出Excel文件

    一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...

  8. Java web中不同浏览器间导出Excel文件名称乱码问题解决方案

    Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 参考文章: (1)Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 (2)https://www.cnblog ...

  9. Java导出excel文件以.xlsx后缀结尾,可设置部分单元格只读

    前言 最近在做一个小项目,有个模块的功能涉及到excel的导入导出,并且要求对导出的excel文件部分列和单元格设置为只读不可更改,在网上到处查找了一番资料,结合自己的想法,发现也并不难,这里整理记录 ...

最新文章

  1. eclipse的怪问题。background indexer crash recovery .java.lang.OutOfMemoryError: Java heap space
  2. 平衡二叉查找树插入节点操作( AVLTree ):旋转、调整平衡
  3. POJ1321(KB1-A 简单搜索)
  4. c语言数组求出最大值,求给定数组的最大值与次大值
  5. js系列教程9-表单元素全解
  6. jquery几种常用框架比较
  7. 移动WebApp开发 JS框架对比
  8. P2P网络及节点发现机制
  9. 中值滤波(Median filtering)
  10. 雷云3计算机不满足系统要求,电工进网作业许可考试(高压类)4、5、6章题库(无答案)...
  11. word中图片转html失真,word中全部图片如何原样保存到本地保持不失真
  12. 利用计算机来对指纹,指纹识别系统(文献综述).doc
  13. windows10安装MySQL8.0
  14. swift-UIStoryboard故事板
  15. 线性回归模型 —— 普通最小二乘法(OLS)推导与python实现
  16. #Visio#教会你怎么安装和使用 Visio 哦 ~ ~
  17. 喻世明言 第三十一卷 闹阴司司马貌断狱(讲三国是如何开始的)
  18. centos7FastDFS分布式安装部署
  19. 并发线程和线程间通信(event、mailbox和semaphore)-systemVerilog
  20. JC机制与JVM内存区域

热门文章

  1. 阿里菜鸟架构师:如何设计能抗住“双11”的交易系统架构?
  2. 近7成开发者无开源收入、最想操作系统开源、Java最受欢迎 | 揭晓中国开源开发者现状
  3. 相似度计算——余弦相似度
  4. scrapy简单入门 - 爬取伯乐在线所有文章
  5. Python爬虫爬取伯乐在线网站信息
  6. (简易)一元三次方程拆分/求根方法
  7. Cows and Cars
  8. B站投放管理功能上线!领取你的专属投放报告
  9. P2657 [SCOI2009]windy数(数位dp)
  10. Python--长连接与短链接(TCP)