电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

Springboot實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel的方法

瀏覽:133日期:2022-06-15 18:06:40
目錄一、添加poi的maven依賴(lài)二、自定義注解(Excel屬性標(biāo)題、位置等)三、CustomExcelUtils編寫(xiě)四、定義導(dǎo)出實(shí)體類(lèi)五、Controller層代碼編寫(xiě)一、添加poi的maven依賴(lài)

<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.13</version></dependency><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.13</version></dependency>二、自定義注解(Excel屬性標(biāo)題、位置等)

package com.cloud.core.annotation;import java.lang.annotation.*;/** * 自定義實(shí)體類(lèi)所需要的bean(Excel屬性標(biāo)題、位置等) * Copyright: Copyright (C) 2021 DLANGEL, Inc. All rights reserved. * Company: 大連安琪科技有限公司 * * @author Rex * @since 2021/5/19 9:30 */@Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface ExcelColumn { /** * Excel標(biāo)題 * * @return * @author Rex */ String value() default ''; /** * Excel從左往右排列位置,第一個(gè)是0 * * @return * @author Rex */ int col() default 0;}三、CustomExcelUtils編寫(xiě)

package com.cloud.core.utils;import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;import com.cloud.core.annotation.ExcelColumn;import com.cloud.core.common.CommonConst;import org.apache.commons.lang.BooleanUtils;import org.apache.commons.lang.CharUtils;import org.apache.commons.lang.StringUtils;import org.apache.commons.lang.math.NumberUtils;import org.apache.poi.hssf.usermodel.HSSFDateUtil;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.ss.usermodel.*;import org.apache.poi.xssf.usermodel.XSSFWorkbook;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.http.MediaType;import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.math.BigDecimal;import java.net.URLEncoder;import java.util.*;import java.util.concurrent.atomic.AtomicInteger;import java.util.stream.Collectors;import java.util.stream.Stream;/** * 自定義導(dǎo)入導(dǎo)出Excel文件類(lèi) * Copyright: Copyright (C) 2021 DLANGEL, Inc. All rights reserved. * Company: 大連安琪科技有限公司 * * @author Rex * @since 2021/5/19 9:31 */public class CustomExcelUtils { private final static Logger log = LoggerFactory.getLogger(CustomExcelUtils.class); private final static String EXCEL2003 = 'xls'; private final static String EXCEL2007 = 'xlsx'; /** * 讀取Excel * * @param path 為了測(cè)試文件用,實(shí)際為空 * @param cls 類(lèi) * @param startRow 起始行 * @param file 文件 * @return * @author Rex */ public static <T> List<T> readExcel(String path, Class<T> cls, int startRow, MultipartFile file) {String fileName = file.getOriginalFilename();if (!fileName.matches(CommonConst.Regex.FILE_EXT_XLS) && !fileName.matches(CommonConst.Regex.FILE_EXT_XLSX)) { log.error('上傳文件格式不正確');}List<T> dataList = new ArrayList<>();Workbook workbook = null;try { InputStream is = file.getInputStream(); if (fileName.endsWith(EXCEL2007)) {//FileInputStream is = new FileInputStream(new File(path));workbook = new XSSFWorkbook(is); } if (fileName.endsWith(EXCEL2003)) {//FileInputStream is = new FileInputStream(new File(path));workbook = new HSSFWorkbook(is); } if (workbook != null) {//類(lèi)映射 注解 value-->bean columnsMap<String, List<Field>> classMap = new HashMap<>();List<Field> fields = Stream.of(cls.getDeclaredFields()).collect(Collectors.toList());fields.forEach(field -> { ExcelColumn annotation = field.getAnnotation(ExcelColumn.class); if (annotation != null) {String value = annotation.value();if (StringUtils.isBlank(value)) { // return起到的作用和continue是相同的 語(yǔ)法 return;}if (!classMap.containsKey(value)) { classMap.put(value, new ArrayList<>());}field.setAccessible(true);classMap.get(value).add(field); }});//索引-->columnsMap<Integer, List<Field>> reflectionMap = new HashMap<>(16);//默認(rèn)讀取第一個(gè)sheetSheet sheet = workbook.getSheetAt(0);boolean firstRow = true;for (int i = startRow; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); // 提取注解 if (firstRow) {for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) { Cell cell = row.getCell(j); String cellValue = getCellValue(cell); if (classMap.containsKey(cellValue)) {reflectionMap.put(j, classMap.get(cellValue)); }}if (reflectionMap.size() > 0) { firstRow = false;} } else {//忽略空白行if (row == null) { continue;}try { T t = cls.newInstance(); //判斷是否為空白行 boolean allBlank = true; for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {if (reflectionMap.containsKey(j)) { Cell cell = row.getCell(j); String cellValue = getCellValue(cell); if (StringUtils.isNotBlank(cellValue)) {allBlank = false; } List<Field> fieldList = reflectionMap.get(j); fieldList.forEach( x -> {try {handleField(t, cellValue, x);} catch (Exception e) {log.error(String.format('reflect field:%s value:%s exception!', x.getName(), cellValue), e);} } );} } if (!allBlank) {dataList.add(t); } else {log.warn(String.format('row:%s is blank ignore!', i)); }} catch (Exception e) { log.error(String.format('parse row:%s exception!', i), e);} }} }} catch (Exception e) { log.error(String.format('parse excel exception!'), e);} finally { if (workbook != null) {try { workbook.close();} catch (Exception e) { log.error(String.format('parse excel exception!'), e);} }}return dataList; } private static <T> void handleField(T t, String value, Field field) throws Exception {Class<?> type = field.getType();if (type == null || type == void.class || StringUtils.isBlank(value)) { return;}if (type == Object.class) { field.set(t, value); //數(shù)字類(lèi)型} else if (type.getSuperclass() == null || type.getSuperclass() == Number.class) { if (type == int.class || type == Integer.class) {field.set(t, NumberUtils.toInt(value)); } else if (type == long.class || type == Long.class) {field.set(t, NumberUtils.toLong(value)); } else if (type == byte.class || type == Byte.class) {field.set(t, NumberUtils.toByte(value)); } else if (type == short.class || type == Short.class) {field.set(t, NumberUtils.toShort(value)); } else if (type == double.class || type == Double.class) {field.set(t, NumberUtils.toDouble(value)); } else if (type == float.class || type == Float.class) {field.set(t, NumberUtils.toFloat(value)); } else if (type == char.class || type == Character.class) {field.set(t, CharUtils.toChar(value)); } else if (type == boolean.class) {field.set(t, BooleanUtils.toBoolean(value)); } else if (type == BigDecimal.class) {field.set(t, new BigDecimal(value)); }} else if (type == Boolean.class) { field.set(t, BooleanUtils.toBoolean(value));} else if (type == Date.class) { // field.set(t, value);} else if (type == String.class) { field.set(t, value);} else { Constructor<?> constructor = type.getConstructor(String.class); field.set(t, constructor.newInstance(value));} } private static String getCellValue(Cell cell) {if (cell == null) { return '';}if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { if (HSSFDateUtil.isCellDateFormatted(cell)) {return HSSFDateUtil.getJavaDate(cell.getNumericCellValue()).toString(); } else {return new BigDecimal(cell.getNumericCellValue()).toString(); }} else if (cell.getCellType() == Cell.CELL_TYPE_STRING) { return StringUtils.trimToEmpty(cell.getStringCellValue());} else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { return StringUtils.trimToEmpty(cell.getCellFormula());} else if (cell.getCellType() == Cell.CELL_TYPE_BLANK) { return '';} else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { return String.valueOf(cell.getBooleanCellValue());} else if (cell.getCellType() == Cell.CELL_TYPE_ERROR) { return 'ERROR';} else { return cell.toString().trim();} } public static <T> void writeExcel(HttpServletResponse response, List<T> dataList, Class<T> cls) {Field[] fields = cls.getDeclaredFields();List<Field> fieldList = Arrays.stream(fields).filter(field -> { ExcelColumn annotation = field.getAnnotation(ExcelColumn.class); if (annotation != null && annotation.col() > 0) {field.setAccessible(true);return true; } return false;}).sorted(Comparator.comparing(field -> { int col = 0; ExcelColumn annotation = field.getAnnotation(ExcelColumn.class); if (annotation != null) {col = annotation.col(); } return col;})).collect(Collectors.toList());Workbook wb = new XSSFWorkbook();Sheet sheet = wb.createSheet('Sheet1');AtomicInteger ai = new AtomicInteger();{ Row row = sheet.createRow(ai.getAndIncrement()); AtomicInteger aj = new AtomicInteger(); //寫(xiě)入頭部 fieldList.forEach(field -> {ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);String columnName = '';if (annotation != null) { columnName = annotation.value();}Cell cell = row.createCell(aj.getAndIncrement());CellStyle cellStyle = wb.createCellStyle();cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);cellStyle.setAlignment(CellStyle.ALIGN_CENTER);Font font = wb.createFont();font.setBoldweight(Font.BOLDWEIGHT_NORMAL);cellStyle.setFont(font);cell.setCellStyle(cellStyle);cell.setCellValue(columnName); });}if (CollectionUtils.isNotEmpty(dataList)) { dataList.forEach(t -> {Row row1 = sheet.createRow(ai.getAndIncrement());AtomicInteger aj = new AtomicInteger();fieldList.forEach(field -> { Class<?> type = field.getType(); Object value = ''; try {value = field.get(t); } catch (Exception e) {e.printStackTrace(); } Cell cell = row1.createCell(aj.getAndIncrement()); if (value != null) {if (type == Date.class) { cell.setCellValue(value.toString());} else { cell.setCellValue(value.toString());}cell.setCellValue(value.toString()); }}); });}//凍結(jié)窗格wb.getSheet('Sheet1').createFreezePane(0, 1, 0, 1);//瀏覽器下載excelbuildExcelDocument('導(dǎo)出數(shù)據(jù).xlsx', wb, response);//生成excel文件//buildExcelFile('.default.xlsx', wb); } /** * 瀏覽器下載excel * * @param fileName * @param wb * @param response */ private static void buildExcelDocument(String fileName, Workbook wb, HttpServletResponse response) {try { response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); response.setHeader('Content-Disposition', 'attachment;filename=' + URLEncoder.encode(fileName, 'utf-8')); response.flushBuffer(); wb.write(response.getOutputStream());} catch (IOException e) { e.printStackTrace();} } /** * 生成excel文件 * * @param path 生成excel路徑 * @param wb */ private static void buildExcelFile(String path, Workbook wb) {File file = new File(path);if (file.exists()) { file.delete();}try { wb.write(new FileOutputStream(file));} catch (Exception e) { e.printStackTrace();} }}四、定義導(dǎo)出實(shí)體類(lèi)

主要是使用這里的@ExcelColumn注解,其中的col從0開(kāi)始的。

package com.cloud.library.model.role;import com.cloud.core.annotation.ExcelColumn;import lombok.Data;/** * 導(dǎo)入角色用 * Copyright: Copyright (C) 2021 DLANGEL, Inc. All rights reserved. * Company: 大連安琪科技有限公司 * * @author Rex * @since 2021/5/19 16:13 */@Datapublic class SysRoleExcel { @ExcelColumn(value = '姓名', col = 1) private String name; @ExcelColumn(value = '描述', col = 2) private String description;}

Excel對(duì)應(yīng)的模板參考

Springboot實(shí)現(xiàn)導(dǎo)入導(dǎo)出Excel的方法

五、Controller層代碼編寫(xiě)

//region 導(dǎo)入數(shù)據(jù) /** * 導(dǎo)入數(shù)據(jù) * * @param file * @return * @author Rex */ @RequestMapping(value = '/readExcel', method = RequestMethod.POST) public void readExcel(@RequestParam(value = 'uploadFile', required = false) MultipartFile file) {List<SysRoleExcel> list = CustomExcelUtils.readExcel('', SysRoleExcel.class, 0, file);List<SysRole> sysRoleList = new ArrayList<>();list.forEach(e -> { SysRole sysRole = new SysRole(); BeanUtils.copyProperties(e, sysRole); sysRoleList.add(sysRole);});sysRoleService.saveBatch(sysRoleList); } // endregion

這里發(fā)現(xiàn)了,這個(gè)saveBatch可以直接使用雪花的id來(lái)保存數(shù)據(jù),因?yàn)檫@里用的是mybatis-plus,單條數(shù)據(jù)保存使用的是它的配置。然后試了下,批量導(dǎo)入也是可以的,另外,這個(gè)批量保存,理論上沒(méi)有條數(shù)限制,這個(gè)還等待后續(xù)測(cè)試。

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

標(biāo)簽: excel
相關(guān)文章:
主站蜘蛛池模板: 南京交通事故律师-专打交通事故的南京律师 | 卫生型双针压力表-高温防腐差压表-安徽康泰电气有限公司 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 广州市哲铭油墨涂料有限公司,水性漆生产研发基地 | 南京PVC快速门厂家南京快速卷帘门_南京pvc快速门_世界500强企业国内供应商_南京美高门业 | 冷水机-工业冷水机-冷水机组-欧科隆品牌保障 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 工程管道/塑料管材/pvc排水管/ppr给水管/pe双壁波纹管等品牌管材批发厂家-河南洁尔康建材 | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 铸铁平台,大理石平台专业生产厂家_河北-北重机械 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 | 砍排机-锯骨机-冻肉切丁机-熟肉切片机-预制菜生产线一站式服务厂商 - 广州市祥九瑞盈机械设备有限公司 | 河南正规膏药生产厂家-膏药贴牌-膏药代加工-修康药业集团官网 | 仿真植物|仿真树|仿真花|假树|植物墙 - 广州天昆仿真植物有限公司 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 空气净化器租赁,空气净化器出租,全国直租_奥司汀净化器租赁 | 起好名字_取个好名字_好名网免费取好名在线打分 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 盘式曝气器-微孔曝气器-管式曝气器-曝气盘-斜管填料 | 郑州市前程水处理有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 华东师范大学在职研究生招生网_在职研究生招生联展网 | 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | 交联度测试仪-湿漏电流测试仪-双85恒温恒湿试验箱-常州市科迈实验仪器有限公司 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 自恢复保险丝_贴片保险丝_力特保险丝_Littelfuse_可恢复保险丝供应商-秦晋电子 | 郑州宣传片拍摄-TVC广告片拍摄-微电影短视频制作-河南优柿文化传媒有限公司 | 伟秀电气有限公司-10kv高低压开关柜-高低压配电柜-中置柜-充气柜-欧式箱变-高压真空断路器厂家 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 引领中高档酒店加盟_含舍·美素酒店品牌官网 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 |