excel 导入

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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;

/**

  • ImportRepositoryService 导入数据库处理逻辑
    */
    public class ImportRepositoryService {

    /**

    • 打印日志
      */

    private static final Logger logger = LoggerFactory
    .getLogger(ImportRepositoryService.class);

    /**

    • 写入数据库的方法类
      */
      private ImportRepositoryMapper importRepositoryMapper;

    /**

    • 数据库中表的列数
      */
      private int line;

    /**

    • 上传文件的路径
      */
      private String path;

    /**

    • 对应的实体类
      */
      private String type;

    /*对应表中列名的数组
    *
    /
    private String[] lineWord;
    /

    • 空格
      /
      private static final String[] SPACE_LIST={" “,” “,” "};
      /
      *
    • 空字符串
      */
      private static final String[] EMPTY_LIST={"","",""};

    /**

    • 文件的解析方法
    • @param str str
    • @return String
      */
      @SuppressWarnings(value = { “rawtypes”, “unchecked” })
      public String xlsMethod(String str) {
      File file = new File(path);
      Class<? extends Object> clazz = null;
      try (FileInputStream fs = FileUtils.openInputStream(file)) {
      Workbook workbook = null;
      if (XzzfTableConsts.XLS.equals(str)) {
      workbook = new HSSFWorkbook(fs);
      }
      if (XzzfTableConsts.XLSX.equals(str)) {
      workbook = new XSSFWorkbook(fs);
      }
      Sheet hs = workbook.getSheetAt(0);
      int first = hs.getFirstRowNum();
      int last = hs.getLastRowNum();
      List list = new ArrayList();
      for (int j = first + 1; j <= last; j++) {
      Row row = hs.getRow(j);
      if (row == null) {
      continue;
      //return XzzfTableConsts.EMPTY;
      }
      int firstCellNum = row.getFirstCellNum();
      int lastCellNum = row.getLastCellNum();
      int table = lastCellNum - firstCellNum + 1;
      clazz = (Class<? extends Object>) getClazz(clazz);
      Object t = creatObject(clazz);
      for (int k = firstCellNum; k < lastCellNum; k++) {
      if (line != table) {
      return XzzfTableConsts.MISTAKE;
      }
      Cell cell = row.getCell(k);
      if (!putValue(cell, k, t, clazz)) {
      return XzzfTableConsts.CHECKDATE;
      }
      }
      list.add(t);
      }
      return addInfo(list);
      } catch (IOException e) {
      logger.error(“读取文件时候,输入输出流发生的异常{}”, e.getMessage());
      }
      return XzzfTableConsts.EMPTY;
      }

    /**

    • 获得实体类
    • @param clazz 对应的表实体类
    • @return 实体类
      */
      public Object getClazz(Class<? extends Object> clazz) {
      try {
      clazz = Class.forName(type);
      } catch (ClassNotFoundException e) {
      logger.error(“类找不到错误{}”, e.getMessage());
      }
      return clazz;
      }

    /**

    • 构建传来实体类的对象的方法
    • @param clazz 对应的表实体类
    • @return 返回实体类的一个对象
      */
      public Object creatObject(Class<? extends Object> clazz) {
      Object t = null;
      try {
      t = clazz.newInstance();
      } catch (InstantiationException | IllegalAccessException
      | NullPointerException e) {
      logger.error(“根据{},找不到对应的实体类或实体对象创建失败{}”, type, e.getMessage());
      return t;
      }
      String cid = CommonUtils.getUuid();
      Method method = setInfo(lineWord[0], cid, clazz);
      try {
      method.invoke(t, cid);
      } catch (IllegalAccessException | IllegalArgumentException
      | InvocationTargetException e) {
      logger.error(“主键的值没有写进去该实体类对象中{}”, e.getMessage());
      }
      return t;
      }

    /**

    • 把值放到数组中的方法

    • @param cell 传入excel表格

    • @param k 数组下标

    • @param t 对应的表实体类对象

    • @param clazz 对应的表实体类

    • @return 返回判断值是否符合日期要求
      */
      public boolean putValue(Cell cell, int k, Object t,
      Class<? extends Object> clazz) {
      if (cell == null) {
      return true;
      }
      String value = getDate(cell);
      boolean b = checkDate(value, k + 1,clazz);
      if (!b) {
      return false;
      }
      Method method = setInfo(lineWord[k + 1], value, clazz);
      try {
      // 日期替换 时间错误
      // String values= StringUtils.replaceEach(value,SPACE_LIST,EMPTY_LIST);
      // method.invoke(t, values);

       method.invoke(t, value);
      

      } catch (IllegalAccessException | IllegalArgumentException
      | InvocationTargetException e) {
      logger.error(“主键的值没有写进去该实体类对象中{}”, e.getMessage());
      }
      return true;
      }

    /**
    *

    • 文件写入实体类的方法
    • @param columnName 某个set方法名
    • @param value 读到的值
    • @param clazz 对应的实体类
    • @return 返回该set方法
      */
      public Method setInfo(String columnName, String value,
      Class<? extends Object> clazz) {
      Method[] allMethods = clazz.getDeclaredMethods();
      for (Method method : allMethods) {
      if (method.getName().equalsIgnoreCase(“set” + columnName)) {
      return method;
      }
      }
      return null;
      }

    /**

    • 表格中改成String类型读取
    • @param cell 单元格
    • @return String类型的日期信息和数字信息
      */
      public String getDate(Cell cell) {
      if (HSSFCell.CELL_TYPE_NUMERIC == cell.getCellType()) {
      if (HSSFDateUtil.isCellDateFormatted(cell)) {
      Date d = cell.getDateCellValue();
      DateFormat formater = new SimpleDateFormat(
      “yyyy-MM-dd HH:mm:ss”);
      return formater.format(d);
      }
      double val = cell.getNumericCellValue();
      return String.valueOf(val);
      }
      return cell.getStringCellValue();
      }

    /**
    *

    • 对日期数字进行判断
    • @param value 单元格内值
    • @param k 表示数值的下标
    • @param clazz clazz
    • @return 返回判断结果
      */
      public boolean checkDate(String value, int k,Class<? extends Object> clazz) {
      Field field=null;
      try {
      field = clazz.getDeclaredField(lineWord[k]);
      } catch (NoSuchFieldException | SecurityException e) {
      logger.error(“判断日期出问题”, e);
      }
      Class<? extends Object> date = field.getType();
      if( date == Date.class) {
      String zz = XzzfTableConsts.DATE;
      Pattern p = Pattern.compile(zz);
      Matcher m = p.matcher(value);
      return m.matches();
      }
      // if (lineWord[k].startsWith(XzzfTableConsts.DATE_BEGIN)) {
      // String zz = XzzfTableConsts.DATE;
      // Pattern p = Pattern.compile(zz);
      // Matcher m = p.matcher(value);
      // return m.matches();
      // }
      return true;
      }

    /**

    • 将list中的值写入数据库中
    • @param list excle表中的数值行集合
    • @return 判断信息
      */
      @SuppressWarnings(“rawtypes”)
      private String addInfo(List list) {
      if (CollectionUtils.isEmpty(list)) {
      return XzzfTableConsts.EMPTY;
      }
      Method me = null;
      try {
      me = importRepositoryMapper.getClass().getDeclaredMethod(
      “insertInfo” + type.substring(type.lastIndexOf(’.’) + 1),
      List.class);
      me.invoke(importRepositoryMapper, list);
      } catch (NoSuchMethodException | SecurityException
      | IllegalAccessException | IllegalArgumentException
      | InvocationTargetException e) {
      logger.error(“没有该对象或实体类,或者没有对应的方法{}”, e.getMessage());
      }
      return XzzfTableConsts.RESULT;
      }

    /**

    • @return the importRepositoryMapper
      */
      public ImportRepositoryMapper getImportRepositoryMapper() {
      return importRepositoryMapper;
      }

    /**

    • @param importRepositoryMapper the importRepositoryMapper to set
      */
      public void setImportRepositoryMapper(
      ImportRepositoryMapper importRepositoryMapper) {
      this.importRepositoryMapper = importRepositoryMapper;
      }

    /**

    • @return the line
      */
      public int getLine() {
      return line;
      }

    /**

    • @param line the line to set
      */
      public void setLine(int line) {
      this.line = line;
      }

    /**

    • @return the path
      */
      public String getPath() {
      return path;
      }

    /**

    • @param path the path to set
      */
      public void setPath(String path) {
      this.path = path;
      }

    /**

    • @return the type
      */
      public String getType() {
      return type;
      }

    /**

    • @param type the type to set
      */
      public void setType(String type) {
      this.type = type;
      }

    /**

    • @return the lineWord
      */
      public String[] getLineWord() {
      return lineWord;
      }

    /**

    • @param lineWord the lineWord to set
      */
      public void setLineWord(String[] lineWord) {
      this.lineWord = lineWord;
      }
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值