国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SpringBoot整合POI導(dǎo)出通用Excel的方法示例

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

一、準(zhǔn)備工作

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單元格的相關(guān)信息,用在需要導(dǎo)出的類上。

大家可以根據(jù)自己的實(shí)際需求來(lái)定義更多的內(nèi)容。

@Retention(RetentionPolicy.RUNTIME)public @interface ExcelResources { int order() default 9999;//定義字段在excel的單元格列坐標(biāo)位置 String title() default '';//定義列坐標(biāo)對(duì)應(yīng)的標(biāo)題 int cloumn() default 100;//定義列寬 String pattern() default '';//定義日期顯示格式}

3、定義需要導(dǎo)出的實(shí)體

舉例說(shuō)明@ExcelResources 的應(yīng)用場(chǎng)景,我們創(chuàng)建一個(gè)demoModel,包含姓名、年齡、性別、日期。

后邊的excel導(dǎo)出例子也采用這個(gè)實(shí)體類來(lái)舉例。

@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 = '創(chuàng)建時(shí)間',cloumn = 24,pattern = 'yyyy-MM-dd HH:mm:ss') private Date createTime; @ExcelResources(order=3,title = '性別',cloumn = 10) private SexType sex;//枚舉 }

4、定義導(dǎo)出輔助類

用于存放導(dǎo)出的excel對(duì)應(yīng)標(biāo)題和列寬

@Data@NoArgsConstructor@AllArgsConstructorpublic class TitleAndCloumn { private String title;//標(biāo)題 private int cloumn;//列寬}

二、具體的導(dǎo)出方法

1、導(dǎo)出主要方法

@Servicepublic class ExcelService { private static float title_row_height=30;//標(biāo)題行高 private static float data_row_height=25;//數(shù)據(jù)行高 public void exportExcel(HttpServletRequest request, HttpServletResponse response, String fileName ,List<?> excelDatas,Class<?> clz ) { try { HSSFWorkbook resultWb=new HSSFWorkbook(); HSSFSheet sheet=resultWb.createSheet();//創(chuàng)建sheet //根據(jù)類類型信息獲取導(dǎo)出的excel對(duì)應(yīng)的標(biāo)題和列寬 key-列號(hào),value-標(biāo)題和列寬 HashMap<Integer, TitleAndCloumn> orderTitleAndCloumnMap=getTitleAndCloumnMap(clz); //設(shè)置列寬 orderTitleAndCloumnMap.forEach((k,v) -> {sheet.setColumnWidth(k, v.getCloumn()*256); }); HSSFRow row0=sheet.createRow(0); //設(shè)置標(biāo)題行高 row0.setHeightInPoints(title_row_height); //創(chuàng)建標(biāo)題單元格格式 HSSFCellStyle titleCellStyle=getCellStyle(resultWb,11,true,HSSFColor.BLACK.index); //填充標(biāo)題行內(nèi)容 orderTitleAndCloumnMap.forEach((k,v) -> {HSSFCell row0Cell=row0.createCell(k);row0Cell.setCellValue(v.getTitle());row0Cell.setCellStyle(titleCellStyle); }); //創(chuàng)建正文單元格格式 HSSFCellStyle dataStyle = getCellStyle(resultWb,11,false,HSSFColor.BLACK.index); //將正文轉(zhuǎn)換為excel數(shù)據(jù) int rowNum=1; for(Object data:excelDatas){HSSFRow row=sheet.createRow(rowNum++);row.setHeightInPoints(data_row_height); //獲取對(duì)象值 key-列號(hào) 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、通過(guò)反射獲取excel標(biāo)題和列寬

/** * 獲取類的屬性對(duì)應(yīng)單元格標(biāo)題和列寬 * @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、創(chuàng)建CellStyle

通過(guò)傳入?yún)?shù)定義簡(jiǎn)單地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);//字號(hào) font.setColor(color);//顏色 font.setFontName('宋體');//字體 if(isBoleaWeight){ font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //字體加粗 } style.setWrapText(true); style.setFont(font); return style; }

4、通過(guò)反射獲取對(duì)象信息并處理成String字符串

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

/** * 獲取對(duì)象的屬性對(duì)應(yīng)單元格坐標(biāo)和值的鍵值對(duì) * @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) { //日期格式進(jìn)行特殊處理 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();//其他格式調(diào)用toString方法,這里枚舉就需要定義自己的toString方法 }}result.put(order, value); } } return result; }

5、枚舉的定義

如果有用到枚舉存儲(chǔ)在數(shù)據(jù)庫(kù)的小伙伴,可以自定義枚舉的toString方法來(lái)實(shí)現(xiàn)excel導(dǎo)出時(shí)候相應(yīng)的內(nèi)容

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

6、encodeFileName

/** * 根據(jù)不同的瀏覽器生成不同類型中文文件名編碼 * * @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規(guī)定的標(biāo)準(zhǔn) */ 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規(guī)定的標(biāo)準(zhǔn) */ return 'filename*=' + new_filename ; } else { return 'filename='' + new_filename +'''; } }

三、方法調(diào)用案例

1、方法調(diào)用

public void exportExcelDemo(HttpServletRequest request, HttpServletResponse response) { //一系列查詢處理 List<ExcelDemoModel> demoList=new ArrayList<>();excelService.exportExcel(request,response,'人員信息demo',demoList,ExcelDemoModel.class); }

2、導(dǎo)出效果

SpringBoot整合POI導(dǎo)出通用Excel的方法示例

到此這篇關(guān)于SpringBoot整合POI導(dǎo)出通用Excel的方法示例的文章就介紹到這了,更多相關(guān)SpringBoot整合POI導(dǎo)出Excel內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: excel
相關(guān)文章:
主站蜘蛛池模板: 日本aaa毛片 | 尹人在线视频 | 欧美大片无尺码在线观看 | 正在播放国产一区 | 视频在线二区 | 欧洲免费无线码一二区 | 老司机亚洲精品 | 成人午夜性a一级毛片美女 成人午夜亚洲影视在线观看 | 欧美特黄一级 | 欧美日韩在线播一区二区三区 | 国产成人精品无缓存在线播放 | 青青草福利视频 | 亚洲视频在线观看地址 | 中文字幕在线看片成人 | 成人午夜影视全部免费看 | 国产欧美一区二区另类精品 | 免费视频精品一区二区三区 | 综合在线视频精品专区 | 日本欧美亚洲 | 久久久精品一区二区三区 | 欧美视频在线一区二区三区 | 国产成人精品福利网站在线 | 日本乱人伦片中文三区 | 欧美成人免费午夜全 | 一级特黄aaa大片免费看 | 一级毛片免费视频观看 | 亚洲美女视频在线观看 | 成人欧美视频在线观看播放 | 日韩成人黄色片 | 国产区在线免费观看 | 新体操真 | 97超级碰碰碰久久久观看 | 二级毛片在线播放 | 欧美午夜a级精美理论片 | 久久精品免看国产 | 国产黄色自拍 | 成人亲子乱子伦视频 | 国产男女视频 | 美女一丝不佳一级毛片香蕉 | 久久久久88色偷偷免费 | 成人亚洲精品 |