图片不清晰,请多担待

pom.xml依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>${poi.version}</version>
</dependency>

上代码:

import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.system.domain.VehicleInfo;
import com.ruoyi.system.domain.VehicleInsurance;
import com.ruoyi.system.domain.VehicleTotalmile;
import com.ruoyi.system.domain.vo.VehicleInfoImportVo;
import com.ruoyi.system.mapper.sysdict.DictDataMapper;
import com.ruoyi.system.mapper.vehicle.VehicleInfoMapper;
import com.ruoyi.system.mapper.vehicle.VehicleInsuranceMapper;
import com.ruoyi.system.mapper.vehicle.VehicleTotalmileMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Objects;
import java.util.UUID;import static org.apache.poi.ss.usermodel.CellType.*;@Slf4j
@Service
public class VehicleImportService {@Autowiredprivate DictDataMapper dictDataMapper;@Autowiredprivate VehicleInfoMapper vehicleInfoMapper;@Autowiredprivate VehicleInsuranceMapper vehicleInsuranceMapper;@Autowiredprivate VehicleTotalmileMapper vehicleTotalmileMapper;/*** 读取excel文件** @param path 文件流* @param operName 操作人名称* @param sheetIndex    sheet页下标:从0开始* @param startReadLine 开始读取的行:从0开始* @param tailLine      结束行*/public String importVehicleInfo(MultipartFile path, String operName, int sheetIndex, int startReadLine, int tailLine) {Workbook wb = null;File file = null;try {file=File.createTempFile(path.getOriginalFilename(), null);path.transferTo(file);file.deleteOnExit();wb = WorkbookFactory.create(file);} catch (Exception e) {e.printStackTrace();}//读取excel表中的sheet, 参数为sheet的索引值(从0开始)Sheet sheet = wb.getSheetAt(sheetIndex);Row row = null;Boolean save = false;//获取该sheet的最后一行数据的索引int lastRowNum = sheet.getLastRowNum();if (lastRowNum < 2){throw new CustomException("导入模板不正确!");}if (lastRowNum == 2){throw new CustomException("导入车辆数据不能为空!");}int successNum = 0;int failureNum = 0;StringBuilder successMsg = new StringBuilder();StringBuilder failureMsg = new StringBuilder();ArrayList<VehicleInfoImportVo> list = new ArrayList<>();//外循环是循环行,内循环是循环每行的单元格for (int i = 3; i <= lastRowNum; i++) {//车辆信息导入对象VehicleInfoImportVo vehicleInfoImportVo = new VehicleInfoImportVo();//车辆保险对象VehicleInsurance vehicleInsurance = new VehicleInsurance();//商业保险费BigDecimal commercialInsurPrice = BigDecimal.ZERO;//承运险BigDecimal carrierRisk = BigDecimal.ZERO;//交强险保费BigDecimal compulsoryInsurPrice = BigDecimal.ZERO;//商业保险期限String commercialInsurDate = "";//承运险期限String carrierRiskDate = "";//交强险期限String compulsoryInsurDate = "";//保险号数组String[] insurNums = null;//车辆里程对象VehicleTotalmile vehicleTotalmile = new VehicleTotalmile();//根据行索引获取行对象(单元格集合)row = sheet.getRow(i);//遍历行的单元格,并解析for (Cell c : row) {String returnStr = "";String value = "";//设置该单元格的数据的类型为Stringc.setCellType(STRING);boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());// 判断是否具有合并单元格if (isMerge) {//如果是合并单元格,就获取合并单元格的值returnStr = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex()).toString();} else {//不是合并单元格直接获取单元格的值returnStr = getCellValue(c).toString();}if (StringUtils.isNotEmpty(returnStr)) {value = returnStr.trim();//封装结果集,一行数据封装为一个对象if (c.getColumnIndex() == 0) {System.out.println("序号:"+value);} else if (c.getColumnIndex() == 1) {System.out.println("车牌号:"+value);vehicleInfoImportVo.setVehicleNo(value);} else if (c.getColumnIndex() == 2) {System.out.println("车牌颜色:"+value);vehicleInfoImportVo.setPlateColor(value);} else if (c.getColumnIndex() == 3) {System.out.println("核定载客数:"+value.replaceAll("人", ""));} else if (c.getColumnIndex() == 4) {System.out.println("车辆厂牌:"+value);vehicleInfoImportVo.setBrand(value);} else if (c.getColumnIndex() == 5) {System.out.println("车辆型号:"+value);vehicleInfoImportVo.setModel(value);} else if (c.getColumnIndex() == 6) {System.out.println("车辆类型:"+value);} else if (c.getColumnIndex() == 7) {System.out.println("车辆所有人:"+value);vehicleInfoImportVo.setOwnerName(value);} else if (c.getColumnIndex() == 8) {System.out.println("车身颜色:"+value);vehicleInfoImportVo.setVehicleColor(value);} else if (c.getColumnIndex() == 9) {System.out.println("发动机号:"+value);vehicleInfoImportVo.setEngineId(value);} else if (c.getColumnIndex() == 10) {System.out.println("车架号:"+value);vehicleInfoImportVo.setVin(value);} else if (c.getColumnIndex() == 11) {System.out.println("保险公司名称:"+value);vehicleInsurance.setInsurCom(value);vehicleInsurance.setVehicleNo(vehicleInfoImportVo.getVehicleNo());} else if (c.getColumnIndex() == 12) {System.out.println("保险号:"+value);insurNums = value.split(";");} else if (c.getColumnIndex() == 13) {System.out.println("车船税:"+value);} else if (c.getColumnIndex() == 14) {System.out.println("商业保险费:"+value);commercialInsurPrice = new BigDecimal(value);} else if (c.getColumnIndex() == 15) {System.out.println("承运险保费:"+value);carrierRisk = new BigDecimal(value);} else if (c.getColumnIndex() == 16) {System.out.println("交强险保费:"+value);compulsoryInsurPrice = new BigDecimal(value);} else if (c.getColumnIndex() == 17) {System.out.println("保险总金额(人民币元):"+value);} else if (c.getColumnIndex() == 18) {System.out.println("承运险保险期限:"+value);carrierRiskDate = value;} else if (c.getColumnIndex() == 19) {System.out.println("交强险保险期限:"+value);compulsoryInsurDate = value;} else if (c.getColumnIndex() == 20) {System.out.println("商业险保险期限:"+value);commercialInsurDate = value;} else if (c.getColumnIndex() == 21) {System.out.println("年审时间:"+value);} else if (c.getColumnIndex() == 22) {System.out.println("行驶公里数:"+value);vehicleTotalmile.setVehicleNo(vehicleInfoImportVo.getVehicleNo());vehicleTotalmile.setTotalMile(new BigDecimal(value));}}}//判断一个对象的属性是否都为空, true:都为空  , false: 不都为空if (!allFieldIsNULL(vehicleInfoImportVo)) {Date date = DateUtils.getNowDate();vehicleInsurance.setUpdateTime(date);vehicleTotalmile.setUpdateTime(date);vehicleInfoImportVo.setUpdateBy(operName);vehicleInfoImportVo.setId(UUID.randomUUID().toString().replaceAll("-",""));try {// 验证是否存在这个车辆VehicleInfo vehicle = vehicleInfoMapper.selectVehicleInfoByVehicleNo(vehicleInfoImportVo.getVehicleNo());if (vehicle == null){vehicleInfoImportVo.setCreateTime(date);VehicleInfo vehicleInfo = new VehicleInfo();// 复制 vehicleInfoImportVo 到 vehicleInfoBeanUtils.copyProperties(vehicleInfoImportVo, vehicleInfo);vehicleInfo.setSeats(Integer.valueOf(vehicleInfoImportVo.getSeats()));if (vehicleInfoMapper.insertVehicleInfo(vehicleInfo) > 0){successNum++;successMsg.append("<br/>" + successNum + "、车辆 " + vehicleInfoImportVo.getVehicleNo() + " 导入成功");} else {log.info("导入车辆信息,插入车辆信息失败,车牌号:{}", vehicleInfoImportVo.getVehicleNo());}} else {vehicleInfoImportVo.setUpdateTime(date);VehicleInfo vehicleInfo = new VehicleInfo();// 复制 vehicleInfoImportVo 到 vehicleInfoBeanUtils.copyProperties(vehicleInfoImportVo, vehicleInfo);vehicleInfo.setSyncflag(0);if (vehicleInfoMapper.updateVehicleInfo(vehicleInfo) > 0){successNum++;successMsg.append("<br/>" + successNum + "、车辆 " + vehicleInfoImportVo.getVehicleNo() + " 更新成功");} else {log.info("导入车辆信息,更新车辆信息失败,车牌号:{}", vehicleInfoImportVo.getVehicleNo());}}} catch (Exception e) {failureNum++;String msg = "<br/>" + failureNum + "、车辆 " + vehicleInfoImportVo.getVehicleNo() + " 导入失败:";failureMsg.append(msg + e.getMessage());log.error(msg, e);}}}if (failureNum > 0) {failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");throw new CustomException(failureMsg.toString());} else {successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");}return successMsg.toString();}/*** 判断指定的单元格是否是合并单元格** @param sheet* @param row    行下标* @param column 列下标* @return*/private static boolean isMergedRegion(Sheet sheet, int row, int column) {//获取该sheet所有合并的单元格int sheetMergeCount = sheet.getNumMergedRegions();//循环判断 该单元格属于哪个合并单元格, 如果能找到对应的,就表示该单元格是合并单元格for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress range = sheet.getMergedRegion(i);int firstColumn = range.getFirstColumn();int lastColumn = range.getLastColumn();int firstRow = range.getFirstRow();int lastRow = range.getLastRow();if (row >= firstRow && row <= lastRow) {if (column >= firstColumn && column <= lastColumn) {return true;}}}return false;}/*** 获取合并单元格的值** @param sheet  sheet索引 从0开始* @param row    行索引 从0开始* @param column 列索引  从0开始* @return*/public static String getMergedRegionValue(Sheet sheet, int row, int column) {int sheetMergeCount = sheet.getNumMergedRegions();for (int i = 0; i < sheetMergeCount; i++) {CellRangeAddress ca = sheet.getMergedRegion(i);int firstColumn = ca.getFirstColumn();int lastColumn = ca.getLastColumn();int firstRow = ca.getFirstRow();int lastRow = ca.getLastRow();if (row >= firstRow && row <= lastRow) {if (column >= firstColumn && column <= lastColumn) {Row fRow = sheet.getRow(firstRow);Cell fCell = fRow.getCell(firstColumn);return getCellValue(fCell);}}}return null;}/*** 获取单元格的值  先确定单元格的类型,然后根据类型 取值** @param cell 单元格* @return*/public static String getCellValue(Cell cell) {if (cell == null) return "";if (cell.getCellType() == STRING) {return cell.getStringCellValue();} else if (cell.getCellType() == BOOLEAN) {return String.valueOf(cell.getBooleanCellValue());} else if (cell.getCellType() == FORMULA) {return cell.getCellFormula();} else if (cell.getCellType() == NUMERIC) {return String.valueOf(cell.getNumericCellValue());}return "";}/*** 判断一个对象的属性是否都为空,** @param obj 对象* @return false : 至少有一个属性不为空, true: 该对象的属性全为空*/public static boolean allFieldIsNULL(Object obj) {Boolean flag = true;//都为空if (null == obj || "".equals(obj)) return flag;try {Field[] declaredFields = obj.getClass().getDeclaredFields();for (Field field : declaredFields) { // 循环该类,取出类中的每个属性field.setAccessible(true);// 把该类中的所有属性设置成 publicObject object = field.get(obj); // object 是对象中的属性if (object instanceof CharSequence) { // 判断对象中的属性的类型,是否都是CharSequence的子类if (!Objects.isNull(object)) { // 如果是他的子类,那么就可以用ObjectUtils.isEmpty进行比较flag = false;//不为空}} else { //如果不是那就直接用null判断if (!(null == object || "".equals(object))) {flag = false;//不为空}}}} catch (Exception e) {e.printStackTrace();}return flag;//false:不都为空}}

java 使用POI导入复杂excel表格相关推荐

  1. java使用poi读取存储excel表格,包括xls和xlsx格式

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java使用poi读取存储excel表格,包括xls和xlsx格式. 需要导入的包 poi-3.14.jar poi-ooxml-3.14.jar ...

  2. java 使用POI导出复杂excel表格,通过浏览器下载

    pom.xml依赖 <!--POI Excel表格导出依赖--> <dependency><groupId>org.apache.poi</groupId&g ...

  3. java利用poi生成/读取excel表格

    1.引入jar包依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</ ...

  4. java io导出excel表格_Java IO 导入导出Excel表格

    1.将excel导入到内存 1. 调用工作簿Workbook的静态方法getWorkbook(),获得工作簿Workbook对象 InputStream in = new FileInputStrea ...

  5. 用java查询excel表格_如何把java查询出的内容导入到excel表格

    展开全部 java查询出的内容导入到excel表格 /**导出数据为XLS格式 * @param fos * @param bo */ public void writeExcelBo(FileOut ...

  6. java 导入导出excel表格

    java 导入导出excel表格 业务上有需求上传excel表格并读取内容,本文记录一下该方法 表格导入 引入相应的工具包 <dependency><groupId>cn.af ...

  7. tiptop使用java的poi包实现EXCEL导入导出功能

    4gl可以调用java的poi包实现EXCEL的导入导出,今天分享一个EXCEL导入的功能!  一:环境搭建  1:poi文件导入  首先下载POI文件(找不到的可以私信我),解压后上传到ERP的服务 ...

  8. 使用最新的poi-4.1.0.jar导入导出Excel表格——读取Excel表格数据用法

    使用最新的poi-4.1.0.jar导入导出Excel表格--读取Excel表格数据用法 其中主要的一点心得就是在switch语句哪里进行读取数据转换时,我看到网上的一些用法都是使用 HSSFCell ...

  9. POI导入导出excel表

            在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印. Apache POI是Apache软件基金会 ...

  10. 导入excel表格到数据库、导入excel表格到数据库代码、根据excel表格路径将数据导入到数据库、验证要导入的excel表格数据、根据路径获取MultipartFile、FileItem文件

    导入excel表格到数据库.根据路径导入excel表格到数据库代码.根据excel表格路径将数据导入到数据库.验证要导入的excel表格数据.根据路径获取MultipartFile.FileItem文 ...

最新文章

  1. 秒懂 CountDownLatch 与 CyclicBarrier 使用场景
  2. boost::msm::mpl_graph::adjacency_list_graph相关的测试程序
  3. poj 1469 COURSES 解题报告
  4. 互联网时代IT系统的变革-硬件系统定制化发展
  5. PHP笔记-学生成绩例子
  6. 程序员学历要求越来越高,薪酬天花板犹如发际线,原因很简单!
  7. HUABASE :基于列存储的关系型数据库系统
  8. i386/i686/x86-64的区别
  9. 【手机主题字体】暗恋笔记ttf
  10. assimp批量转模型,[OpenGL] 使用Assimp导入模型(Qt)
  11. 使用Qt实现FTP客户端
  12. 梦幻手游最新服务器,《梦幻西游》手游服务器如何选择 新区还是老区
  13. 几个ts的接口练习题
  14. R语言的四种数据结构---向量
  15. 华为手机计算机怎么语音算术,华为自带的语音识别功能太实用了!这样操作,3秒语音变文字...
  16. python 输入5*5矩阵a、完成下列要求_python编程练习(五)
  17. 更换内存条需要注意什么
  18. 31各省首字母排序、国外国家名排序(中文首字母)
  19. 普通人,自学编程,5个必备步骤
  20. Python计算0-100之内的奇数和

热门文章

  1. 系统架构图 云架构案例
  2. mysql5_MySQL5.5下载-MySQL数据库5.5下载 v5.5.60.1官方版(32位/64位)--pc6下载站
  3. 第十一期_MSF 后渗透《Metasploit Unleashed Simplified Chinese version(Metasploit官方文档教程中文版)》
  4. QQ小游戏 微信小游戏 即时通信 IM 删除会话 deleteConversation sdk
  5. 微信小程序获取当前位置 地图定位导航-详细代码
  6. MATLAB计算几何
  7. c4d安装没有出现语言文字,关于C4D以及渲染器插件安装时遇到的问题以及解决方法...
  8. 【高速总线】JESD204B简介
  9. 金蝶服务器存在但无账套信息,金蝶KIS专业版
  10. [c++] WINAPI