Springboot POI导出Excel(浏览器)

  public String stateCreateExcel(List list, String[] strArray,String sheetName,String excelName,String filePath)throws Exception {

  // 总数据条数

  int dataSize = list.size();

  // 线程数

  int threadNum = 2;

  int threadSize = dataSize / threadNum;

  ExecutorService exec = Executors.newFixedThreadPool(threadNum);

  //cutList 和输入list类型保持一致

  List cutList = null;

  // 第一步,创建一个webbook,对应一个Excel文件

  XSSFWorkbook wb = new XSSFWorkbook();

  // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet

  XSSFSheet sheet = wb.createSheet(sheetName);

  sheet.setDefaultColumnWidth(20);// 默认列宽

  // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short

  XSSFRow row = sheet.createRow((int) 0);

  // 第四步,创建单元格,并设置值表头 设置表头居中

  XSSFCellStyle style = wb.createCellStyle();

  // 创建一个居中格式

  style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

  // 添加excel title

  XSSFCell cell = null;

  for (int i = 0; i < strArray.length; i++) {

  cell = row.createCell((short) i);

  cell.setCellValue(strArray[i]);

  cell.setCellStyle(style);

  }

  List> tasks = new ArrayList>();

  Callable task = null;

  // 第五步,写入实体数据 实际应用中这些数据从数据库得到,list中字符串的顺序必须和数组strArray中的顺序一致

  int startNum ;

  System.out.println("任务开始,总数:"+list.size());

  // 开始时间

  long start = System.currentTimeMillis();

  System.out.println("线程任务执行");

  for (int i = 0; i < threadNum; i++) {

  startNum = threadSize * i;

  if (i == threadNum - 1) {

  cutList = list.subList(threadSize * i, dataSize);

  } else {

  cutList = list.subList(threadSize * i, threadSize * (i + 1));

  }

  //listStr 和输入list类型保持一致

  final List listStr = cutList;

  int finalStartNum = startNum;

  task = new Callable() {

  final int s= finalStartNum;

  @Override

  public Integer call() throws Exception {

  for(int j=0;j

  XSSFRow row =getRow(sheet,s+j);

  //设置每一列展示内容自己设置

  row.createCell(0).setCellValue(listStr.get(j).getName());

  row.createCell(1).setCellValue(listStr.get(j).getStartDateTime());

  row.createCell(2).setCellValue(listStr.get(j).getEndDateTime());

  row.createCell(3).setCellValue(listStr.get(j).getDateTime());

  }

  return 1;

  }

  };

  // 这里提交的任务容器列表和返回的Future列表存在顺序对应的关系

  tasks.add(task);

  }

  try {

  List> results = exec.invokeAll(tasks);

  } catch (Exception e) {

  e.printStackTrace();

  }

  // 关闭线程池

  exec.shutdown();

  DownloadFileUtil.delfile(filePath);

  // 第六步,将文件存到指定位置

  try {

  FileOutputStream fout = new FileOutputStream(filePath);

  wb.write(fout);

  fout.flush();

  fout.close();

  } catch (Exception e) {

  e.printStackTrace();

  }

  System.out.println("线程任务执行结束");

  System.err.println("执行任务消耗了 :" + (System.currentTimeMillis() - start) + "毫秒");

  return filePath;

  }