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

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

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

瀏覽:191日期: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久久,三上悠亚国产精品一区二区三区
亚洲国内欧美| 一区二区视频欧美| 久久精品97| 麻豆久久久久久久| 成人在线视频免费看| 欧美久久天堂| 午夜欧美精品久久久久久久| 久久久久美女| 蜜臀久久99精品久久久画质超高清| 免费观看日韩电影| 国产欧美日韩在线一区二区| 成人在线超碰| 国产精品普通话对白| 欧美日韩a区| 亚洲黄色免费看| 日韩精品一区第一页| 国产精品一区二区三区av麻| 精品高清久久| 亚洲综合日韩| 国产精品地址| 免费观看久久av| 日韩毛片一区| 国产aⅴ精品一区二区四区| 四虎影视精品| 日韩久久一区| 99热国内精品| 国产情侣一区| 99视频精品| 美女精品久久| 91成人精品| 精品一区二区三区中文字幕视频| 欧美日韩激情| 欧美激情一区| 免费黄色成人| 国产亚洲电影| 欧美美女一区| 国内精品亚洲| 欧美精品一卡| 精品三级久久久| 亚洲精选av| 蜜臀久久精品| 国产亚洲欧美日韩在线观看一区二区 | 国产亚洲欧洲| 久久精品一区二区国产| 天堂av在线一区| 成人亚洲一区| 一本一道久久a久久| 亚洲综合在线电影| 国产精品一区二区美女视频免费看| 欧美美女一区| 黄色在线观看www| 国产精品嫩模av在线| 国产亚洲精品v| 中文字幕一区久| 国产欧美日本| 亚洲另类av| 免费黄色成人| 韩国精品主播一区二区在线观看 | 欧美日韩国产免费观看视频| 老司机免费视频一区二区| 老色鬼久久亚洲一区二区| 日韩欧美一区免费| 精品淫伦v久久水蜜桃| 四虎成人精品一区二区免费网站| 久久久久国产| 欧美日韩在线观看首页| 久久99国产精品视频| 日韩av影院| 最近国产精品视频| 蜜臀91精品国产高清在线观看| 国产videos久久| 嫩呦国产一区二区三区av| 日本天堂一区| 91精品国产自产在线丝袜啪| 亚洲综合专区| 亚洲欧洲美洲国产香蕉| 先锋影音久久久| 日韩午夜在线| 99re国产精品| 国产精品毛片在线| 在线一区欧美| 久久国产精品亚洲77777| 午夜国产精品视频| 国产免费成人| 一区二区三区四区在线看| 日韩欧美综合| 色婷婷狠狠五月综合天色拍| 亚洲黄色中文字幕| 亚洲精品国产嫩草在线观看 | 国产精品久久久久久模特| 国产精品久久久久久久久久妞妞 | 日本国产亚洲| 91国内精品| 国产精品免费不| 精品视频在线一区二区在线| 精品免费视频| 成人亚洲欧美| 亚洲一级特黄| 日韩影院在线观看| 日韩福利视频一区| 国产精品大片| 97se综合| 欧美日韩中文一区二区| 婷婷亚洲五月色综合| 婷婷亚洲综合| 蜜臀av一区二区在线免费观看 | 天堂日韩电影| 国产视频亚洲| 日韩欧美中文在线观看| 国产精品xxx| 久久久久国产精品一区三寸| 中文一区二区| 日韩av电影一区| 高清一区二区三区av| 欧美va天堂在线| 蜜臀久久久99精品久久久久久| 亚洲影视一区| 精品国产亚洲一区二区三区在线| 日韩精品首页| 亚洲精品无播放器在线播放| 国产精品xxx| 免费观看不卡av| 日本成人在线视频网站| 成人在线视频免费| 久久先锋影音| 美女视频黄久久| 伊人精品在线| 日韩成人一级| 日韩精品麻豆| 日韩精品一区二区三区中文| 精品国产99| 在线看片不卡| 国产亚洲一区| 久久中文字幕av| 青草国产精品| 久久精品国内一区二区三区水蜜桃| 亚洲综合日本| 大香伊人久久精品一区二区 | 国产精品麻豆久久| 蜜臀久久99精品久久久画质超高清 | 精品国产三区在线| 欧美另类专区| 国产精久久久| 亚洲国产不卡| 国内自拍视频一区二区三区| 午夜欧美精品| 久久伊人亚洲| 蜜臀av性久久久久蜜臀aⅴ流畅 | 精品一区二区三区在线观看视频 | 国产精品普通话对白| 国产精品传媒麻豆hd| 欧美在线亚洲| 精品视频一区二区三区四区五区| 欧美福利一区| 精品久久91| 色综合视频一区二区三区日韩| 成人欧美一区二区三区的电影| 亚洲精品高潮| 激情久久五月| 水蜜桃久久夜色精品一区| 婷婷亚洲精品| 在线 亚洲欧美在线综合一区| 激情久久99| 国产美女视频一区二区| 久久国产66| 久久精品主播| 国产高潮在线| 国产免费久久| 中文精品电影| 欧美特黄一区| 999久久久免费精品国产| 精品亚洲二区| 国产精品男女| 欧美精品国产一区| 日韩中文一区二区| 一区在线免费观看| 久久精品影视| 国产精品精品| 精品久久久久中文字幕小说| 欧美午夜三级| 亚洲精品大全| 宅男噜噜噜66国产日韩在线观看| 国产精品蜜芽在线观看| 国产精品视频3p| 欧美精品福利| 日韩精彩视频在线观看| 先锋亚洲精品| 国产模特精品视频久久久久| 欧美亚洲国产一区| 久久精品主播| 久久国产欧美| 久久久久久久久久久9不雅视频| 精品视频一区二区三区四区五区 | 日本一区二区三区视频在线看| 亚洲欧美日本日韩| 午夜欧美在线| 在线精品视频在线观看高清| 久久精品99久久无色码中文字幕| 日韩欧美不卡| 久久久久.com|