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

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

Springboot實現導入導出Excel的方法

瀏覽:183日期:2022-06-15 18:06:40
目錄一、添加poi的maven依賴二、自定義注解(Excel屬性標題、位置等)三、CustomExcelUtils編寫四、定義導出實體類五、Controller層代碼編寫一、添加poi的maven依賴

<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屬性標題、位置等)

package com.cloud.core.annotation;import java.lang.annotation.*;/** * 自定義實體類所需要的bean(Excel屬性標題、位置等) * 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標題 * * @return * @author Rex */ String value() default ''; /** * Excel從左往右排列位置,第一個是0 * * @return * @author Rex */ int col() default 0;}三、CustomExcelUtils編寫

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;/** * 自定義導入導出Excel文件類 * 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 為了測試文件用,實際為空 * @param cls 類 * @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) {//類映射 注解 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是相同的 語法 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);//默認讀取第一個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); //數字類型} 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(); //寫入頭部 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()); }}); });}//凍結窗格wb.getSheet('Sheet1').createFreezePane(0, 1, 0, 1);//瀏覽器下載excelbuildExcelDocument('導出數據.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();} }}四、定義導出實體類

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

package com.cloud.library.model.role;import com.cloud.core.annotation.ExcelColumn;import lombok.Data;/** * 導入角色用 * 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對應的模板參考

Springboot實現導入導出Excel的方法

五、Controller層代碼編寫

//region 導入數據 /** * 導入數據 * * @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

這里發現了,這個saveBatch可以直接使用雪花的id來保存數據,因為這里用的是mybatis-plus,單條數據保存使用的是它的配置。然后試了下,批量導入也是可以的,另外,這個批量保存,理論上沒有條數限制,這個還等待后續測試。

到此這篇關于Springboot實現導入導出Excel的方法的文章就介紹到這了,更多相關Springboot導入導出Excel內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: excel
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲三级欧美| 久久久国产亚洲精品| 欧美大黑bbbbbbbbb在线| 色88888久久久久久影院| 免费精品国产| 日韩激情av在线| 精品国产中文字幕第一页| 四虎成人av| 久久高清免费| 欧美中文字幕| 国产精品久久久久久久久久白浆| 国产一区一一区高清不卡| 久久天堂影院| 日韩毛片在线| 综合色一区二区| 免费精品一区| 99精品在线免费在线观看| 视频一区二区三区在线| 日韩av一区二区三区| 成午夜精品一区二区三区软件| 久久黄色影院| 日韩毛片一区| 伊人久久av| 亚洲人成高清| 日韩1区2区| 一区二区三区网站| 成人国产精品一区二区免费麻豆| 国产在线欧美| 国产精品免费不| 欧美日韩一区二区综合| 日本精品国产| 日韩精品免费一区二区在线观看| 亚洲五月综合| 亚洲黄色网址| 日本少妇一区二区| 88xx成人免费观看视频库| 伊人国产精品| 久久久国产亚洲精品| 国产日产一区| 久久一二三区| av资源亚洲| 欧美伊人影院| 国产在线日韩| 久久不见久久见中文字幕免费| 国产精品婷婷| 久久毛片亚洲| 91久久精品无嫩草影院| 欧美 日韩 国产精品免费观看| 久久不见久久见中文字幕免费| 99视频+国产日韩欧美| 国产一区二区三区日韩精品| 亚洲精品乱码久久久久久蜜桃麻豆| 在线观看精品| 免费精品一区| 日韩影片在线观看| 中文亚洲免费| 精品日韩视频| 嫩草伊人久久精品少妇av杨幂| 国产亚洲在线观看| 色爱av综合网| 高潮久久久久久久久久久久久久| 日韩美女精品| 中文一区在线| 99精品电影| 国产精品毛片久久| 国产精品久久久久久久久久久久久久久| 在线亚洲精品| 伊人久久大香线蕉av不卡| 色爱综合网欧美| 免费一级欧美在线观看视频| 中文字幕日韩高清在线| 婷婷激情综合| 国产在线|日韩| 国产 日韩 欧美 综合 一区| 91av一区| 日本精品另类| 亚洲日本久久| 日韩一区精品| 亚洲日本三级| 亚洲免费资源| 婷婷五月色综合香五月| 美国三级日本三级久久99| 亚洲欧美日韩一区在线观看| 自由日本语亚洲人高潮| 9色国产精品| 模特精品在线| 香蕉久久久久久| 亚洲精品看片| 日韩av三区| 国产精品亚洲成在人线| 久久不卡日韩美女| 精品一区视频| 亚洲日本网址| 免费观看久久av| 亚洲成人日韩| 亚洲资源av| 最新亚洲国产| 日韩激情中文字幕| 国产精品videossex久久发布 | 亚洲视频www| 自由日本语亚洲人高潮| 亚洲欧美不卡| 日本不卡一二三区黄网| 欧美在线日韩| 美女视频一区在线观看| 激情中国色综合| 成人精品中文字幕| 久久亚洲专区| 亚洲欧美日本日韩| 亚洲精品三级| 国产精品99精品一区二区三区∴ | 色爱综合av| 伊人影院久久| 午夜亚洲福利| 蜜桃久久久久| 99视频精品全部免费在线视频| 亚洲在线国产日韩欧美| 69堂免费精品视频在线播放| 精品色999| 香蕉国产精品| 欧美日韩a区| 色偷偷色偷偷色偷偷在线视频| 亚洲精品国产偷自在线观看| 日韩午夜视频在线| 粉嫩av一区二区三区四区五区| 美女福利一区二区三区| 天堂成人国产精品一区| 国产精品sm| 欧美+日本+国产+在线a∨观看| 亚洲欧美一级| 国产aⅴ精品一区二区四区| 黑丝一区二区三区| 国产日韩欧美一区二区三区在线观看| 涩涩av在线| 日韩国产欧美一区二区三区| 热三久草你在线| 日韩在线观看中文字幕| 成人欧美一区二区三区的电影| 丝袜脚交一区二区| 精品黄色一级片| 激情偷拍久久| 久久99青青| 亚洲最大av| 久久久久国产一区二区| 91嫩草精品| 九一国产精品| 老鸭窝一区二区久久精品| 亚洲欧美不卡| 在线天堂中文资源最新版| 少妇精品在线| 欧美久久精品一级c片| 欧美国产免费| 蜜桃视频在线观看一区| 精品国产美女a久久9999| 在线看片日韩| 欧美天堂视频| 国产精品**亚洲精品| 日韩制服丝袜先锋影音| 国语精品一区| 欧美日韩一区二区国产| 午夜在线视频一区二区区别| 理论片午夜视频在线观看| 久久激情综合网| 视频一区二区不卡| 激情久久久久久| 成人亚洲欧美| 久久不卡国产精品一区二区| 亚洲精品护士| 国产亚洲午夜| 久久久9色精品国产一区二区三区| 91成人精品在线| 麻豆精品91| 欧美日韩在线二区| 国产白浆在线免费观看| 国产福利资源一区| 欧美精品国产一区| 亚洲欧美久久精品| 六月婷婷一区| 国产亚洲精品v| 欧美日一区二区| 日韩成人亚洲| 在线看片国产福利你懂的| 精品一区二区三区四区五区| 国产日本精品| 欧美片网站免费| 亚洲专区视频| 免费高清在线一区| 香蕉精品999视频一区二区| 一区二区三区四区在线看| 日韩欧美一区二区三区在线观看 | 黄色aa久久| 精品一区二区三区中文字幕视频 | 石原莉奈在线亚洲二区| 亚洲激情精品| 伊人久久大香线蕉av超碰演员| 999国产精品视频| 亚洲精品国产嫩草在线观看| av中文资源在线资源免费观看| 成人亚洲精品| 国产伦久视频在线观看|