swagger文件導出名稱亂碼


response.setHeader("Content-Disposition", "attachment; filename=" + new String("標准化物資".getBytes("UTF-8"), "ISO-8859-1") + ".xlsx");
    

 

 只是swagger文件名稱亂碼可以嘗試瀏覽器直接下載,我的文件亂碼只存在有swagger接口下載中。

 

本來就是個很簡單的導出xlsx文件到瀏覽器頁面,但是中間寫的時候還是遇到了一些問題的。

1、由於導出xlsx文件需要用到HSSFWorkbook,所以需要導入POI依賴

 <!-- 導入、導出Excel -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version>
  </dependency>

2、寫個util類,封裝生成excel的方法,這樣的話以后需要導出其他excel文件時也可以直接使用。
首先要了解的是,生成excel必要的幾個要素是:
HSSFWorkbook:excel的工作簿
HSSFSheet:excel的工作表
HSSFRow:excel的行
HSSFCell:excel的單元格
所以在封裝方法時,設置了相應的入參對象:
dto: 字段用處有描述

package com.cmf.demo.model;

import java.util.List;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class ExcelInfo {
  /**
   * 數據所在的集合
   */
  private List list;
  /**
   * sheet表的標題  - 放在文件內第一行
   */
  private String[] title;
  /**
   * 對象的屬性名,方便標題跟數據對齊   -- 根據反射可以獲取對象中的值賦值
   */
  private String[] keys;
  /**
   * sheet表的名稱
   */
  private String SheetName;
  /**
   * excel的名稱  --  如果導出excel到指定的目錄需要加上名稱
   */
  private String excelName;
  /**
   * excel表格保存的路徑   --  如果導出excel到指定的目錄需要做為入參
   */
  private String path;

}

util抽象方法: 該方法中也可以在最后加上導出excel到指定目錄的方法,因為我只想展示下載到瀏覽器的效果,所以注釋了導出到指定目錄的代碼

package com.cmf.demo.util;

import com.cmf.demo.model.ExcelInfo;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.util.StringUtils;

@Slf4j
public class ExcelUtil {
    public static HSSFWorkbook createExcel(ExcelInfo excel)throws IOException, IllegalAccessException {
        //創建一個工作簿
        HSSFWorkbook hssfWorkbook =new HSSFWorkbook();
        //創建一個工作表(參數是sheet表的名稱)
        HSSFSheet hssfSheet = hssfWorkbook.createSheet(excel.getSheetName());
        //創建第一行sheet表中的內容,索引是從0開始,第一行是sheet表的標題欄
         HSSFRow hssfRowHeader = hssfSheet.createRow(0);
        //標題數組
         String[] title = excel.getTitle();
        //創建單元格對象
         HSSFCell cell =null;
        //遍歷生成標題欄里面的標題單元格
        for (int i =0; i < title.length; i++) {
            //遍歷生成索引是0行的每一個標題單元格對象
            cell = hssfRowHeader.createCell(i);
            //添加數據
            cell.setCellValue(title[i]);
         }
        //內容集合
        List list = excel.getList();
        //屬性名的數組,判斷到底要在excel呈現出多少數據
        String[] keys = excel.getKeys();
        //導出內容
        //集合的長度就是sheet表中內容的條數,比如(長度為3,內容就有三條,索引從1開始)
        for (int i =0; i < list.size(); i++) {
            HSSFRow hssfRowContext = hssfSheet.createRow(i +1);
            //利用反射將對象屬性變成一個數組
            Field[] listArray = list.get(i).getClass().getDeclaredFields();
            for (int j =0; j < listArray.length; j++) {
                System.out.println();
                //設置是否允許訪問,而不是修改原來的訪問權限修飾詞。
                listArray[j].setAccessible(true);
                for (int k =0; k < keys.length; k++) {
                    if (StringUtils.hasText(keys[k])&&keys[k].equals(listArray[j].getName())) {
                        cell = hssfRowContext.createCell(k);
                        log.info("listArray[j]:"+listArray[j]+";list.get(i):"+list.get(i));
                        cell.setCellValue(listArray[j].get(list.get(i)).toString());
                    }
                }
            }
        }
//        String fileName = excel.getPath() + File.separator + excel.getExcelName() +".xls";
//        try{
//            File file = new File(fileName);
//            File parentFile = file.getParentFile();
//            if (!parentFile.exists()){
//                parentFile.mkdir();
//            }
//        }catch (Exception e){
//            log.info("目標文件不存在,新建失敗");
//        }
//        FileOutputStream fos =new FileOutputStream(fileName);
//        hssfWorkbook.write(fos);
//        fos.close();
        return hssfWorkbook;
    }
}

 

3、編寫具體的用戶信息導出邏輯
service:

public HSSFWorkbook excel(){
    Condition condition = new Condition(UserEntity.class);
    condition.createCriteria().andEqualTo("userId","20030001");
//    通用mapper使用
    List<UserEntity> entity= testMapper.selectByCondition(condition);
    ExcelInfo excel = new ExcelInfo();
    excel.setList(entity);
    //標題數組
    String[] title = new String[]{"用戶號","用戶名","用戶狀態"};
    //對象字段名,根據字段名賦值
    String[] keys = new String[]{"userId","userName","userStatus"};
    excel.setTitle(title);
    excel.setKeys(keys);
    excel.setExcelName("測試導出用戶信息");
    excel.setSheetName("測試導出用戶信息");
    HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
    try {
      hssfWorkbook = ExcelUtil.createExcel(excel);
    } catch (IOException e) {
      e.printStackTrace();
    } catch (IllegalAccessException e) {
      e.printStackTrace();
    }
    return hssfWorkbook;
  }

controller:

@PostMapping("/excel")
  @ApiOperation(notes = "測試導出信息",value = "測試導出用信息",httpMethod = "POST")
  public void getUser(HttpServletResponse response){
    HSSFWorkbook hssfWorkbook = testService.excel();
    BufferedOutputStream fos = null;
    try {
      response.setContentType("application/x-msdownload");
      response.setCharacterEncoding("UTF-8");
      response.setHeader("Content-Disposition", "attachment;fileName=" +  URLEncoder
          .encode("測試導出用戶信息", "UTF-8")+".xlsx");  //設置文件名編碼格式
      fos = new BufferedOutputStream(response.getOutputStream());
      hssfWorkbook.write(fos);
      fos.close();
    }catch (Exception e) {
      log.error("excel生成報錯", e);
    }
  }

4、代碼一直到這里運行使用都很正常,但是我說的出現的問題是,我使用swagger調用這個接口后,可以正常的下載但是文件名一直是亂碼的

 

 這里我百度說是可能是編碼格式設置有問題,不同的瀏覽器解碼不一樣,於是換了很多種方式但還是沒用,后面考慮可能是我瀏覽器問題,就讓同事連我的ip調了下還是不行,最后只能看看是否是swagger測試工具的編碼問題了,我把post方法改成get請求調用,直接在瀏覽器url調用,就可以正常導出文件,且文件名不會亂碼了(前端頁面調用接口也是可以的)。至於swagger為什么一直亂碼這個問題我還沒搞清楚,后面知道了再更新吧!!知道的大佬希望留個言,謝了!

 @GetMapping("/excel")
  @ApiOperation(notes = "測試導出信息",value = "測試導出用信息",httpMethod = "GET")

 

參考文章:

1.https://blog.csdn.net/qq_39766167/article/details/106633658

2.https://blog.csdn.net/weixin_43779185/article/details/115125426


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM