1. 程式人生 > >easyPoi處理檔案下載檔名為空問題----請求頭資訊

easyPoi處理檔案下載檔名為空問題----請求頭資訊

導包:同上一篇匯出封裝請求引數

定義註解:

import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;

import java.lang.annotation.*;

/**
 * 匯出Excel註解.
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExportExcel {

    // 匯出檔名.
    String fileName();

    // Excel型別.預設03、07格式.
    ExcelType excelType() default ExcelType.HSSF;
}

定義切面方法:匹配註解進行切面環繞設定請求頭資訊

import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import com.ahies.system.sso.annotation.ExportExcel;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;

/**
 * 匯出Excel切面.
 *
 * @author Hohn
 */
@Aspect
@Order
@Component
public class ExcelExportAspect {

   @Around(value = "@annotation(excel)")
   public Object processTx(ProceedingJoinPoint joinPoint, ExportExcel excel)
         throws Throwable {
      Object[] args = joinPoint.getArgs();
      // Http請求.
      HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
      // Http響應.
      HttpServletResponse response = null;
      // 最終的檔名(處理中文相容問題).
      String finalFileName = excel.fileName();
      // 檔案字尾名.
      String suffix = excel.excelType().equals(ExcelType.HSSF) ? ".xls" : ".xlsx";
      for (int i = 0; i < args.length; i++) {
         final String userAgent = request.getHeader("USER-AGENT");
         // IE瀏覽器(IE11特殊處理).
         if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "rv:11")) {
            finalFileName = URLEncoder.encode(excel.fileName(), "UTF8");
         }
         // Google,火狐瀏覽器
         else if (StringUtils.contains(userAgent, "Mozilla")) {
            finalFileName = new String(excel.fileName().getBytes(), "ISO8859-1");
         }
         // 其他瀏覽器.
         else {
            finalFileName = URLEncoder.encode(excel.fileName(), "UTF8");
         }
         if (args[i] instanceof HttpServletResponse) {
            response = (HttpServletResponse) args[i];
            // 告訴瀏覽器用什麼軟體可以開啟此檔案.
            response.setHeader("content-Type", "application/vnd.ms-excel");
            // 下載檔案的預設名稱.
            response.setHeader("Content-Disposition", "attachment;filename=" + finalFileName + suffix);
            // 編碼.
            response.setCharacterEncoding("UTF-8");
         }
      }
      Object result = null;
      try {
         result = joinPoint.proceed();
      } catch (Throwable e) {
         e.printStackTrace();
      }
      return result;
   }
}