一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - SpringBoot整合POI導出通用Excel的方法示例

SpringBoot整合POI導出通用Excel的方法示例

2020-08-24 00:30mengdi_cao Java教程

這篇文章主要介紹了SpringBoot整合POI導出通用Excel的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

一、準備工作

1、pom依賴

在pom.xml中加入POI的依賴

?
1
2
3
4
5
6
7
8
9
10
<dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi-ooxml</artifactId>
 <version>3.11-beta1</version>
</dependency>
<dependency>
 <groupId>org.apache.poi</groupId>
 <artifactId>poi-ooxml-schemas</artifactId>
 <version>3.11-beta1</version>
</dependency>

2、自定義注解

自定義注解,用于定義excel單元格的相關信息,用在需要導出的類上。

大家可以根據自己的實際需求來定義更多的內容。

?
1
2
3
4
5
6
7
8
9
10
11
12
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelResources {
 
 int order() default 9999;//定義字段在excel的單元格列坐標位置
 
 String title() default "";//定義列坐標對應的標題
 
 int cloumn() default 100;//定義列寬
 
 String pattern() default "";//定義日期顯示格式
 
}

3、定義需要導出的實體

舉例說明@ExcelResources 的應用場景,我們創建一個demoModel,包含姓名、年齡、性別、日期。

后邊的excel導出例子也采用這個實體類來舉例。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Data
public class ExcelDemoModel {
 
  @ExcelResources(order=0,title = "姓名",cloumn = 10)
  private String name;
 
  @ExcelResources(order=1,title = "年齡",cloumn = 10)
  private Integer age;
 
  @ExcelResources(order=2,title = "創建時間",cloumn = 24,pattern = "yyyy-MM-dd HH:mm:ss")
  private Date createTime;
 
  @ExcelResources(order=3,title = "性別",cloumn = 10)
  private SexType sex;//枚舉
  
}

4、定義導出輔助類

用于存放導出的excel對應標題和列寬

?
1
2
3
4
5
6
7
8
9
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TitleAndCloumn {
 
  private String title;//標題
  private int cloumn;//列寬
 
}

二、具體的導出方法

1、導出主要方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
@Service
public class ExcelService {
 
  private static float title_row_height=30;//標題行高
  private static float data_row_height=25;//數據行高
 
 public void exportExcel(HttpServletRequest request, HttpServletResponse response, String fileName ,List<?> excelDatas,Class<?> clz ) {
 
    try {
 
      HSSFWorkbook resultWb=new HSSFWorkbook();
      HSSFSheet sheet=resultWb.createSheet();//創建sheet
 
  //根據類類型信息獲取導出的excel對應的標題和列寬 key-列號,value-標題和列寬
      HashMap<Integer, TitleAndCloumn> orderTitleAndCloumnMap=getTitleAndCloumnMap(clz);
 
      //設置列寬
      orderTitleAndCloumnMap.forEach((k,v) -> {
        sheet.setColumnWidth(k, v.getCloumn()*256);
      });
 
      HSSFRow row0=sheet.createRow(0);
      //設置標題行高
      row0.setHeightInPoints(title_row_height);
 
  //創建標題單元格格式
      HSSFCellStyle titleCellStyle=getCellStyle(resultWb,11,true,HSSFColor.BLACK.index);
      //填充標題行內容
      orderTitleAndCloumnMap.forEach((k,v) -> {
        HSSFCell row0Cell=row0.createCell(k);
        row0Cell.setCellValue(v.getTitle());
        row0Cell.setCellStyle(titleCellStyle);
      });
 
  //創建正文單元格格式
      HSSFCellStyle dataStyle = getCellStyle(resultWb,11,false,HSSFColor.BLACK.index);
 
  //將正文轉換為excel數據
      int rowNum=1;
      for(Object data:excelDatas){
 
        HSSFRow row=sheet.createRow(rowNum++);
        row.setHeightInPoints(data_row_height);
  //獲取對象值 key-列號 value-String值
        HashMap<Integer,String> orderValueMap=getValueMap(data);
        orderValueMap.forEach((k,v) ->{
          HSSFCell cell=row.createCell(k);
          cell.setCellValue(v);
          cell.setCellStyle(dataStyle);
            }
        );
      }
 
      String downFileName=fileName+".xls";
      response.setContentType("application/vnd.ms-excel; charset=UTF-8");// application/x-download
      response.setHeader("Content-Disposition", "attachment; "
          +encodeFileName(request, downFileName));
 
      OutputStream outputStream = response.getOutputStream();
      resultWb.write(outputStream);
      outputStream.flush();
      outputStream.close();
      resultWb.close();
 
    }catch (Exception e1) {
      e1.printStackTrace();
    }
 
  }
}

2、通過反射獲取excel標題和列寬

?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    /**
       * 獲取類的屬性對應單元格標題和列寬
       * @param
       * @return
       */
      private static HashMap<Integer, TitleAndCloumn> getTitleAndCloumnMap(Class<?> clz) {
     
        HashMap<Integer, TitleAndCloumn> orderTitleAndCloumnMap=new HashMap<>();
     
        Field[] fs = clz.getDeclaredFields();
        for(Field f:fs) {
          f.setAccessible(true);
          if(f.isAnnotationPresent(ExcelResources.class)) {
            Integer order=f.getAnnotation(ExcelResources.class).order();
            String id="codetool">

    3、創建CellStyle

    通過傳入參數定義簡單地CellStyle

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public HSSFCellStyle getCellStyle(HSSFWorkbook workbook,int fontSize,boolean isBoleaWeight,short color){
     
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
     
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
     
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) fontSize);//字號
        font.setColor(color);//顏色
        font.setFontName("宋體");//字體
     
        if(isBoleaWeight){
          font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字體加粗
        }
     
        style.setWrapText(true);
        style.setFont(font);
     
        return style;
     
      }

    4、通過反射獲取對象信息并處理成String字符串

    我這里只涉及到基本數據類型和Date以及枚舉的值獲取和轉換,小伙伴可以根據自己的實際情況進行修改。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    /**
       * 獲取對象的屬性對應單元格坐標和值的鍵值對
       * @param obj
       * @return
       */
      private static HashMap<Integer, String> getValueMap(Object obj) throws IllegalAccessException {
     
        HashMap<Integer, String> result=new HashMap<>();
     
        Class<?> clz=obj.getClass();
        Field[] fs = clz.getDeclaredFields();
        for(Field f:fs) {
          f.setAccessible(true);
          if(f.isAnnotationPresent(ExcelResources.class)) {
            Integer order=f.getAnnotation(ExcelResources.class).order();
            String value="";
     
            Object valueObj=f.get(obj);
            if(valueObj!=null) {
       //日期格式進行特殊處理
              if(f.getType()==Date.class){
     
                String pattern=f.getAnnotation(ExcelResources.class).pattern();
                if(StringUtils.isEmpty(pattern)){
                  pattern="yyyy-MM-dd HH:mm:ss";
                }
                SimpleDateFormat sdf=new SimpleDateFormat(pattern);
                value=sdf.format(valueObj);
              }else{
                value=valueObj.toString();//其他格式調用toString方法,這里枚舉就需要定義自己的toString方法
              }
     
            }
     
            result.put(order, value);
     
          }
        }
     
        return result;
      }

    5、枚舉的定義

    如果有用到枚舉存儲在數據庫的小伙伴,可以自定義枚舉的toString方法來實現excel導出時候相應的內容

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public enum SexType {
     
     male("男"),
     female("女"),
     ;
     
     private String typeName;
     
     SexType(String typeName) {
     this.typeName = typeName;
     }
     
     @Override
     public String toString() {
     return typeName;
     }
     
    }

    6、encodeFileName

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    /**
      * 根據不同的瀏覽器生成不同類型中文文件名編碼
      *
      * @param request
      * @param fileName
      * @return
      * @throws UnsupportedEncodingException
      */
     public static String encodeFileName(HttpServletRequest request, String fileName)
         throws UnsupportedEncodingException
     {
     
       String new_filename = URLEncoder.encode(fileName, "UTF8").replaceAll("\\+", "%20");
     
       String agent = request.getHeader("USER-AGENT").toLowerCase();
       if (null != agent && -1 != agent.indexOf("msie"))
       {
         /**
          * IE瀏覽器,只能采用URLEncoder編碼
          */
         return "filename=\"" + new_filename +"\"";
       }else if (null != agent && -1 != agent.indexOf("applewebkit")){
         /**
          * Chrome瀏覽器,只能采用ISO編碼的中文輸出
          */
         return "filename=\"" + new String(fileName.getBytes("UTF-8"),"ISO8859-1") +"\"";
       } else if (null != agent && -1 != agent.indexOf("opera")){
         /**
          * Opera瀏覽器只可以使用filename*的中文輸出
          * RFC2231規定的標準
          */
         return "filename*=" + new_filename ;
       }else if (null != agent && -1 != agent.indexOf("safari")){
         /**
          * Safani瀏覽器,只能采用iso編碼的中文輸出
          */
         return "filename=\"" + new String(fileName.getBytes("UTF-8"),"ISO8859-1") +"\"";
       }else if (null != agent && -1 != agent.indexOf("firefox"))
       {
         /**
          * Firfox瀏覽器,可以使用filename*的中文輸出
          * RFC2231規定的標準
          */
         return "filename*=" + new_filename ;
       } else
       {
         return "filename=\"" + new_filename +"\"";
       }
     }

    三、方法調用案例

    1、方法調用

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    public void exportExcelDemo(HttpServletRequest request, HttpServletResponse response) {
     
      //一系列查詢處理
        List<ExcelDemoModel> demoList=new ArrayList<>();
        
        excelService.exportExcel(request,response,"人員信息demo",demoList,ExcelDemoModel.class);
     
      }

    2、導出效果

    SpringBoot整合POI導出通用Excel的方法示例

    到此這篇關于SpringBoot整合POI導出通用Excel的方法示例的文章就介紹到這了,更多相關SpringBoot整合POI導出Excel內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

    原文鏈接:https://blog.csdn.net/mengdi_cao/article/details/108143004

    延伸 · 閱讀

    精彩推薦
    主站蜘蛛池模板: 果冻传媒在线播放观看w | 四虎884aa永久播放地址http | 紧身裙女教师波多野结衣 | 午夜综合 | 3d美女触手怪爆羞羞漫画 | 成年男人永久免费看片 | 国产私拍精品88福利视频 | 精品一区二区三区免费毛片 | 羞羞答答影院在线 | 国产欧美久久久精品影院 | 奇米777狠狠 | 日韩亚洲欧美理论片 | 四虎国产精品免费久久麻豆 | 精品成人网 | 免费超级乱淫视频播放性 | 亚洲天堂.com| 成人在线一区二区三区 | naruto hentai玖辛奈| 日本视频免费在线播放 | 动漫女性扒开尿口羞羞漫画 | 色综合欧美色综合七久久 | japanese在线看 | 亚洲狠狠综合久久 | 免费一区二区视频 | 国产91精品露脸国语对白 | 久久精品国产久精国产果冻传媒 | 第一次不是你高清在线观看 | 1769亚洲欧美资源站 | 国产自在自线午夜精品之la | 禁忌h1v1怀孕 | 欧美成人精品福利在线视频 | 欧美区一区 | 毛片免费观看 | 午夜人妻理论片天堂影院 | 天堂在线观看中文字幕 | 欧美午夜视频一区二区三区 | 亚洲精品在线网址 | 深夜免费在线观看 | 国产v在线播放 | 精品久久久久香蕉网 | 久久九九亚洲精品 |