Java实现excel大数据量导出
1.pom.xml配置依赖包
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.9</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version>
</dependency>
2.excel导出工具类
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletResponse;import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;public class ExportExcel {/*** 导出excel* * @param response* HttpServletResponse* @param list* 导出数据集合* @param lables * 表头数组* @param fields* key数组* @param title * 文件名*/public static void export(HttpServletResponse response,List<Map<String, Object>> list,String[] lables,String[] fields,String title) { response.setContentType("application/octet-stream");//告诉浏览器输出内容为流String filename = "";try {filename = new String(title.getBytes("UTF-8"), "ISO_8859_1");} catch (UnsupportedEncodingException e1) {e1.printStackTrace();}response.setHeader("Content-Disposition","attachment;filename=" + filename);OutputStream os = null;SXSSFWorkbook sxssfWorkbook = null;try { // 获取SXSSFWorkbooksxssfWorkbook = new SXSSFWorkbook();Sheet sheet = sxssfWorkbook.createSheet("Sheet1");// 冻结第一行sheet.createFreezePane(0, 1); // 创建第一行,作为header表头Row header = sheet.createRow(0);// 循环创建header单元格for (int cellnum = 0; cellnum < lables.length; cellnum++) {Cell cell = header.createCell(cellnum);//cell.setCellStyle(getAndSetXSSFCellStyleHeader(sxssfWorkbook));//设置表头单元格样式,根据需要设置cell.setCellValue(lables[cellnum]);//设置每列固定宽度sheet.setColumnWidth(cellnum, 20 * 256);}// 遍历创建行,导出数据for (int rownum = 1; rownum <= list.size(); rownum++) {Row row = sheet.createRow(rownum);Map<String, Object> map = list.get(rownum-1);// 循环创建单元格for (int cellnum = 0; cellnum < fields.length; cellnum++) {Cell cell = row.createCell(cellnum);//cell.setCellStyle(getAndSetXSSFCellStyleOne(sxssfWorkbook));//设置数据行单元格样式,根据需要设置cell.setCellValue(map.get(fields[cellnum]) == null ? "" : map.get(fields[cellnum]).toString());}}//自定义各列宽度//setSheet(sheet);os = response.getOutputStream(); sxssfWorkbook.write(os);} catch (Exception e) {e.printStackTrace();} finally {try {if(sxssfWorkbook != null) {//处理SXSSFWorkbook导出excel时,产生的临时文件sxssfWorkbook.dispose();}if(os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 导出excel带标题* * @param response* HttpServletResponse* @param list* 导出数据集合* @param lables * 表头数组* @param fields* key数组* @param title * 文件名* @param headTitle * 文件标题*/public static void titleExport(HttpServletResponse response,List<Map<String, Object>> list,String[] lables,String[] fields,String title,String headTitle) { response.setContentType("application/octet-stream");//告诉浏览器输出内容为流String filename = "";try {filename = new String(title.getBytes("UTF-8"), "ISO_8859_1");} catch (UnsupportedEncodingException e1) {e1.printStackTrace();}response.setHeader("Content-Disposition","attachment;filename=" + filename);OutputStream os = null;SXSSFWorkbook sxssfWorkbook = null;try { // 获取SXSSFWorkbooksxssfWorkbook = new SXSSFWorkbook();Sheet sheet = sxssfWorkbook.createSheet("Sheet1");// 创建第一行,作为标题Row headline = sheet.createRow(0);Cell c = headline.createCell(0);//设置居中XSSFCellStyle xssfCellStyle = (XSSFCellStyle) sxssfWorkbook.createCellStyle();xssfCellStyle.setAlignment(HorizontalAlignment.CENTER);c.setCellStyle(xssfCellStyle);c.setCellValue(headTitle);sheet.addMergedRegion(new CellRangeAddress(0,0,0,lables.length-1));//合并单元格(起始行号,终止行号,起始列号,终止列号)// 冻结第二行sheet.createFreezePane(0, 2); // 创建第二行,作为header表头Row header = sheet.createRow(1);// 循环创建header单元格for (int cellnum = 0; cellnum < lables.length; cellnum++) {Cell cell = header.createCell(cellnum);//cell.setCellStyle(getAndSetXSSFCellStyleHeader(sxssfWorkbook));//设置表头单元格样式,根据需要设置cell.setCellValue(lables[cellnum]);//设置每列固定宽度sheet.setColumnWidth(cellnum, 10 * 256);}// 遍历创建行,导出数据for (int rownum = 1; rownum <= list.size(); rownum++) {Row row = sheet.createRow(rownum+1);Map<String, Object> map = list.get(rownum-1);// 循环创建单元格for (int cellnum = 0; cellnum < fields.length; cellnum++) {Cell cell = row.createCell(cellnum);//cell.setCellStyle(getAndSetXSSFCellStyleOne(sxssfWorkbook));//设置数据行单元格样式,根据需要设置cell.setCellValue(map.get(fields[cellnum]) == null ? "" : map.get(fields[cellnum]).toString());}}//自定义各列宽度//setSheet(sheet);os = response.getOutputStream(); sxssfWorkbook.write(os);} catch (Exception e) {e.printStackTrace();} finally {try {if(sxssfWorkbook != null) {//处理SXSSFWorkbook导出excel时,产生的临时文件sxssfWorkbook.dispose();}if(os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 导出excel(多个工作薄)* * @param response* HttpServletResponse* @param datas* 导出数据集合* @param title * 文件名*/public static void exportSheets(HttpServletResponse response,List<Map<String, Object>> datas,String title) { response.setContentType("application/octet-stream");//告诉浏览器输出内容为流String filename = "";try {filename = new String(title.getBytes("UTF-8"), "ISO_8859_1");} catch (UnsupportedEncodingException e1) {e1.printStackTrace();}response.setHeader("Content-Disposition","attachment;filename=" + filename);OutputStream os = null;SXSSFWorkbook sxssfWorkbook = null;try { // 获取SXSSFWorkbooksxssfWorkbook = new SXSSFWorkbook();// 根据集合的数量创建sheetfor(int i=0; i<datas.size(); i++){Sheet sheet = sxssfWorkbook.createSheet("Sheet"+(i+1));// 冻结第一行sheet.createFreezePane(0, 1); // 创建第一行,作为header表头Row header = sheet.createRow(0);// 循环创建header单元格String[] lables = (String[]) datas.get(i).get("lables");String[] fields = (String[]) datas.get(i).get("fields");for (int cellnum = 0; cellnum < lables.length; cellnum++) {Cell cell = header.createCell(cellnum);//cell.setCellStyle(getAndSetXSSFCellStyleHeader(sxssfWorkbook));//设置表头单元格样式,根据需要设置cell.setCellValue(lables[cellnum]);//设置每列固定宽度sheet.setColumnWidth(cellnum, 20 * 256);}// 遍历创建行,导出数据List<Map<String, Object>> list = (List<Map<String, Object>>) datas.get(i).get("list");for (int rownum = 1; rownum <= list.size(); rownum++) {Row row = sheet.createRow(rownum);Map<String, Object> map = list.get(rownum-1);// 循环创建单元格for (int cellnum = 0; cellnum < fields.length; cellnum++) {Cell cell = row.createCell(cellnum);//cell.setCellStyle(getAndSetXSSFCellStyleOne(sxssfWorkbook));//设置数据行单元格样式,根据需要设置cell.setCellValue(map.get(fields[cellnum]) == null ? "" : map.get(fields[cellnum]).toString());}}}os = response.getOutputStream(); sxssfWorkbook.write(os);} catch (Exception e) {e.printStackTrace();} finally {try {if(sxssfWorkbook != null) {//处理SXSSFWorkbook导出excel时,产生的临时文件sxssfWorkbook.dispose();}if(os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 自定义各列宽度(单位为:字符宽度的1/256)*/private static void setSheet(Sheet sheet) { sheet.setColumnWidth(0, 32 * 256);sheet.setColumnWidth(1, 32 * 256);sheet.setColumnWidth(2, 20 * 256);sheet.setColumnWidth(3, 20 * 256);sheet.setColumnWidth(4, 20 * 256);sheet.setColumnWidth(5, 20 * 256);sheet.setColumnWidth(6, 20 * 256);sheet.setColumnWidth(7, 20 * 256);sheet.setColumnWidth(8, 20 * 256);sheet.setColumnWidth(9, 20 * 256);sheet.setColumnWidth(10, 32 * 256);}/*** 获取并设置header样式*/private static XSSFCellStyle getAndSetXSSFCellStyleHeader(SXSSFWorkbook sxssfWorkbook) {XSSFCellStyle xssfCellStyle = (XSSFCellStyle) sxssfWorkbook.createCellStyle();Font font = sxssfWorkbook.createFont();// 字体大小font.setFontHeightInPoints((short) 14);// 字体粗细font.setBoldweight((short) 20);// 将字体应用到样式上面xssfCellStyle.setFont(font);// 是否自动换行xssfCellStyle.setWrapText(false);// 水平居中xssfCellStyle.setAlignment(HorizontalAlignment.CENTER);// 垂直居中xssfCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);return xssfCellStyle;}/*** 获取并设置样式*/private static XSSFCellStyle getAndSetXSSFCellStyleOne(SXSSFWorkbook sxssfWorkbook) {XSSFCellStyle xssfCellStyle = (XSSFCellStyle) sxssfWorkbook.createCellStyle();XSSFDataFormat format = (XSSFDataFormat)sxssfWorkbook.createDataFormat();// 是否自动换行xssfCellStyle.setWrapText(false);// 水平居中xssfCellStyle.setAlignment(HorizontalAlignment.CENTER);// 垂直居中xssfCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 前景颜色xssfCellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);xssfCellStyle.setFillForegroundColor(IndexedColors.AQUA.getIndex());// 边框xssfCellStyle.setBorderBottom(BorderStyle.THIN);xssfCellStyle.setBorderRight(BorderStyle.THIN);xssfCellStyle.setBorderTop(BorderStyle.THIN);xssfCellStyle.setBorderLeft(BorderStyle.THIN);xssfCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());xssfCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());xssfCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());xssfCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());// 防止数字过长,excel导出后,显示为科学计数法,如:防止8615192053888被显示为8.61519E+12xssfCellStyle.setDataFormat(format.getFormat("0"));return xssfCellStyle;}
}
3.业务层调用
//导出
@RequestMapping("/export")
public String export(Model model,HttpServletRequest request,HttpServletResponse response) {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("导出开始时间:"+format.format(new Date()));List<Map<String, Object>> list = jkconfigDao.exportByRksj();//查询业务数据String[] lables = new String[]{"号码","入库时间"};//表头数组String[] fields = new String[]{"HM","RKSJ"};//查询数据对应的属性数组String title = "测试.xlsx";ExportExcel.export(response, list, lables, fields, title); System.out.println("导出结束时间:"+format.format(new Date()));return null;
}
Java实现excel大数据量导出相关推荐
- java百万级大数据量导出
java实现百万级大数据量导出 实现方式一 一,分析 excel导出如果数据量过大,会出现两个内存溢出的问题 查绚数据量过大,导致内存溢出(可通过分批查绚解决) 下载的时候大EXCEL转换的输出流内存 ...
- Java实现excel大数据量导入
情景分析: 通常我们通过poi读取excel文件时,若在用户模式下,由于数据量较大.Sheet较多,很容易出现内存溢出的情况 用户模式读取excel的典型代码如下: FileInputStream f ...
- java大数据量导出csv文件并压缩
java大数据量导出csv文件并压缩 java使用POI大数据量导出excel一般会存在以下几个问题: 一次从数据库查询出这么大数据,查询缓慢 查询数据量过大时会内存溢出 解决方案:分页查询数据,比如 ...
- 大数据导出excel大小限制_大数据量导出Excel的方案
测试共同条件: 数据总数为110011条,每条数据条数为19个字段. 电脑配置为:P4 2.67GHz,1G内存. 一.POI.JXL.FastExcel比较 POI.JXL.FastExcel均为j ...
- 大数据导出excel大小限制_EXCEL大数据量导出的解决方案
将web页面上显示的报表导出到excel文件里是一种很常见的需求.润乾报表的类excel模型,支持excel文件数据无失真的导入导出,使用起来非常的方便.然而,当数据量较大的情况下,excel本身的支 ...
- 【Apache POI】Excel操作(四):Excel大数据量的写入
迷茫代表着你身边还有选择,焦虑意味着你手上还有时间. 有目录,不迷路 前言 超量数据 速率比较 原因剖析 超级版本大救星 往期回顾 前言 之前在下面这期Excel操作: [Apache POI]Exc ...
- EasyExcel 分Sheet实现大数据量导出
EasyExcel 分 Sheet 实现大数据量导出 [场景]平台用户导出数据量达 w 级别的数据时界面白屏或按钮无响应. [解决方案]做异步导出,用户触发点击时创建导出消息并开启单独线程处理导出,处 ...
- Apache POI和EasyExcel 第三集:Apache POI的Excel大数据量写入(分为03版的xls、07版的xlsx、升级版SXSSF)
Apache POI和EasyExcel 第三集:Apache POI的Excel大数据量写入(分为03版的xls.07版的xlsx.升级版SXSSF) 一.结果 我的03跑了1.204秒,07跑了5 ...
- 读取excel大数据量详解
需求:导入大数据量excel文件到数据库(测试11MB,40w行数据) 首先说结论:都是大概时间,且其中有两个参数需要调,这里统一下参数大小. 监听器中的缓存list一次性存100000(测试过100 ...
最新文章
- 非凡推崇_2015年值得推崇的25位编码者
- mysql join order by_MySQL 14 慢查询优化join、order by、group by
- 有赞分层自动化测试实践
- Linux内核实现中断和中断处理(二)
- word List 43
- API 层实现语音录制
- vue 新建的页面如何访问_Vue.js—实现前后端分离架构中前端页面搭建(四)(完)...
- 洛谷 P2167 [SDOI2009]Bill的挑战
- Ubuntu使用——9(搜狗输入法安装)
- Office word for Mac 如何并排查看两个文档
- 【打一局王者荣耀掉星的时间,我制作了一款支持 重力感应 的 3D动态壁纸】
- 根据HttpServletRequest获取用户IP地址及判断当前IP是否是内网IP
- 穆斯林的葬礼-(爱情,是人类最美好的感情)
- 数据挖掘_task2数据探索分析
- plt.title 设置标题或标注和图片之间的距离
- 思维模型 塔西陀陷阱
- thinkphp6控制器
- symbian学习转载
- openwrt的dns无法解析内网地址的问题解决方案
- 富爸爸,穷爸爸读后的一些认知
热门文章
- java实验及答案_JAVA实验4-1答案
- 上海迪士尼度假区将推出一系列节庆活动和全新“萌聚达菲月”
- ajax中英文切换,vue-i18n中英切换插件使用
- 关于Win10上Program File和Program File(X86)没有写权限的问题
- c语言图像压缩编码,基于C语言的图像压缩算法
- HC-SR04超声波模块程序原理和Proteus ISIS仿真
- while(n)什么意思?
- 1w存银行一年多少利息_我把100万存银行一年利息是多少钱?
- uni-app 地图手绘图覆盖方案,类似智慧景区小程序
- 一起学Python吧~Python3调用Ansible项目实战