Java使用Apache POI 導出excel

一、Java工具類代碼:
java

package com.allin.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.ss.usermodel.Workbook;
import org.compass.core.util.CollectionUtils;

/**
* 2015-4-29
* DES:POI導出Excel
* author:JiBaoLe
*/
public class ExportToExcelUtil<T> {  
    //每次設置導出數量
    public static int  NUM=5000;
    public static String title="";
   
    /**
     * 導出Excel的方法
     * @param title excel中的sheet名稱
     * @param headers 表頭
     * @param result 結果集
     * @param out 輸出流
     * @param pattern 時間格式
     * @throws Exception
     */   
    public void exportExcel( String[] headers,String[] columns, List<T> result, OutputStream out,HttpServletRequest request, String pattern) throws Exception{   
        
        File zip = new File(request.getRealPath("/files") + "/" +getFileName() + ".zip");// 壓縮文件
        
        int n=0;
        if (!CollectionUtils.isEmpty(result)) {
            if (result.size() % NUM == 0) {
                n = result.size() / NUM;
            } else {
                n = result.size() / NUM + 1;
            }
        }else{
            n=1;
        }
        List<String> fileNames = new ArrayList();// 用於存放生成的文件名稱s
        //文件流用於轉存文件
        
        for (int j = 0; j < n; j++) {
            Collection<T> result1=null;
        //切取每5000爲一個導出單位,存儲一個文件
        //對不足5000作處理;
            if (!CollectionUtils.isEmpty(result)) {
                if (j == n - 1) {
                    if (result.size() % NUM == 0) {
                        result1 = result.subList(5000 * j, 5000 * (j + 1));
                    } else {
                        result1 = result.subList(5000 * j,
                                5000 * j + result.size() % NUM);
                    }
                } else {
                    result1 = result.subList(5000 * j, 5000 * (j + 1));
                }
            }
        // 聲明一個工做薄   
            Workbook workbook = new HSSFWorkbook();
        // 生成一個表格   
        HSSFSheet sheet = (HSSFSheet) workbook.createSheet(title);   
        // 設置表格默認列寬度爲18個字節   
        sheet.setDefaultColumnWidth((short)18);   
           
        
        String file = request.getRealPath("/files") + "/" + getFileName() + "-" +j+ ".xls";

        fileNames.add(file);
        
        FileOutputStream o = new FileOutputStream(file);
           
        // 生成一個樣式   
        HSSFCellStyle style = (HSSFCellStyle) workbook.createCellStyle();   
        // 設置這些樣式   
        style.setFillForegroundColor(HSSFColor.GOLD.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 = (HSSFFont) workbook.createFont();   
        font.setColor(HSSFColor.VIOLET.index);   
        //font.setFontHeightInPoints((short) 12);   
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);   
        // 把字體應用到當前的樣式   
        style.setFont(font);   
           
        // 指定當單元格內容顯示不下時自動換行   
        style.setWrapText(true);   
         
        // 聲明一個畫圖的頂級管理器  
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
      
        // 產生表格標題行   
        //表頭的樣式
        HSSFCellStyle titleStyle = (HSSFCellStyle) workbook.createCellStyle();// 建立樣式對象
        titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);// 水平居中
        titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
        // 設置字體
        HSSFFont titleFont = (HSSFFont) workbook.createFont(); // 建立字體對象
        titleFont.setFontHeightInPoints((short) 15); // 設置字體大小
        titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 設置粗體
      //  titleFont.setFontName("黑體"); // 設置爲黑體字
        titleStyle.setFont(titleFont);
        sheet.addMergedRegion(new Region(0,(short)0,0,(short)(headers.length-1)));//指定合併區域  
        HSSFRow rowHeader = sheet.createRow(0);   
        HSSFCell cellHeader = rowHeader.createCell((short)0);   //只能往第一格子寫數據,而後應用樣式,就能夠水平垂直居中
        HSSFRichTextString textHeader = new HSSFRichTextString(title);   
        cellHeader.setCellStyle(titleStyle);
        cellHeader.setCellValue(textHeader);
         
        HSSFRow row = sheet.createRow(1);   
        for (int i = 0; i < headers.length; i++) {   
            HSSFCell cell = row.createCell((short)i);   
            cell.setCellStyle(style);   
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);   
            cell.setCellValue(text);   
         }   
         // 遍歷集合數據,產生數據行   
         if(result1 != null){   
             int index = 2;   
             for(T t:result1){  
                 row = sheet.createRow(index);   
                 index++;
                 for(short i = 0; i < columns.length; i++) {
                     HSSFCell cell = row.createCell(i);
                     String fieldName = columns[i];
                     String getMethodName = "get"
                         + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                     Class tCls = t.getClass();
                     Method getMethod = tCls.getMethod(getMethodName, new Class[]{});
                     Object value = getMethod.invoke(t, new Class[]{});
                     String textValue = null;
                     if(value == null) {
                         textValue = "";
                     }else if (value instanceof Date) {
                         Date date = (Date) value;
                         SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                          textValue = sdf.format(date);
                      }  else if (value instanceof byte[]) {
                         // 有圖片時,設置行高爲60px;
                         row.setHeightInPoints(60);
                         // 設置圖片所在列寬度爲80px,注意這裏單位的一個換算
                         sheet.setColumnWidth(i, (short) (35.7 * 80));
                         byte[] bsValue = (byte[]) value;
                         HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,
                               1023, 255, (short) 6, index, (short) 6, index);
                         anchor.setAnchorType(2);
                         patriarch.createPicture(anchor, workbook.addPicture(
                               bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
                      } else{
                         //其它數據類型都看成字符串簡單處理
                         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);
                            cell.setCellValue(richString);
                         }
                      }
                 }
             }      
         }   
         workbook.write(o);  
         File srcfile[] = new File[fileNames.size()];
         for (int i = 0, n1 = fileNames.size(); i < n1; i++) {
             srcfile[i] = new File(fileNames.get(i));
         }
         ZipFiles(srcfile, zip);
         FileInputStream inStream = new FileInputStream(zip);
         byte[] buf = new byte[4096];
         int readLength;
         while (((readLength = inStream.read(buf)) != -1)) {
             out.write(buf, 0, readLength);
         }
         inStream.close();
        }
     }   
    //獲取文件名字
    public static String getFileName(){
        // 文件名獲取
        Date date = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        String f = title + format.format(date);
        return f;
    }
    //壓縮文件
    public static void ZipFiles(java.io.File[] srcfile, java.io.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();
        }
    }
    
    /** 設置響應頭 */
    public void setResponseHeader(HttpServletResponse response,String fileName) {
        try {
            this.title=fileName;
            response.reset();// 清空輸出流
            response.setContentType("application/octet-stream;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename="
                    +new String(this.title.getBytes("GB2312"), "8859_1")
                    + ".zip");
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
 }  

二、JavaAction 調取工具類:apache

/***
     * 會員瀏覽日誌查詢報表-Excel導出
     * @return
     */
    @SkipValidation
    public String exportlogCustomerDownload() {
        ExportToExcelUtil<LogCustomerDownload> excelUtil = new ExportToExcelUtil<LogCustomerDownload>();
        // 導出總記錄數
        excelTatol = request.getParameter("excelTatol") == null ? 10 : Integer.parseInt(request.getParameter("excelTatol"));
        OutputStream out = null;
        try {
            out = response.getOutputStream();

            excelUtil.setResponseHeader(response,"會員下載日誌表");

            String[] headers = { "會員id", "下載類型 ", "資源id","開始時間","結束時間","下載描述"};

            String[] columns = { "customerId", "downloadType","resourceId","startTime","endTime","downloadDesc"};

            // 瀏覽
            List<LogCustomerDownload> dataset = service
                    .getList(getQueryJsonAuthObject());
            excelUtil.exportExcel( headers, columns, dataset, out, request, "");

        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            try {
                out.flush();
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;

    }


三、JS調取:app

//會員瀏覽日誌查詢報表-Excel導出function exportRecord(){    //標示:是否導出用戶詳細    if(excelTatol > 5000){        $.messager.show({            title:'提示信息!' ,             msg:'導出數據不能超過5000條!'        });    }else{      var data = $.toJSON(getCustomerSearch());      window.location.href="logCustomerDownloadAction!exportlogCustomerDownload?queryJson="+data+"&excelTatol="+excelTatol;    }}
相關文章
相關標籤/搜索