导出excel文件

工具类

package com.se.utils.excel;/*
* 创建人:cwq
* 创建时间 :20160105
* 创建用于 用于临时文件的下载
*
* */

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.*;

public class DownloadExcelUtils {
    private File resultFile = null;
    private String sheetName = "sheet";
    private int sheetRow = 0;
    private String fileName=null;
    private String [] gaugeHead = {"第一列","第二列"};
    private String [][] cellValue = {{"1","2"},{"1","2"},{"3","4"}};
    private Map<String, String> params = new HashMap<String, String>();
    private String gauge = null;
    private String cell = null;
    private String fileTime = null;

    public DownloadExcelUtils(){

    }

    /*
    *
    * */
    public Map<String,String> Excel(String sheetName,int sheetRow,String [] gaugeHead,String [][] cellValue)throws IOException {
        return export(sheetName,sheetRow,gaugeHead,cellValue);
    }


    /*
    * 转为二数组
    * */

    private String[][] ToList( List list){
        int listLength = list.size();
        Object[] listArray = list.toArray();
        String[][] arrList = new String[listLength][];
        for(int i=0;i<listArray.length;i++){
            arrList[i]=(String[]) listArray[i];
        }
       return arrList;
    }

    /*
   * 用于导出xlsx 文件
   * @sheetName 页的名字
   * @sheetRow 多少行一个页
   * @gaugeHead 表头
   * @cellValue 内容
   * */
    public void exportTo(String sheetName,int sheetRow,String [] gaugeHead,String [][] cellValue,OutputStream os) {
        // 创建工作簿
        HSSFWorkbook wb = new HSSFWorkbook();
        //工作簿的样式
        CellStyle cellType= CellStyle(wb);
        if(sheetRow>0) {
            int len = cellValue.length;//数据的行数
            int yuShu = len%sheetRow;//取余数
            int ye = (yuShu==0)?(int)Math.ceil(len/sheetRow):((int)Math.ceil(len/sheetRow)+1);
//            System.out.println(ye);
            for(int i=0;i<ye;i++){
                String name=  (i==0)? sheetName : sheetName+ String.valueOf(i);//页的名字
                wb.createSheet(name);//创建页
                gaugeHead(wb.getSheet(name), cellType, gaugeHead);//表头
                CellValue(wb.getSheet(name), cellType,setPage(i,cellValue,sheetRow,ye,yuShu));//设置内容
            }
        }else {
            // 创建页
            HSSFSheet sheet = wb.createSheet(sheetName);
            gaugeHead(sheet, cellType, gaugeHead);//表头
            CellValue(sheet, cellType, cellValue);//设置内容
        }
        //保存工作簿
        try {
            wb.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
      /*
    * 用于导出xlsx 文件
    * @sheetName 页的名字
    * @sheetRow 多少行一个页
    * @gaugeHead 表头
    * @cellValue 内容
    * */
    private Map<String, String> export(String sheetName,int sheetRow,String [] gaugeHead,String [][] cellValue) throws IOException {
        fileName="result"+createTime()+createRandom()+"-"+getRandomString(8);
        //结果存放文件以及地址
//        String path = createFolder("xwmr", File.separator+"src"+File.separator+"main"+File.separator+"webapp"+File.separator+"upload"+File.separator+"download"+File.separator);
//
//        deleteFile(new File(path.split("download")[0]+"download"),60*60*24);
//        System.out.println("---------------"+path+"------------");
        resultFile = new File(fileName+".xls");
        // 创建工作簿
        HSSFWorkbook wb = new HSSFWorkbook();
        //工作簿的样式
        CellStyle cellType= CellStyle(wb);
        if(sheetRow>0) {
            int len = cellValue.length;//数据的行数
            int yuShu = len%sheetRow;//取余数
            int ye = (yuShu==0)?(int)Math.ceil(len/sheetRow):((int)Math.ceil(len/sheetRow)+1);
//            System.out.println(ye);
            for(int i=0;i<ye;i++){
                String name=  (i==0)? sheetName : sheetName+ String.valueOf(i);//页的名字
                wb.createSheet(name);//创建页
                gaugeHead(wb.getSheet(name), cellType, gaugeHead);//表头
                CellValue(wb.getSheet(name), cellType,setPage(i,cellValue,sheetRow,ye,yuShu));//设置内容
            }
        }else {
            // 创建页
            HSSFSheet sheet = wb.createSheet(sheetName);
            gaugeHead(sheet, cellType, gaugeHead);//表头
            CellValue(sheet, cellType, cellValue);//设置内容
        }
        FileOutputStream os = new FileOutputStream(resultFile);
        //保存工作簿
        wb.write(os);
        os.flush();
        os.close();
        params.put("fileName", fileName);
        params.put("url","/upload/download/"+fileTime+"/"+fileName+".xls");
        return  params;
    }

    /*
    * 处理分页的数据
    * @page 页码
    * @arr 存进来的数据
    * @sheetRow 多少行一页
    * @ye 共多少页
    * @yuShu 最后一页多少个
    * */

     private String[][] setPage(int page,String[][] arr,int sheetRow,int ye,int yuShu){
//         System.out.println("page:"+page+",arr:"+arr[0][0]+",sheetRow:"+sheetRow)
         int startNum =page*sheetRow;//开始数据
         int endNum =(page+1)*sheetRow;//结束数据
         int l = 0;
         if(page==(ye-1)){//最后一页
             if(yuShu!=0){//不是整除
                 l = yuShu;
                 endNum = page*sheetRow+yuShu;
             }else{
                 l = (page+1)*sheetRow-page*sheetRow;
             }
         }else{
             l = (page+1)*sheetRow-page*sheetRow;
         }
//         System.out.println("长度:"+l+"endNum:"+endNum);
         String[][] newArr = new String[l][];
         int index = 0;
         for(int i=startNum;i<endNum;i++){
             int len = arr[i].length;
             String[] arrRow = new String[len];
             for(int j=0;j<len;j++){
                 arrRow[j]=arr[i][j];
             }
             newArr[index]=arrRow;
             index++;
         }
        return newArr;
    }
    private static String randString = "abcdefghigklmnopkrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789";//随机产生的字符串
    /*
    * 获取随机的字符
    */
    public static String getRandomString(int length){
        StringBuilder sf=new StringBuilder();
        Random random = new Random();
        for(int i=0;i<length;i++){
            int number=random.nextInt(62);//0~61
            sf.append(randString.charAt(number));
        }
        return sf.toString();
    }
    /*
    * 删除文件
    * @file 文件
    * @time 删前时间 单位s
    * */

    private void deleteFile(File file,int time) {
//        System.out.println(file.isFile());
        time = (time==0)?30:time;
        try {
            if (!file.isFile()) {//不是文件
//                System.out.println(file.listFiles());
                File[] tempList =file.listFiles();
                for (int i = 0; i < tempList.length; i++) {
                    if (tempList[i].isFile()) {
                        if (canDeleteFile(tempList[i],time)) {
                            delete(tempList[i],"文件");
                        }
                    }
                    if (tempList[i].isDirectory()) {
                        if (canDeleteFile(tempList[i],time)) {
                            delete(tempList[i],"文件夹");
                        }
                    }
                }

            }else{
                delete(file,"文件");
            }
        } catch (Exception e) {
            System.out.println("删除文件失败!"+ e);
        }
    }

    /*
    * 文件删除动作
    * */

    private void delete(File file,String name){
        if (file.delete()) {
            System.out.println(name+":" + file.getName() + "删除成功!");
        } else {
            if(deleteDir(file)){
                System.out.println(name+":" + file.getName() + "删除成功!");
            }else {
                System.out.println(name+":" + file.getName() + "删除失败!");
            }
        }
    }

    /**
     * 递归删除目录下的所有文件及子目录下所有文件
     * @param dir 将要删除的文件目录
     */
    private  boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();//递归删除目录中的子目录下
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        return dir.delete();
    }
     /*
    * 计算文件时间
    * @file 文件
    * @time 删前时间 单位s
    * */

    private boolean canDeleteFile(File file,int time) {
        Date date = new Date();
        long lastUpTime = file.lastModified() / 1000;
        long secondsOfOneMinute = time;
        //可删除文件的时间
        long canDelTime = date.getTime() / 1000 - secondsOfOneMinute;

        if(lastUpTime <= canDelTime) {
            return true;
        }
        return false;
    }
       /*
    * 创建时间
    * 时分秒
    * */

     private String createTime(){
        SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
        return format.format(new Date());
    }
    private int createRandom(){
        return (int)(Math.random()*10);
    }
    /*
    * 创建工作簿的样式
    * @wb 工作簿
    * */

     private CellStyle CellStyle(Workbook wb){
        CellStyle cellType = null;
        cellType = wb.createCellStyle();
        cellType.setBorderTop(HSSFCellStyle.BORDER_THIN);
        cellType.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellType.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellType.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellType.setVerticalAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置单元格垂直方向对其方式
        cellType.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平
         cellType.setFillForegroundColor(HSSFColor.WHITE.index);
        cellType.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        return cellType;
    }

    /*
    * 设置导出数据
    * @sheet 工作簿的页
    * @cellType 工作簿的样式
    * @cellValue 表头数组
    * */

   private void CellValue(HSSFSheet sheet,CellStyle cellType,String[][] cellValue){
      HSSFRow row = null;
      HSSFCell cell = null;
      for (int i=0;i<cellValue.length;i++){
          row = sheet.createRow(i+1);  // 第二行
          int len = cellValue[i].length;
          for(int j=0;j<len;j++){
              //列
              cell = row.createCell(j);
              // 单元格样式
              cell.setCellStyle(cellType);
              // 单元格的值
              cell.setCellValue(cellValue[i][j]);
          }
      }
  }

    /*
    * 设置导出的表头
    * @sheet 工作簿的页
    * @cellType 工作簿的样式
    * @gaugeHead 表头数组
    * */

     private void gaugeHead(HSSFSheet sheet,CellStyle cellType,String[] gaugeHead){
        HSSFRow row = null;
        HSSFCell cell = null;
        row = sheet.createRow(0);  // 第一行
        for (int i=0;i<gaugeHead.length;i++){
            sheet.autoSizeColumn(i, true);
            sheet.setColumnWidth(i,gaugeHead[i].getBytes().length*2*256);
            // 列
            cell = row.createCell(i);
            // 单元格样式
            cell.setCellStyle(cellType);
            // 单元格的值
            cell.setCellValue(gaugeHead[i]);
        }
    }

 }

实例:

 public static void main(String[] args) {
     String[] headers = {"",""};  //设置表头
     List<String[]> Subject = new ArrayList<>();
     Subject.add(new String[]{" "," "});
     int size = Subject.size();
     String[][] arrList = new String[size][];
     int index = 0;
     for (String[] l : Subject) {
         arrList[index] = l;
         index++;
     }
     OutputStream out = null;
     try {
         Date date = new Date();
         DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
         String filename = "test" + format.format(date) + ".xls";
         String recommendedName = new String(filename.getBytes(), "iso_8859_1");                                  
         getResponse().setContentType("application/vnd.ms-excel");//设置导出文件格式
         getResponse().setHeader("Content-Disposition", "attachment; filename=" + recommendedName);//
         out = getResponse().getOutputStream();
         new DownloadExcelUtils().exportTo("Sheet", 10000, headers, arrList, out);
         out.flush();
         out.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值