日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:194日期:2022-06-17 08:54:08

一、準備工作

1、pom依賴

在pom.xml中加入POI的依賴

<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單元格的相關信息,用在需要導出的類上。

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

@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導出例子也采用這個實體類來舉例。

@Datapublic 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對應標題和列寬

@Data@NoArgsConstructor@AllArgsConstructorpublic class TitleAndCloumn { private String title;//標題 private int cloumn;//列寬}

二、具體的導出方法

1、導出主要方法

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

/** * 獲取類的屬性對應單元格標題和列寬 * @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 title=f.getAnnotation(ExcelResources.class).title();int cloumn=f.getAnnotation(ExcelResources.class).cloumn();TitleAndCloumn titleAndCloumn=new TitleAndCloumn(title,cloumn);orderTitleAndCloumnMap.put(order,titleAndCloumn); } } return orderTitleAndCloumnMap; }

3、創建CellStyle

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

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以及枚舉的值獲取和轉換,小伙伴可以根據自己的實際情況進行修改。

/** * 獲取對象的屬性對應單元格坐標和值的鍵值對 * @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導出時候相應的內容

public enum SexType { male('男'), female('女'), ; private String typeName; SexType(String typeName) { this.typeName = typeName; } @Override public String toString() { return typeName; }}

6、encodeFileName

/** * 根據不同的瀏覽器生成不同類型中文文件名編碼 * * @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、方法調用

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內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: excel
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美片第1页| 国产亚洲久久| 亚洲精品进入| 亚洲精品动态| 亚洲不卡视频| 无码日韩精品一区二区免费| 天堂成人免费av电影一区| 日韩国产一区二区| 亚洲爱爱视频| 夜久久久久久| 伊人久久亚洲热| 亚洲精品亚洲人成在线观看| 欧美久久精品| 日韩欧美二区| 亚洲经典在线| 国产三级精品三级在线观看国产| 国产精品亚洲综合久久| 精品不卡一区| 亚州av乱码久久精品蜜桃| 亚洲免费黄色| 日韩va亚洲va欧美va久久| 日韩欧美2区| 亚洲视频国产| 精品国产一区二| 欧美高清不卡| 国产亚洲一区| 国产99精品一区| 欧美日韩午夜电影网| 国产精品久久久久久久免费观看 | 天堂成人国产精品一区| 国产欧美91| 婷婷激情综合| 国产精品手机在线播放| 美女免费视频一区| 成人免费电影网址| 美腿丝袜在线亚洲一区| 日韩不卡一区二区三区| 一区二区高清| 日韩欧美久久| 日本91福利区| 国产精品中文字幕亚洲欧美| 婷婷久久免费视频| 亚洲午夜免费| 欧美黄色网页| 麻豆国产精品777777在线| 蜜臀av性久久久久蜜臀aⅴ四虎| 麻豆一区二区在线| 亚洲欧美日本国产 | 国产日韩专区| 亚洲涩涩在线| 国产精品igao视频网网址不卡日韩| 蜜桃tv一区二区三区| 精品国产美女a久久9999| 日韩高清在线观看一区二区| 久久免费高清| 日韩理论视频| 福利一区和二区| 久久亚洲精精品中文字幕| 自拍自偷一区二区三区| 黄色不卡一区| 欧美一区二区三区高清视频| 高清av不卡| 欧美经典一区| 免费精品一区| 国产一区2区| 精品视频99| 国产伊人久久| 福利在线免费视频| 久久久久久久欧美精品| 亚洲国内精品| 蜜臀av免费一区二区三区| 欧美精品日日操| 欧美+亚洲+精品+三区| 91精品精品| 国产美女精品| 欧美精品黄色| 深夜日韩欧美| 欧美国产另类| 日本精品影院| 日韩精品一二区| 日本欧美久久久久免费播放网| 国产精品66| 999精品色在线播放| 亚洲乱码一区| 国产亚洲网站| 亚洲伊人精品酒店| 麻豆久久一区| 三级欧美在线一区| 成人午夜网址| 亚洲欧美不卡| 日韩国产在线不卡视频| 日韩在线观看不卡| 日韩二区在线观看| 美女少妇全过程你懂的久久| 国产精品最新| 欧美午夜不卡影院在线观看完整版免费| 日韩国产精品久久久久久亚洲| 久久久久网站| 福利一区在线| 国产精品一区二区三区美女| 国产亚洲精品自拍| 日韩高清中文字幕一区二区| 日韩一区免费| 一本一道久久a久久精品蜜桃| 国产精品chinese| 亚洲欧美日韩精品一区二区| 国产美女高潮在线| 亚洲制服欧美另类| 亚洲精品97| 日韩免费精品| 亚洲精品a级片| 精品一区91| 蜜桃视频一区二区| 久热re这里精品视频在线6| 久久成人福利| 性色av一区二区怡红| 久久精品毛片| 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 四虎精品永久免费| 久久精品免费一区二区三区 | 国产日韩欧美在线播放不卡| 日本蜜桃在线观看视频| 婷婷久久免费视频| 亚洲国产日韩欧美在线| 国产精品成久久久久| 欧美天堂一区二区| 国产伦精品一区二区三区千人斩| 欧洲一区二区三区精品| 欧美亚洲人成在线| 亚洲天堂免费| 伊人久久大香线蕉av超碰演员| 精品国内亚洲2022精品成人| 日韩动漫一区| 欧美日韩在线精品一区二区三区激情综合| 青草国产精品久久久久久| 日韩亚洲精品在线观看| 日韩中文字幕| 国产精品巨作av| 久久只有精品| 性欧美长视频| 日本va欧美va瓶| 国产精品片aa在线观看| 欧美一区久久| 免费久久精品| 天堂成人免费av电影一区| 亚洲精品观看| 欧美激情在线精品一区二区三区| 日韩精品一区二区三区免费观影 | 久久精品国产在热久久| 欧美片网站免费| 日韩一区二区三区高清在线观看| 亚洲午夜在线| 久久国产电影| 日韩av有码| 影视先锋久久| 石原莉奈在线亚洲二区| 亚洲狼人精品一区二区三区| 日韩在线a电影| 日韩三级一区| 国产精品久久久久久久久免费高清| 国产日韩在线观看视频| 国产日韩一区二区三区在线播放| 精品视频一区二区三区在线观看 | 国产亚洲一区在线| 天堂俺去俺来也www久久婷婷| 日韩av网站免费在线| 精品国产a一区二区三区v免费| 三上亚洲一区二区| 中国字幕a在线看韩国电影| 日韩一区电影| 亚洲欧美久久久| 奇米亚洲欧美| 一区三区视频| 国产精品美女在线观看直播| 欧美日韩一区二区三区四区在线观看| 国产图片一区| 亚洲不卡系列| 一区二区三区四区日韩| 精品免费视频| 免费在线观看成人| 成人午夜亚洲| 四虎成人精品一区二区免费网站| 亚洲国产福利| 中文字幕亚洲在线观看| 电影91久久久| 蜜桃91丨九色丨蝌蚪91桃色| 国内在线观看一区二区三区| 91久久在线| 色综合www| 婷婷五月色综合香五月| 成人羞羞视频播放网站| 欧美经典一区| 91精品在线免费视频| 久久国产精品亚洲77777| 麻豆国产91在线播放| 免播放器亚洲一区| 日本精品在线中文字幕| 免费日韩成人| 国产精品18| 国产精品夜夜夜|