众所周知,每个Excel文件最多可以存储255个sheet。当需要导出的sheet数超过255个时,比较好的办法是将多个Excel文件压缩成.zip文件再导出

步骤:1 将需要导出的表封装到listBean中

2 将list中表每隔255个sheet导出到一个Excel文件

3 将Excel文件生成压缩文件导出

package com.mobile.main;import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class ExportTable {public String exportTable() {//得到所有需要导出的表信息,一个表放在一个sheet中List<ExportTableBean> exportTableBean = getTableBeanService.getAllTable();//导出文件路径(这里也可以写成固定路径"D:/tmp")String filePath = System.getProperty("catalina.base") + File.separator + "tmp";//创建此路径makeDirs(filePath);//得到此路径下文件File fileDir = new File(filePath);File[] fileDirs = fileDir.listFiles();//删除此目录下文件for (int i = 0; i < fileDirs.length; i++) {File tmp = fileDirs[i];tmp.delete();}//导出Excel文件路径String fullFilePath = "";//导出压缩文件路径String zipFilePath = "";//保存文件名String fileName = "";FileOutputStream os = null;//每个Excel文件中第一个sheet中的表对应list中的开始下标int index = 0;//Excel的个数-1,用来计算list开始下标int count = 0;try {//如果表个数不超过254个,则导出Excel文件,否则导出压缩文件if(null != exportTableBean && exportTableBean.size() > SheetNumber){//计算需要导出的表个数,即sheet个数int size = exportTableBean.size();//用于存放生成的excel文件名称  List<String> fileNames = new ArrayList<String>();//导出压缩文件的全路径zipFilePath = filePath + File.separator + "cwm_" + System.currentTimeMillis() + ".zip";File zip = new File(zipFilePath);while (size - SheetNumber > 0 || size > 0) {fileName = "cwm_" + System.currentTimeMillis() + ".xlsx";//导出excel的全路径fullFilePath = filePath + File.separator + fileName;fileNames.add(fullFilePath);os = new FileOutputStream(fullFilePath);index = count * SheetNumber;//list中表依次导入excel文件XSSFWorkbook wb = createColumnXSSF(exportTableBean,index);// 写文件wb.write(os);count++;size -= SheetNumber;}//将excel文件生成压缩文件File srcfile[] = new File[fileNames.size()];  for (int j = 0, n1 = fileNames.size(); j < n1; j++) {  srcfile[j] = new File(fileNames.get(j));  }  ZipFiles(srcfile, zip);  }else{fileName = "cwm_" + System.currentTimeMillis() + ".xlsx";zipFilePath = filePath + File.separator + fileName;os = new FileOutputStream(zipFilePath);//list中表依次导入excel文件XSSFWorkbook wb = createColumnXSSF(exportTableBean,0);// 写文件wb.write(os);}} catch (FileNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{// 关闭输出流if(null != os){try {os.close();} catch (IOException e) {e.printStackTrace();}}}return zipFilePath;}//压缩文件  public void ZipFiles(File[] srcfile, File zipfile) {  byte[] buf = new byte[1024];  try {  ZipOutputStream out = new ZipOutputStream(new FileOutputStream(  zipfile));  for (int i = 0; i < srcfile.length; i++) {  FileInputStream in = new FileInputStream(srcfile[i]);  out.putNextEntry(new ZipEntry(srcfile[i].getName()));  int len;  while ((len = in.read(buf)) > 0) {  out.write(buf, 0, len);  }  out.closeEntry();  in.close();  }  out.close();  } catch (IOException e) {  e.printStackTrace();  }  } /*** 创建目标路径中文件夹* @param folderName* @return*/public static boolean makeDirs(String folderName) {if (folderName == null || folderName.isEmpty()) {return false;}File folder = new File(folderName);return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();}/*** 将表信息写入Excel* @param sheet* @param metadataList* @return*/public XSSFWorkbook createColumnXSSF(List<ExportTableBean> exportTableBeanList,int start) {//创建workbookXSSFWorkbook workbook = new XSSFWorkbook();//创建样式XSSFCellStyle cellStyle =workbook.createCellStyle();cellStyle.setWrapText(true);//自动换行XSSFSheet sheet_first = workbook.createSheet("说明");// 第一个表不填// 合并单元格(开始行,结束行,开始列,结束列)sheet_first.addMergedRegion(new CellRangeAddress(0, 2, 0, 4));Cell cell = sheet_first.createRow(0).createCell(0);cell.setCellValue("    一个sheet放一个表的信息,第一个sheet放说明等信息,真正的表信息数据从第二个sheet开始。\n sheet名为表名+'_'+目前表个数");cell.setCellStyle(cellStyle);int sheetCount = 1;String sheetName = "";for(int k = start;k < (start + SheetNumber);k++){//如果list的size小于等于k,就停止if(exportTableBeanList.size() <= k){break;}//list是有序的,从k开始ExportTableBean exportTableBean = exportTableBeanList.get(k);// 给每个元数据表创建一个sheet//为了sheet名不重复,对表名进行截取(Excel中sheet名不得超过31位)sheetName = exportTableBean.getTableName();if(sheetName.length() > 27){sheetName = sheetName.substring(0, 27);}//每个excel文件最多容纳255sheetif(sheetCount > 255){break;}//sheet名为表名_表个数XSSFSheet sheet = workbook.createSheet(sheetName + "_" + (sheetCount++));// 纵向固定值写入sheet.autoSizeColumn(1, true);//index记录当前行数int index = 0;// 把表版本写入sheet.createRow(index++).createCell(1).setCellValue(exportTableBean.getVersion());// 把表名写到Excel表中sheet.createRow(index++).createCell(1).setCellValue(exportTableBean.getTableName());// 把表中文名称写入sheet.createRow(index++).createCell(1).setCellValue(exportTableBean.getChineseName());int rowNum = sheet.getLastRowNum();// 合并单元格int coloumNum = sheet.getRow(sheet.getLastRowNum()).getPhysicalNumberOfCells();if(coloumNum >= 1){for (int i = 0; i <= (rowNum + 1); i++) {sheet.addMergedRegion(new CellRangeAddress(i,i, 1, coloumNum - 1));}}sheet.setDefaultColumnWidth(10);//cellStyle.setWrapText(true);//自动换行}return workbook;}@GET@Path("/{userId}/table/export")@Produces(MediaType.APPLICATION_JSON)@Consumes(MediaType.APPLICATION_JSON)public Response exportMetadata(@PathParam("userId") int userId,@QueryParam("ids") String ids) throws Exception {ResponseBuilder responseBuilder = null;String filePathDetail = exportService.exportTable();try {File file = new File(filePathDetail);//System.out.println(filePathDetail);String filename = file.getName();InputStream inputStream = new BufferedInputStream(new FileInputStream(filePathDetail));responseBuilder = Response.ok(inputStream);responseBuilder.header("Content-Disposition","attachment;filename=" + new String(filename.getBytes("utf-8"), "ISO-8859-1"));responseBuilder.header("Content-Type", "text/plain");} catch (Exception e) {OperLog.logOperation(logger, userId, request, "exportTable", filePathDetail,"export table", "failed");e.printStackTrace();}return responseBuilder.build();}
}

POI导出多个Excel文件,生成压缩文件相关推荐

  1. php 导出多个excel并输出压缩文件

    set_time_limit(0);ob_end_clean();header('Content-Encoding: none');header('Content-Type: application/ ...

  2. poi导出word与excel模版

    这里推荐一个比较好的poi导出word模版,http://m.blog.csdn.net/liushimiao0104/article/details/78520120 但需要注意的是导入的jar包, ...

  3. java使用POI导出图片到Excel

    个人学习记录 目录 个人学习记录 1. 使用POI导出图片到Excel中,Excel格式为xls 2. 使用POI导出图片到Excel中,Excel格式为xlsx,图片设置边距 3. 获取图片,生成B ...

  4. Java使用poi导出数据到excel(包括xls和xlsx两种格式)并通过浏览器下载

    情景:将数据导出到excel是java开发常用的功能,数据量不大的时候,xls和xlsx两种格式的文件都行,但是数据量太大的时候就有区别了,xls格式的文件一个sheet页最多只能存六万多条数据,而x ...

  5. zipentry压缩乱码linux,java生成压缩文件 ZipEntry出现乱码的有关问题

    java生成压缩文件 ZipEntry出现乱码的问题 在项目中,一次导出的文件有好几个,而且文件内容比较大,最后考虑到把文件进行压缩在下载,开始试用JDK自带的ZIP压缩包时,ZipEntry ze ...

  6. 最近很火的在线文件预览txt、doc、ppt、pdf、excel、jpg、png、zip、tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写搜索引擎多关键词检索名称和内容(五)

    最近很火的在线文件预览txt.doc.ppt.pdf.excel.jpg.mp4.png.zip.tar.gz等各种文件及压缩文件在线解压和预览,包括前后端设计和源码,编写一个文件搜索引擎实现多关键词 ...

  7. 使用POI导出数据到excel代码

    使用POI导出数据到excel代码 POM文件 <!-- 导出excel --> <dependency><groupId>org.apache.poi</g ...

  8. python生成表格文件_python 读取excel文件生成sql文件实例详解

    python 读取excel文件生成sql文件实例详解 学了python这么久,总算是在工作中用到一次.这次是为了从excel文件中读取数据然后写入到数据库中.这个逻辑用java来写的话就太重了,所以 ...

  9. php 增加压缩文件,PHP生成压缩文件实例

    大概需求: 每一个订单都有多个文件附件,在下载的时候希望对当前订单的文件自动打包成一个压缩包下载 细节需求:当前订单号_年月日+时间.zip  例如: 1.生成压缩文件,压缩文件名格式: 2.压缩文件 ...

最新文章

  1. ubuntu中安装hadoop集群
  2. Jmeter4.0----CSV Data Set Config_对输入参数进行参数化(13)
  3. 如何解决Ubuntu 14.04编译make menuconfig时缺少'ncurses-devel'库
  4. C++ Qt全局异常处理器_QT教程
  5. 男子网购二手苹果手表 竟收到这些东西 怒斥卖家:你这个骗子!
  6. Gson用法: json转对象
  7. 818释放规模效能,苏宁易购全场景智慧零售迈上新台阶
  8. 综述:如何研究植物基因组DNA羟甲基化(5hmC)?|易基因
  9. vs商业智能项目的安装
  10. 栈与队列的相同点和不同点
  11. 晶体三极管原理及应用
  12. 机器学习之决策树算法ID3--参考麦子学院彭亮机器学习基础3.2决策树应用
  13. 【软件分析学习笔记】5:可达定义分析(Reaching Definitions Analysis)
  14. Web入门----css中伪类
  15. 美国的米拉超级计算机,超级计算机“米拉”:效力阿贡国家实验室_Intel Xeon E5-4650_服务器评测与技术-中关村在线...
  16. WK2212\WK2204\WK2168\WK2132\WK2124\WK2114 UART扩展4个增强UART
  17. excel 显示html标签,POI Excel 上下标处理(sub,sup的HTML标签转化到excel格式)
  18. mysql配置主从复制和mysql多实例配置主从复制
  19. 基于SpringBoot的汽车租赁管理系统
  20. (C++)有n个人围成一圈,顺序排号。从第一个人开始报数(1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号。

热门文章

  1. redhat升级linux内核,redhat内核升级方法
  2. Cairo学习(一)
  3. wampserver常见问题
  4. 怎么查询计算机二级证书快递号,计算机二级office查询成绩后的注意事项证书直邮申请17到到23号...
  5. 微信缓存dat怎么转图片_微信dat文件转换为图片
  6. 【猿人学WEB题目专解】猿人学第5题
  7. 分享一些ABP..ABS的广告过滤规则
  8. STM32自学笔记-7-CAN总线通信
  9. 《Essential C++》学习笔记 第三章:泛型编程风格(一)
  10. FailedScheduling 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn‘t tolerat