1、POI使用详解
1.1、什么是Apache POI?
POI是Apache软件基金会用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。
1.2、POI的jar包导入
使用poi需要用到poi-3.14.jar和poi-ooxml-3.14.jar两个jar包,maven包依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version>
</dependency>

1.3、POI的API讲解
1.3.1结构

HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

1.3.2 对象

本文主要介绍HSSF和XSSF两种组件,简单的讲HSSF用来操作Office 2007版本前excel.xls文件,XSSF用来操作Office 2007版本后的excel.xlsx文件,
注意二者的后缀是不一样的。

1.3.3 操作步骤

以HSSF为例,XSSF操作相同。
首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写。

2、代码操作
2.1、效果图


导入后效果:

2.2、代码详解
这里我以SpringBoot+MybatisPlus为基础
Controller:

package com.unicloud.navigation.controller;import com.unicloud.navigation.exception.ErrorMsg;
import com.unicloud.navigation.service.NavigationObjectService;
import com.unicloud.sc.common.core.util.R;
import com.unicloud.sc.common.log.annotation.SysLog;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;/*** 导览对象* @author songweihao* @date 2021/9/24*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/navigation_object")
@Api(value = "导览对象Controller", tags = "导览对象操作接口")
public class NavigationObjectController {@Autowiredprivate final NavigationObjectService navigationObjectService;/*** 批量导入* @param file excel文件* @return R*/@ApiOperation(value = "批量导入", notes = "批量导入")@SysLog("批量导入" )@PostMapping("/batch_import" )public Object batchImport(@RequestParam("file") MultipartFile file) {Object res = navigationObjectService.batchImport(file);if (res instanceof ErrorMsg) {return R.failed(((ErrorMsg) res).getCode(), ((ErrorMsg) res).getMsg());}return res;}
}

Service:

package com.unicloud.navigation.service.Impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.unicloud.navigation.entity.AttractionManagement;
import com.unicloud.navigation.entity.NavigationClassification;
import com.unicloud.navigation.entity.NavigationObject;
import com.unicloud.navigation.exception.ErrorMsg;
import com.unicloud.navigation.mapper.AttractionManagementMapper;
import com.unicloud.navigation.mapper.NavigationClassificationMapper;
import com.unicloud.navigation.mapper.NavigationObjectMapper;
import com.unicloud.navigation.service.NavigationObjectService;
import com.unicloud.sc.common.core.util.R;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;/*** 导览对象* @author songweihao* @date 2021/9/24*/
@Service
public class NavigationObjectServiceImpl extends ServiceImpl<NavigationObjectMapper, NavigationObject> implements NavigationObjectService {@Autowiredprivate NavigationObjectMapper navigationObjectMapper;@Autowiredprivate NavigationClassificationMapper navigationClassificationMapper;@Autowiredprivate AttractionManagementMapper attractionManagementMapper;private final static String XLS = "xls";private final static String XLSX = "xlsx";/*** 导入Excel,兼容xls和xlsx*/@Overridepublic Object batchImport(MultipartFile file) {// 获得文件名Workbook workbook = null;String fileName = file.getOriginalFilename();if(fileName.endsWith(XLS)){// 2003try {workbook = new HSSFWorkbook(file.getInputStream());} catch (IOException e) {log.error("",e);}}else if(fileName.endsWith(XLSX)){// 2007try {workbook = new XSSFWorkbook(file.getInputStream());} catch (IOException e) {log.error("",e);}}else{ErrorMsg error = ErrorMsg.NO_EXCEL;return error;}Sheet sheet = workbook.getSheet("Sheet1");// 指的行数,一共有多少行int rows = sheet.getLastRowNum();if(rows == 2){ErrorMsg error = ErrorMsg.NO_ROW;return error;}List<NavigationObject> list = new LinkedList<>();for (int i = 3; i < rows + 1; i++) {// 读取左上端单元格Row row = sheet.getRow(i);// 行不为空if (row != null) {int num = row.getRowNum() + 1;// 读取cellNavigationObject navigationObject = new NavigationObject();// 导览对象名称String navigationObjectName = getCellValue(row.getCell(0));if (StringUtils.isBlank(navigationObjectName)) {return R.failed(10003,"第" + num + "行导览对象名称数据有误,请改正后,再导入");}navigationObject.setNavigationObjectName(navigationObjectName);// 导览分类String classificationName = getCellValue(row.getCell(1));LambdaQueryWrapper<NavigationClassification> queryWrapper1 = new LambdaQueryWrapper<>();queryWrapper1.eq(NavigationClassification::getClassificationName, classificationName);NavigationClassification navigationClassification = navigationClassificationMapper.selectOne(queryWrapper1);if (navigationClassification == null) {return R.failed(10004,"第" + num + "行导览分类数据有误,请改正后,再导入");}navigationObject.setNavigationClassificationId(navigationClassification.getId());// 所属景点String attractionName = getCellValue(row.getCell(2));LambdaQueryWrapper<AttractionManagement> queryWrapper2 = new LambdaQueryWrapper<>();queryWrapper2.eq(AttractionManagement::getAttractionName, attractionName);AttractionManagement attractionManagement = attractionManagementMapper.selectOne(queryWrapper2);if (attractionManagement == null) {return R.failed(10005,"第" + row.getRowNum() + 1 + "行所属景点数据有误,请改正后,再导入");}navigationObject.setAttractionId(attractionManagement.getId());// 所在位置String location = getCellValue(row.getCell(3));navigationObject.setLocation(location);// 经纬度坐标String longitudeAndLatitude = getCellValue(row.getCell(4));LambdaQueryWrapper<NavigationObject> queryWrapper3 = new LambdaQueryWrapper<>();queryWrapper3.eq(NavigationObject::getLongitudeAndLatitude, longitudeAndLatitude);NavigationObject no = navigationObjectMapper.selectOne(queryWrapper3);if (no != null) {return R.failed(10006,"第" + num + "行经纬度坐标数据存在重复,请改正后,再导入");}if (StringUtils.isBlank(longitudeAndLatitude)) {return R.failed(10007,"第" + num + "行经纬度坐标数据有误,请改正后,再导入");}navigationObject.setLongitudeAndLatitude(longitudeAndLatitude);// 是否显示String isShow = getCellValue(row.getCell(5));if ("是".equals(isShow) || "否".equals(isShow)) {if ("是".equals(isShow)) {navigationObject.setIsShow(1);} else {navigationObject.setIsShow(0);}} else {return R.failed(10008,"第" + num + "行是否显示数据有误,请改正后,再导入");}// 导览对象简介String navigationObjectIntroduction = getCellValue(row.getCell(6));navigationObject.setNavigationObjectIntroduction("<p>" + navigationObjectIntroduction + "</p>");list.add(navigationObject);}}for (NavigationObject navigationObject : list) {navigationObjectMapper.insert(navigationObject);}return R.ok("数据导入成功");}/*** 获得Cell内容*/private String getCellValue(Cell cell) {String value = "";if (cell != null) {// 以下是判断数据的类型switch (cell.getCellType()) {case HSSFCell.CELL_TYPE_NUMERIC: // 数字value = cell.getNumericCellValue() + "";if (HSSFDateUtil.isCellDateFormatted(cell)) {Date date = cell.getDateCellValue();if (date != null) {value = new SimpleDateFormat("yyyy-MM-dd").format(date);} else {value = "";}} else {value = new DecimalFormat("0").format(cell.getNumericCellValue());}break;case HSSFCell.CELL_TYPE_STRING: // 字符串value = cell.getStringCellValue();break;case HSSFCell.CELL_TYPE_BOOLEAN: // Booleanvalue = cell.getBooleanCellValue() + "";break;case HSSFCell.CELL_TYPE_FORMULA: // 公式value = cell.getCellFormula() + "";break;case HSSFCell.CELL_TYPE_BLANK: // 空值value = "";break;case HSSFCell.CELL_TYPE_ERROR: // 故障value = "非法字符";break;default:value = "未知类型";break;}}return value.trim();}
}

3、导入文件api补充
里面都是我自己的业务逻辑,需要的话可以把业务逻辑换成自己的。

Java POI实现Excel文件批量导入(兼容xls,xlsx)相关推荐

  1. 微信小程序 -- 数据库数据excel文件批量导入

    一.excel文件批量导入数据到数据库 1.创建node.js函数upload,点击upload右键外部终端中安装类库 npm install node-xlsx 2.云函数代码 const clou ...

  2. 多个excel文件批量导入到数据库

    多个excel文件批量导入到数据库 摘要:我们可以用navicate等数据库编辑器的excel导入功能将一个excel导入到数据库,但是我们有多个excel甚至成百上千怎么办?这个时候用navicat ...

  3. java poi读取excel文件(xlsx)

    读取excel文件的方法有许多种,这篇文章主要描述通过poi读取excel文件. 先maven导入jar包 <dependency><groupId>org.apache.po ...

  4. java实现excel文件批量导入数据

    具体实现: 以学生信息为例,将Excel模板信息配置在XML文件中,通过POI实现对excel文件读取操作,然后将读取的数据插入数据库中.具体思路是将模板信息配置在xml中,在项目启动时,通过spri ...

  5. java代码读取excel文件,同时兼容2003和2007

    后台服务器需要一个读取excel文件的工具,查了些资料,很多不能同时兼容2003和2007,整理了一下,加了一个判断,现在能同时兼容2003和2007,并且可以选择从表格的第几行开始读取.主要用到了a ...

  6. java代码实现excel文件数据导入

    因业务需求要实现数据的批量导入,给了指定的excel模板上传文件,用java代码实现导入excel文件. 重新复习下. 下面是源码,仅供参考. controller层代码,创建临时目录后,使用Disk ...

  7. java POI 读取Excel文件 将图片、表格生成到PPT

    临时有个需求,要求通过读取EXCEL文件,然后通过文件名称去给定的文件夹内查找图片,并将图片写入PPT中,详情以表格的形式写到图片右侧,每张图片一页PPT.效果如图所示: 用到的jar包如下(mave ...

  8. java 导出文件上传模板,上传Excel文件批量导入数据

    后端代码 controller层 @RequestMapping(value = "/importExcel", method = {RequestMethod.POST, Req ...

  9. 自制工具将excel文件批量导入到mongodb

    使用方法 下载此工具(度盘 密码: sbv6),这是一个exe文件,双击可直接运行 将这个工具放到你要处理的表格所在的目录,比如上图中有一个年级表的示例文件 确保已启动mongodb服务 双击脚本工具 ...

最新文章

  1. Vmware下Centos7安装预览
  2. ming 贪心 NOIP模拟
  3. 每个女孩子起床后做的第一件事......
  4. 几个优化 Cacti 监控服务性能的技巧
  5. SAP License:解释一下目标成本、计划成本和标准成本的区别
  6. Go语言学习之11 日志收集系统kafka库实战
  7. 吃透这套架构演化图,从零搭建Web网站也不难!
  8. MapGis:mapgis设置中配置好系统库后仍报错不能打开子图库等错误
  9. JAVA菜鸟的第一天
  10. Libfetion在Ubuntu下的中文输出了局
  11. Windows系统如何合并两个txt文本
  12. 「堡垒之夜」母公司Epic元宇宙蓝图:颠覆Facebook的社交媒体,拆除苹果的高墙花园...
  13. 计算机 取得高级权限,怎么获取电脑的最高管理员权限
  14. 安全架构--2--关于企业安全体系建设历程的思考
  15. 聚沙成塔,亚马逊云科技为智能汽车创新加速
  16. Android - 接收、监听系统短信广播
  17. go语言 最近遇到的问题总结
  18. Python 无框架实现决策树(DecisionTree)
  19. 【STM32H7教程】第87章 STM32H7的SDMMC总线基础知识和HAL库API
  20. linux 服务器的性能考核指标QPS、TPS、RT、Load、PV、UV

热门文章

  1. LinkedList的源码分析(三)
  2. HTTPS协议及其工作原理
  3. 彩图和灰图(调色板)
  4. 小猪佩画法测试代码集合(代码均转载CSDN)
  5. PS如何物体加阴影,有什么相关教程吗
  6. 绝地求生自定义服务器租一天多少钱,绝地求生自定义服务器怎么玩?玩法规则及功能玩法...
  7. C++ 封装(2): 构造函数和析构函数
  8. 被列为失信被执行企业会有哪些影响?
  9. express使用cors跨域
  10. 做数据分析的常用方法有哪些?