国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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標題和列寬

?
<video id="pvjvd"></video>

    • <tt id="pvjvd"></tt>
      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

      延伸 · 閱讀

      精彩推薦
      主站蜘蛛池模板: 一区二区三区视频免费在线观看 | 91精品国产乱码久久久久久久久 | 午夜伦4480yy私人影院 | 久久久国产一区二区三区四区小说 | 欧美成人精品一区二区三区在线看 | 精品久久久一区 | 日韩视频―中文字幕 | 精品国产乱码久久久久久1区2区 | 国产在线观看一区 | 蜜桃臀一区二区三区 | 一二三四区视频在线观看 | 日韩一区电影 | 日韩在线精品 | 欧洲一区二区三区 | 国产精品国产三级国产aⅴ9色 | 黄视频在线观看免费 | 国产精品99久久 | 日韩电影免费观看 | 台湾av在线| 精品国产青草久久久久福利 | 综合久久av | 精品麻豆剧传媒av国产九九九 | 男人天堂av网 | 超碰美女| 成人性生交大片免费网站 | 欧美精品久久久久 | 国产成人视屏 | 国产成人精品一区二区三区四区 | 国产精品福利在线 | 一级一片在线观看 | 国产精品久久久久久亚洲调教 | 欧美日韩视频在线 | 国产成人一区二区三区 | 一区二区色 | 成人免费观看在线视频 | 亚洲国产精品成人精品 | 中文字幕高清视频 | 中文字幕亚洲欧美日韩在线不卡 | 一区二区三区久久 | 中文字幕1区 | www.91色.com |
        <sub id="pvjvd"><legend id="pvjvd"></legend></sub>