<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      SpringBoot Excel導(dǎo)入導(dǎo)出

      一、引入pom.xml依賴

      <!-- lombok -->
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <version>1.18.24</version>
      </dependency>
      <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>
      <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-ooxml-schemas</artifactId>
          <version>4.1.2</version>
      </dependency>
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>fastjson</artifactId>
          <version>1.2.79</version>
      </dependency>

      二、自定義實(shí)體類所需要的bean

      /**
       * @project
       * @Description
       * @Author songwp
       * @Date 2022/8/24 16:06
       * @Version 1.0.0
       **/
      
      @Target({ElementType.FIELD})
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface ExcelColumn {
      // Excel標(biāo)題 String value() default ""; // Excel從左往右排列位置 int col() default 0; }

      三、ExcelUtils編寫

      import com.songwp.config.ExcelColumn;
      import org.apache.commons.lang3.BooleanUtils;
      import org.apache.commons.lang3.CharUtils;
      import org.apache.commons.lang3.StringUtils;
      import org.apache.commons.lang3.math.NumberUtils;
      import org.apache.poi.hssf.usermodel.HSSFDateUtil;
      import org.apache.poi.hssf.usermodel.HSSFWorkbook;
      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.ArrayList;
      import java.util.Arrays;
      import java.util.Comparator;
      import java.util.Date;
      import java.util.HashMap;
      import java.util.List;
      import java.util.Map;
      import java.util.concurrent.atomic.AtomicInteger;
      import java.util.stream.Collectors;
      import java.util.stream.Stream;
      import javax.servlet.http.HttpServletResponse;
      import org.apache.poi.ss.usermodel.Cell;
      import org.apache.poi.ss.usermodel.CellStyle;
      import org.apache.poi.ss.usermodel.Font;
      import org.apache.poi.ss.usermodel.IndexedColors;
      import org.apache.poi.ss.usermodel.Row;
      import org.apache.poi.ss.usermodel.Sheet;
      import org.apache.poi.ss.usermodel.Workbook;
      import org.apache.poi.xssf.usermodel.XSSFWorkbook;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      import org.springframework.http.MediaType;
      import org.springframework.util.CollectionUtils;
      import org.springframework.web.multipart.MultipartFile;
      
      /**
       * @project 
       * @Description
       * @Author songwp
       * @Date 2022/8/24 16:07
       * @Version 1.0.0
       **/
      public class ExcelUtils {
      
          private final static Logger log = LoggerFactory.getLogger(ExcelUtils.class);
      
          private final static String EXCEL2003 = "xls";
          private final static String EXCEL2007 = "xlsx";
      
          public static <T> List<T> readExcel(String path, Class<T> cls, MultipartFile file){
      
              String fileName = file.getOriginalFilename();
              if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) {
                  log.error("上傳文件格式不正確");
              }
              List<T> dataList = new ArrayList<>();
              Workbook workbook = null;
              try {
                  InputStream is = file.getInputStream();
                  if (fileName.endsWith(EXCEL2007)) {
                      workbook = new XSSFWorkbook(is);
                  }
                  if (fileName.endsWith(EXCEL2003)) {
                      workbook = new HSSFWorkbook(is);
                  }
                  if (workbook != null) {
                      //類映射  注解 value-->bean columns
                      Map<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;//return起到的作用和continue是相同的 語法
                                      }
                                      if (!classMap.containsKey(value)) {
                                          classMap.put(value, new ArrayList<>());
                                      }
                                      field.setAccessible(true);
                                      classMap.get(value).add(field);
                                  }
                              }
                      );
                      //索引-->columns
                      Map<Integer, List<Field>> reflectionMap = new HashMap<>(16);
                      //默認(rèn)讀取第一個(gè)sheet
                      Sheet sheet = workbook.getSheetAt(0);
      
                      boolean firstRow = true;
                      for (int i = sheet.getFirstRowNum(); 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));
                                  }
                              }
                              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ù)字類型
              } 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.isEmpty(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);
              //瀏覽器下載excel
              buildExcelDocument("abbot.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í)體類

      /**
       * @project 
       * @Description
       * @Author songwp
       * @Date 2022/8/24 16:10
       * @Version 1.0.0
       **/
      
      @Data
      public class User {
          @ExcelColumn(value = "用戶編碼", col = 1)
          private String userCode;
      
          @ExcelColumn(value = "用戶名稱", col = 2)
          private String userName;
      
          @ExcelColumn(value = "所屬部門", col = 3)
          private String dept;
      
          @ExcelColumn(value = "用戶狀態(tài)", col = 4)
          private Integer userStatus;
      
          @Override
          public String toString() {
              return "BusClick{" +
                      "userCode='" + userCode + '\'' +
                      ", userName='" + userName + '\'' +
                      ", dept='" + dept + '\'' +
                      ", userStatus=" + userStatus +
                      '}';
          }
      }

      五、控制層代碼編寫

      import com.alibaba.fastjson.JSON;
      import com.songwp.entity.User;
      import com.songwp.utils.ExcelUtils;
      import org.springframework.web.bind.annotation.*;
      import org.springframework.web.multipart.MultipartFile;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.util.ArrayList;
      import java.util.List;
      
      /**
       * @project
       * @Description
       * @Author songwp
       * @Date 2022/8/24 16:11
       * @Version 1.0.0
       **/
      @RestController
      @RequestMapping("/user")
      public class UserController{
      
          @GetMapping(value = "/exportExcel")
          public void exportExcel(HttpServletResponse response)  throws IOException {
              List<User> resultList = new ArrayList<User>();
              User user = new User();
              user.setUserCode("S0001");
              user.setUserName("張三");
              user.setUserStatus(0);
              user.setDept("研發(fā)部");
              resultList.add(user);
      
              user = new User();
              user.setUserCode("S0002");
              user.setUserName("李四");
              user.setUserStatus(0);
              user.setDept("研發(fā)部");
              resultList.add(user);
              System.out.println(resultList);
              ExcelUtils.writeExcel(response, resultList, User.class);
          }
      
          @PostMapping(value = "/readExcel")
          public void readExcel(@RequestParam(value="uploadFile", required = false) MultipartFile file){
              List<User> list = ExcelUtils.readExcel("", User.class, file);
              list.forEach(
                      b -> System.out.println(JSON.toJSONString(b))
              );
          }
      }

      六、測(cè)試展示

      (1)導(dǎo)出

       

       (2)導(dǎo)入

       注意:這里為了方便演示,沒有對(duì)數(shù)據(jù)進(jìn)行數(shù)據(jù)庫持久化!

      posted @ 2022-08-24 17:03  [奮斗]  閱讀(220)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 一区二区三区成人| 人妻少妇精品视频无码综合| 亚洲激情一区二区三区视频| 亚洲人成网站在线无码| 男女性高爱潮免费网站| 亚洲一区二区三区18禁| 裸体美女无遮挡免费网站| 一区二区三区一级黄色片| 亚洲综合精品第一页| 亚洲精品成人福利网站| 福利一区二区不卡国产| 日韩永久永久永久黄色大片| 久章草在线精品视频免费观看| 91精品国产色综合久久| 日本福利一区二区精品| 亚洲精品色哟哟一区二区| 亚洲色大成网站WWW久久| 国产对白熟女受不了了| 国产av黄色一区二区三区| 少妇人妻真实偷人精品| 宜阳县| 色老头亚洲成人免费影院| 久久精品亚洲热综合一区二区| 99精品国产兔费观看久久99| 亚洲 卡通 欧美 制服 中文| 18禁精品一区二区三区| 永久无码天堂网小说区| 99久久精品国产亚洲精品| 成在线人永久免费视频播放| 又大又黄又粗高潮免费| 少妇被粗大的猛烈进出69影院一| 中国国产免费毛卡片| 中文字幕少妇人妻精品| 久久96国产精品久久久| 亚洲熟妇无码av另类vr影视 | 亚洲精品国产精品不乱码| 天天做天天爱夜夜爽女人爽| 中文精品无码中文字幕无码专区| 日日碰狠狠躁久久躁综合小说| 亚洲综合一区二区精品导航| 亚洲一区中文字幕人妻|