Excel导入工具类

 仅供参考 有更好的导入工具类希望大家多多指教

前端vue+elm

<template>
  <div class="app-container">
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="primary"
          plain
          icon="el-icon-plus"
          size="mini"
          @click="handleAdd"
          v-hasPermi="['daq:importsys:add']"
        >新增</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="success"
          plain
          icon="el-icon-edit"
          size="mini"
          :disabled="single"
          @click="handleUpdate"
          v-hasPermi="['daq:importsys:edit']"
        >修改</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="danger"
          plain
          icon="el-icon-delete"
          size="mini"
          :disabled="multiple"
          @click="handleDelete"
          v-hasPermi="['daq:importsys:remove']"
        >删除</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-upload2"
          size="mini"
          @click="handleImport"
          v-hasPermi="['daq:importsys:import']"
        >导入</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button
          type="info"
          plain
          icon="el-icon-download"
          size="mini"
          :loading="exportLoading"
          @click="handleExport"
          v-hasPermi="['daq:importsys:export']"
        >导出</el-button>
      </el-col>

      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>

<!--    <el-table v-loading="loading" :data="importsysList" @selection-change="handleSelectionChange">
      <el-table-column type="expand">
        <template slot-scope="props">
          <el-form label-position="left" inline class="demo-table-expand">
            <el-form-item label="id">
              <span>{{ props.row.id }}</span>
            </el-form-item>
            <el-form-item label="父id">
              <span>{{ props.row.importsysId }}</span>
            </el-form-item>
            <el-form-item label="名称">
              <span>{{ props.row.importsysName }}</span>
            </el-form-item>
            <el-form-item label="子id">
              <span>{{ props.row.importsysZid }}</span>
            </el-form-item>
            <el-form-item label="部门">
              <span>{{ props.row.importsysBranch }}</span>
            </el-form-item>
            <el-form-item label="状态">
              <span>{{ props.row.importsysState }}</span>
            </el-form-item>
            <el-form-item label="备注">
              <span>{{ props.row.importsysRemark }}</span>
            </el-form-item>
          </el-form>
        </template>
      </el-table-column>
      <el-table-column
        label="ID"
        prop="id">
      </el-table-column>
      <el-table-column
        label="信息编号"
        prop="importsysId">
      </el-table-column>
      <el-table-column
        label="名称"
        prop="importsysName">
      </el-table-column>
      <el-table-column
        label="部门"
        prop="importsysBranch">
      </el-table-column>
      <el-table-column
        label="状态"
        prop="importsysState">
      </el-table-column>
      <el-table-column
        label="备注"
        prop="importsysRemark">
      </el-table-column>
      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
            @click="handleUpdate(scope.row)"
            v-hasPermi="['daq:importsys:edit']"
          >修改</el-button>
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
            @click="handleDelete(scope.row)"
            v-hasPermi="['daq:importsys:remove']"
          >删除</el-button>
        </template>
      </el-table-column>
    </el-table>

    <pagination
      v-show="total>0"
      :total="total"
      :page.sync="queryParams.pageNum"
      :limit.sync="queryParams.pageSize"
      @pagination="getList"
    />-->

    <el-tree
      :data="depts"
      :props="defaultProps"
      :filter-node-method="filterNode"
      :expand-on-click-node="false"
      ref="tree">
        <span class="custom-tree-node" style="display: flex;justify-content: space-between;width: 100%;"
              slot-scope="{ node, data }">
          <div style="width: 20px;">
            <span>{{ data.id }}</span>
          </div>
          <div>
            <span>{{ data.importsysId }}</span>
          </div>
          <div>
            <span>{{ data.importsysName }}</span>
          </div>
          <div>
            <span>{{ data.importsysZid }}</span>
          </div>
          <div>
            <span>{{ data.importsysBranch }}</span>
          </div>
          <div>
            <span>{{ data.importsysState }}</span>
          </div>
          <div>
            <span>{{ data.importsysRemark }}</span>
          </div>
        </span>
    </el-tree>

    <!-- 添加或修改采集管理对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
        <el-form-item label="父id" prop="importsysId">
          <el-input v-model="form.importsysId" placeholder="请输入父id" />
        </el-form-item>
        <el-form-item label="名称" prop="importsysName">
          <el-input v-model="form.importsysName" placeholder="请输入名称" />
        </el-form-item>
        <el-form-item label="子id" prop="importsysZid">
          <el-input v-model="form.importsysZid" placeholder="请输入子id" />
        </el-form-item>
        <el-form-item label="部门" prop="importsysBranch">
          <el-input v-model="form.importsysBranch" placeholder="请输入部门" />
        </el-form-item>
        <el-form-item label="状态" prop="importsysState">
          <el-input v-model="form.importsysState" placeholder="请输入状态" />
        </el-form-item>
        <el-form-item label="备注" prop="importsysRemark">
          <el-input v-model="form.importsysRemark" placeholder="请输入备注" />
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>

    <!-- 导入对话框 -->
    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
      <el-upload
        ref="upload"
        :limit="1"
        accept=".xlsx, .xls"
        :headers="upload.headers"
        :action="upload.url + '?updateSupport=' + upload.updateSupport"
        :disabled="upload.isUploading"
        :on-progress="handleFileUploadProgress"
        :on-success="handleFileSuccess"
        :auto-upload="false"
        drag
      >
        <i class="el-icon-upload"></i>
        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        <div class="el-upload__tip text-center" slot="tip">
          <div class="el-upload__tip" slot="tip">
            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据
          </div>
          <span>仅允许导入xls、xlsx格式文件。</span>
          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
        </div>
      </el-upload>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitFileForm">确 定</el-button>
        <el-button @click="upload.open = false">取 消</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import { listImportsys, getImportsys, delImportsys, addImportsys, updateImportsys, exportImportsys,importTemplate } from "@/api/daq/yzsimportsys";
import { getToken } from "@/utils/auth";
export default {
  name: "Importsys",
  data() {
    return {
      filterText: '',
      depts: [],
      dept: {
        importsysName: '',
        importsysZid: ''
      },
      pName: '',
      dialogVisible: false,
      defaultProps: {
        children: 'children',
        label: 'importsysNam'
      },
      // 遮罩层
      loading: true,
      // 导出遮罩层
      exportLoading: false,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 采集管理表格数据
      importsysList: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        importsysId: null,
        importsysName: null,
        importsysZid: null,
        importsysBranch: null,
        importsysState: null,
        importsysRemark: null
      },
      // 表单参数
      form: {},
      // 表单校验
      rules: {
      },
      // 用户导入参数
      upload: {
        // 是否显示弹出层(用户导入)
        open: false,
        // 弹出层标题(用户导入)
        title: "",
        // 是否禁用上传
        isUploading: false,
        // 是否更新已经存在的用户数据
        updateSupport: 0,
        // 设置上传的请求头部
        headers: { Authorization: "Bearer " + getToken() },
        // 上传的地址
        url: process.env.VUE_APP_BASE_API + "/daq/importsys/importData"
      }
    };
  },
  //监听器,当filterText的值变化时会触发filterText(val)方法,
  //其中val的值就是filterText的最新值
  watch: {
    filterText(val) {
      //this.$refs.tree.filter(val)就会调用当前tree的filterNode这个方法
      this.$refs.tree.filter(val);
    }
  },
  created() {
    this.getList();
  },
  methods: {
    /** 查询采集管理列表 */
    getList() {
      this.loading = true;
      listImportsys().then(response => {
        console.log(response);
        /*this.importsysList = response.rows;*/
        this.depts = response;
        console.log(this.depts)
        /*this.total = response.total;*/
        this.loading = false;
      });
    },
    //value值就是filterText的最新值,data数据就是形成tree的json数据
    filterNode(value, data) {
      // console.log(data)
      if (!value) return true;
      return data.importsysName.indexOf(value) !== 0;
    },
    // 取消按钮
    cancel() {
      this.open = false;
      this.reset();
    },
    // 表单重置
    reset() {
      this.form = {
        id: null,
        importsysId: null,
        importsysName: null,
        importsysZid: null,
        importsysBranch: null,
        importsysState: null,
        importsysRemark: null
      };
      this.resetForm("form");
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm("queryForm");
      this.handleQuery();
    },
    // 多选框选中数据
    handleSelectionChange(selection) {
      this.ids = selection.map(item => item.id)
      this.single = selection.length!==1
      this.multiple = !selection.length
    },
    /** 新增按钮操作 */
    handleAdd() {
      this.reset();
      this.open = true;
      this.title = "添加采集管理";
    },
    /** 修改按钮操作 */
    handleUpdate(row) {
      this.reset();
      const id = row.id || this.ids
      getImportsys(id).then(response => {
        this.form = response.data;
        this.open = true;
        this.title = "修改采集管理";
      });
    },
    /** 提交按钮 */
    submitForm() {
      this.$refs["form"].validate(valid => {
        if (valid) {
          if (this.form.id != null) {
            updateImportsys(this.form).then(response => {
              this.$modal.msgSuccess("修改成功");
              this.open = false;
              this.getList();
            });
          } else {
            addImportsys(this.form).then(response => {
              this.$modal.msgSuccess("新增成功");
              this.open = false;
              this.getList();
            });
          }
        }
      });
    },
    /** 删除按钮操作 */
    handleDelete(row) {
      const ids = row.id || this.ids;
      this.$modal.confirm('是否确认删除采集管理编号为"' + ids + '"的数据项?').then(function() {
        return delImportsys(ids);
      }).then(() => {
        this.getList();
        this.$modal.msgSuccess("删除成功");
      }).catch(() => {});
    },
    /** 导出按钮操作 */
    handleExport() {
      const queryParams = this.queryParams;
      this.$modal.confirm('是否确认导出所有采集管理数据项?').then(() => {
        this.exportLoading = true;
        return exportImportsys(queryParams);
      }).then(response => {
        this.$download.name(response.msg);
        this.exportLoading = false;
      }).catch(() => {});
    },
    /** 导入按钮操作 */
    handleImport() {
      this.upload.title = "用户导入";
      this.upload.open = true;
    },
    /** 下载模板操作 */
    importTemplate() {
      importTemplate().then(response => {
        this.$download.name(response.msg);
      });
    },
    // 文件上传中处理
    handleFileUploadProgress(event, file, fileList) {
      this.upload.isUploading = true;
    },
    // 文件上传成功处理
    handleFileSuccess(response, file, fileList) {
      this.upload.open = false;
      this.upload.isUploading = false;
      this.$refs.upload.clearFiles();
      this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true });
      this.getList();
    },
    // 提交上传文件
    submitFileForm() {
      this.$refs.upload.submit();
    }
  }
};
</script>

工具类

/**
 * Excel工具类
 * @author yangzhisen
 * @date 2021/11/19
 */
public class ExcelPoiUtil {
	
	private static Logger logger = LoggerFactory.getLogger(ExcelPoiUtil.class);
	
	/**
     * EXCEL 2003 扩展名
     */
    public static final String EXCEL03_EXTENSION = ".xls";

    /**
     * EXCEL 2007 扩展名
     */
    public static final String EXCEL07_EXTENSION = ".xlsx";
    
	/** 
     * 读入excel文件,解析后返回 
     * @param file 
     * @throws IOException  
     */  
    public static List<String[]> readExcel(MultipartFile file) throws IOException{  
        //检查文件  
        checkFile(file);  
        //获得Workbook工作薄对象  
        Workbook workbook = getWorkBook(file);  
        //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回  
        List<String[]> list = new ArrayList<String[]>();  
        
        if(workbook != null){  
        	String cellValue = "";
            for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){  
                //获得当前sheet工作表  
                Sheet sheet = workbook.getSheetAt(sheetNum);  
                if(sheet == null){  
                    continue;  
                }  
                //获得当前sheet的开始行  
                int firstRowNum  = sheet.getFirstRowNum();  
                //获得当前sheet的结束行  
                int lastRowNum = sheet.getLastRowNum();  
                int colNum = sheet.getRow(firstRowNum).getPhysicalNumberOfCells();
                //循环除了第一行的所有行  
                for(int rowNum = firstRowNum+1;rowNum <= lastRowNum;rowNum++){  
                    //获得当前行  
                    Row row = sheet.getRow(rowNum);  
                    if(row == null){  
                        continue;  
                    }  
                    //获得当前行的开始列  
                    int firstCellNum = row.getFirstCellNum();  
                    //获得当前行的列数  
                    int lastCellNum = colNum;  
                    String[] cells = new String[colNum];  
                    //循环当前行  
                    for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){  
                        Cell cell = row.getCell(cellNum);
                        cellValue = getCellValue(cell).trim();
                        cells[cellNum] = cellValue;  
                    }  
                    list.add(cells);  
                }  
            }  
            workbook.close();  
        }  
        return list;  
    }  
    
    
    public static void checkFile(MultipartFile file) throws IOException{  
        //判断文件是否存在  
        if(null == file){  
            logger.error("文件不存在!");  
            throw new FileNotFoundException("文件不存在!");  
        }  
        //获得文件名  
        String fileName = file.getOriginalFilename();  
        //判断文件是否是excel文件  
        if(!fileName.endsWith(EXCEL03_EXTENSION) && !fileName.endsWith(EXCEL07_EXTENSION)){  
            logger.error(fileName + "不是excel文件");  
            throw new IOException(fileName + "不是excel文件");  
        }  
    }  
    public static Workbook getWorkBook(MultipartFile file) {  
        //获得文件名  
        String fileName = file.getOriginalFilename();  
        //创建Workbook工作薄对象,表示整个excel  
        Workbook workbook = null;  
        try {  
            //获取excel文件的io流  
            InputStream is = file.getInputStream();  
            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象  
            if(fileName.endsWith(EXCEL03_EXTENSION)){  
                //2003  
                workbook = new HSSFWorkbook(is);  
            }else if(fileName.endsWith(EXCEL07_EXTENSION)){  
                //2007  
                workbook = new XSSFWorkbook(is);  
            }  
        } catch (IOException e) {  
            logger.info(e.getMessage());  
        }  
        return workbook;  
    }  
    
    public static String getCellValue(Cell cell){  
        String cellValue = "";  
        if(cell == null){  
            return cellValue;  
        }  
        //把数字当成String来读,避免出现1读成1.0的情况  
        if(cell.getCellType() == CellType.STRING){  
            cell.setCellType(CellType.STRING);  
        }  
        //判断数据的类型  
        switch (cell.getCellType()){  
            case NUMERIC: //数字  
                cellValue =  NumberToTextConverter.toText(cell.getNumericCellValue());   ;
                break;  
            case STRING: //字符串  
                cellValue = String.valueOf(cell.getStringCellValue());  
                break;  
            case BOOLEAN: //Boolean  
                cellValue = String.valueOf(cell.getBooleanCellValue());  
                break;  
            case FORMULA: //公式  
                cellValue = String.valueOf(cell.getCellFormula());  
                break;  
            case BLANK: //空值   
                cellValue = "";  
                break;  
            case ERROR: //故障  
                cellValue = "非法字符";  
                break;  
            default:  
                cellValue = "未知类型";  
                break;  
        }  
        return cellValue;  
    }  
     

}

Controller 这边把MultpartFile传过去是因为要用流获取地址做一些必要判断

如果有更好的方法请多指教

/**
     *  导入用户信息结构
     */
    @ApiOperation("导入下井次数设置数据")
    @ResponseBody
    @Log(title = "导入", businessType = BusinessType.IMPORT)
    @PreAuthorize("@ss.hasPermi('daq:importsys:import')")
    @PostMapping("/importData")
    public AjaxResult importData(@RequestParam("file") MultipartFile file) throws Exception {
        try {
            List<String[]> excellist = ExcelPoiUtil.readExcel(file);

            if (excellist.size() < 1){
                return AjaxResult.error("导入失败  导入内容不允许为空");
            }

            List<DaqImportsys> mapList = daqImportsysService.insertExcelDaq(excellist,file);
            return AjaxResult.success("当前Excel导入成功");
        }catch (Exception e){
            logger.error("批量导入失败:{}",e);
            return AjaxResult.error("批量导入失败");
        }
    }

 接口实现类实现一些逻辑

/**
     * 导入
     * @author yangzhisen
     * @param  excellist 导入
     * @return 结果
     */
    @Override
    public List<DaqImportsys> insertExcelDaq(List<String[]> excellist, MultipartFile file) {
        /**
         * 获取上传文件输入流
         */
        // 定义一个输入流为空
        InputStream inputStream = null;
        // 使用try-catch环绕
        try {
            // 使用file获取到流给到inputStream
            inputStream = file.getInputStream();
        } catch (Exception e) {
            // 异常类方法
            e.printStackTrace();
        }
        /**
         * 添加第一张表的sheet名称为一级菜单
         */
        // 使用Hutool工具类的POI 获取到当前输入流Excel流的地址 寻找下标为0的第一张sheet表名
        ExcelReader excelReader = ExcelUtil.getReader(inputStream, 0);
        // 新建一个DaqImportsys实体类用于存放Excel获取到的数据
        DaqImportsys importsys = new DaqImportsys();
        // 这边做判断 通过流获取到的Excel的数据是否为NULL值
        // 如果判断这边不为NULL值的话 继续将方法往下执行
        if (excelReader != null){
            // 做了一个死循环只允许第一个sheet获取到后的id值为01
            // (后期可以根据需求修改:需要去数据库进行查询,然后for循环id再进行添加)
            for (int i = 1; i <= 1; i++) {
                // 把循环过i的值通过存放 放在实体类的ImportsysId字段上面进行一个赋值操作
                importsys.setImportsysId("0"+i);
            }
            // 给实体类的ImportsysName进行一个赋值操作
            // 赋值内容是通过Hutool工具类的POI调用获取 Sheet名的方法
            importsys.setImportsysName(excelReader.getSheetNames().get(0));
            // 把存入实体类的数据 进行添加ImportsysId和ImportsysName的方法
            daqImportsysMapper.insertImportId(importsys);
        }else{
            // 如果判断为NULL值的话 第一步返回空值前端进行提示 后台则打印日志提示开发人员
            System.err.println("您导入的Excel为空!请检查后再进行导入");
            return null;
        }

        /**
         * 转化为List传过来的Excel 通过遍历进行添加
         */
        // new一个ArrayList用于把DaqImportsys获取到的数据存放在这里
        List<DaqImportsys> importsysList = new ArrayList<>();
        // 创建一个实体类用于存放前端传过来的Excel数据
        DaqImportsys daqImportsys;
        // 循环遍历转化为List传过来的Excel
        for (String[] excelRow : excellist) {
            // 判断这四个值是否不为空或者NULL 终止所在层的循环
            // excelRow[0]代表Excel的第一列
            if (excelRow[0] == null && "".equals(excelRow[1]) && "".equals(excelRow[2]) && "".equals(excelRow[3])) {
                break;
            }
            // 这个实体类链接上层实体类进行对象的存储
            daqImportsys = new DaqImportsys();
		    // 把循环取到的都先给对象赋值  然后放list里做批量导入
            // 赋值给ImportsysName   (信息名称)
            daqImportsys.setImportsysName(excelRow[0]);
            // 赋值给ImportsysBranch (责任部门)
            daqImportsys.setImportsysBranch(excelRow[1]);
            // 赋值给ImporState      ( 状 态 )
            daqImportsys.setimportsysState(excelRow[2]);
            // 赋值给ImportsyRemark  ( 备 注 )
            daqImportsys.setImportsysRemark(excelRow[3]);
            // 把循环取到放在实体类里的值 都存储到List集合里面做批量导入
            importsysList.add(daqImportsys);
        }
        //判断存入的List集合元素的个数是否大于0
        if (importsysList.size() > 0) {
            // 大于0的话就执行添加Excel到数据库的方法
            daqImportsysMapper.importLIst(importsysList);
        }else {
            // 判断长度为0的话 第一步返回空值前端进行提示 后台则打印日志提示开发人员
            System.err.println("您导入的Excel为空!请检查后再进行导入");
            return null;
        }
        /**
         * 添加第一个sheet下的名称为二级菜单
         */
        // 判断使用Hutool工具类的POI 获取到当前Excel流的地址 寻找下标为0的第一张sheet表名 是否为空值
        if (excelReader != null) {
            // 创建一个新的ArrayList集合用于存放DaqImportsys实体类
            List<DaqImportsys> daqthList = new ArrayList<>();
            // 定义一个实体类用于把获取到的值存入到这里
            DaqImportsys daqSys;
            // 从实体类中取出ImportsysId 存储为String类型
            String importsysId = importsys.getImportsysId();
            // 使用Hutool工具类的POI 获取第一行的第一个数据
            List<List<Object>> readFirstLine = excelReader.read(1, excelReader.getRowCount());
            // 循环遍历行数下表从0开始
            for (int i = 0; i < readFirstLine.size(); i++) {
                // 把循环取到的值放在这个List集合里面
                List<Object> objects = readFirstLine.get(i);
                // 对应上面的实体类
                daqSys = new DaqImportsys();
                // 根据数组长度循环添加到实体类ImportsysId
                daqSys.setImportsysId("0100" + (i+1));
                // 根据循环得到的ImportsysName添加到实体类
                daqSys.setImportsysName((String) objects.get(0));
                // 根据上一个存进去的父级id存在子id里面
                daqSys.setImportsysZid(importsysId);
                // 把存在实体类里面的数据存放在List当中
                daqthList.add(daqSys);
            }

            // 如果存进去的长度不为空的话 那么就执行修改方案
            if (daqthList.size() > 0) {
                // 修改方案是循环修改 使用的是存在list里面的数据进行修改的
                daqImportsysMapper.UpdatetLIst(daqthList);
            } else {
                // 判断长度为0的话 第一步返回空值前端进行提示 后台则打印日志提示开发人员
                System.err.println("您导入的Excel为空!请检查后再进行导入");
                return null;
            }
        }else {
            // 判断长度为0的话 第一步返回空值前端进行提示 后台则打印日志提示开发人员
            System.err.println("您导入的Excel为空!请检查后再进行导入");
            return null;
        }
        /**
         * 根据二级菜单名称查询sheet名称一样的话里面的内容为三级菜单
         */
        // 首先定义一个数组是为了存放ExcelSheet的名称之后的循环修改使用的
        ArrayList<Object> excelsheetname = new ArrayList<>();
        // 使用HutoolUtil的方法获取到所有sheet的名称 是为了修改查询条件使用的
        List<String> sheetNames = excelReader.getSheetNames();
        // 循环获取到每一个sheet的名称
        for (int i = 0; i < sheetNames.size(); i++) {
            // 循环获取到每一个sheet的名称返回一个String类型
            String s = sheetNames.get(i);
            // 使用刚刚创建的数组存放这个循环获取到所有的sheetName
            excelsheetname.add(s);
        }

        /**
         * 根据sheet表下的数据名称 查询到对应的sheet名称
         */
        // 使用HutoolUtil 获取到第一个sheet下所有数据的所有名称 用于查询和他相对应的其他sheet名称
        List<List<Object>> readFirstOne = excelReader.read(1, excelReader.getRowCount());
        // 创建一个实体类的list集合 用于后期存放获取到的数据 用于循环修改
        List<DaqImportsys> daqthLists = new ArrayList<>();
        // 循环获取到数据的长度 并且可以获取到的第一张sheet表下所有数据的所有名称
        for (int i = 0; i < readFirstOne.size(); i++) {
            // 取到跟长度一样的所有数据之后存在一个List<Obj>里面
            List<Object> fondLongData = readFirstOne.get(i);
            // 这一步的操作是获取到第一列的数据名称 也就是ImportsysName
            String  importsysName = (String) fondLongData.get(0);
            // 根据获取到的长度 循环获取到所有SheetName
            for (int j = 0; j < excelsheetname.size(); j++) {
                // 将所有获取到的Sheet名称存放在这个方法当中
                ExcelReader readeSheetName = excelReader.setSheet((String) excelsheetname.get(j));
                // 这一步判断是看获取到第一列的数据名称是否和 获取到所有的sheet名称对应
                if (fondLongData.get(0).equals(excelsheetname.get(j))){
                    // 如果对应的话 获取到每一个sheet下面的所有数据
                    List<Map<String, Object>> allSheetData = readeSheetName.readAll();
                    // 通过循环把每一个sheet下的数据都取出来
                    for (int i1 = 1; i1 < allSheetData.size()+1; i1++) {
                        // 使用HutoolUtil的方法取出的时候只取出循环出来的每一个sheet下第一行的第一个值
                        Cell allCell = readeSheetName.getCell(0, i1);
                        // 根据传过来的ImportsysName作为查询条件 用这个查询条件去做判断 判断根据这个name能否查询到对应的id
                        // 因为Excel当中会存在有很多一样的数据 所以说传回来的是一个集合 所以说这样查询的话得传回来一个实体类的List集合
                        List<DaqImportsys> idWhereNames = daqImportsysMapper.selectImportsysIdWhereName(importsysName);
                        // 判断HutoolUtil是否获取到数据了 如果获取数据不为空的话 继续执行以下方法
                        if (readeSheetName != null) {
                            // 首先定义一个空的实体类 用于存放传过来的数据
                            DaqImportsys daqths;
                            // 循环查询到的id 获取id的长度来获取 根据长度获取到每一个值(没有实际用处,后期使用的话可以直接使用)
                            for (int k = 0; k < idWhereNames.size(); k++) {
                                // 把实体类放在这里做调用使用
                                daqths = new DaqImportsys();
                                // ForEach循环(selectImportsysIdWhereName)根据name为查询条件查询到的id数据
                                for (DaqImportsys idWhereName : idWhereNames) {
                                    // 这一步是把循环到的每一个sheetName的长度循环到的每一个都自增形式存在了这个ImportsysId里面
                                    daqths.setImportsysId(idWhereName.getImportsysId() + "00" + (i1));
                                    // 子id是通过查询到的ImportsysId存放在这个子id的实体类里面
                                    daqths.setImportsysZid(idWhereName.getImportsysId());
                                }
                                // 通过HutoolUtil的方法取出循环出来的每一个sheet下面的第一个值之后 本来是Cell类型的数据 我们通过StringValue的方式转成String类型的数据村入到实体类中去
                                daqths.setImportsysName(String.valueOf(allCell));
                                // 把实体类获取到的值存入到 创建好的List集合当中做批量修改操作
                                daqthLists.add(daqths);
                            }
                        }else {
                            // 判断长度为NULL的话 第一步返回空值前端进行提示 后台则打印日志提示开发人员
                            System.err.println("您导入的Excel为空!请检查后再进行导入");
                            return null;
                        }
                    }
                }
            }
        }
        //如果存进去的长度不为空的话 那么就执行修改方案
        if (daqthLists.size() > 0) {
            // 根据ImportsysName进行修改ImportsysId(父级id)和ImportsysZid(子id)
            daqImportsysMapper.UpdatetLIstThreeName(daqthLists);
        }else {
            // 判断长度为0的话 第一步返回空值前端进行提示 后台则打印日志提示开发人员
            System.err.println("您导入的Excel为空!请检查后再进行导入");
            return null;
        }
        // 全部执行成功的话就返回
        return importsysList;
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中有很多可以用于Excel导入工具类,其中比较常用的是Apache POI库。Apache POI是一个开源的Java API,用于处理Microsoft Office格式的文件,包括Excel文件。 使用Apache POI可以实现Excel文件的读取和写入操作。下面是一个简单的Java Excel导入工具类的示例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ExcelUtils { public static List<List<String>> readExcel(String filePath) throws IOException { List<List<String>> data = new ArrayList<>(); FileInputStream fis = new FileInputStream(new File(filePath)); Workbook workbook = new XSSFWorkbook(fis); Sheet sheet = workbook.getSheetAt(0); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); List<String> rowData = new ArrayList<>(); Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); String cellValue = ""; if (cell.getCellType() == CellType.STRING) { cellValue = cell.getStringCellValue(); } else if (cell.getCellType() == CellType.NUMERIC) { cellValue = String.valueOf(cell.getNumericCellValue()); } rowData.add(cellValue); } data.add(rowData); } workbook.close(); fis.close(); return data; } } ``` 上述代码中的`readExcel`方法可以读取Excel文件,并将每个单元格的值存储在一个二维列表中返回。你只需要将Excel文件的路径作为参数传递给该方法即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值