一些用户要求Excel导入学生信息或试题信息这就用到了Excel导入功能,下面我们具体讲讲Excel如何导入

首先我用的是框架

niua: 基于Springboot的后台管理系统 - Gitee.com

此框架还有自动生成增删改查和前端vue页面

将Excel表中数据导入数据库

第一步,我们要将本地Excel表上传到服务器(此次我就将我的本地电脑当做了服务器),并返回服务中Excel表的名称,拼接服务器中Excel表的绝对路径。

NiuaConfig.getUploadPath()方法--通过注解获取yml中定义的服务器文件上传路径

FileUploadUtils.upload方法

extractFilename(file)方法--传入二进制文件

在文件存储路径创建文件夹以便于管理、例如

File desc = getAbsoluteFile(baseDir, fileName)将文件路径完整拼接没有那层他都会自己创建

file.transferTo(desc)将二进制文件写入指定文件夹

到这文件上传就完成了。返回文件路径,就可以引用了。

upload是方法拼接的

//上传文件路径 F:\\Program Files\\java\\chaozexu\\bdks\\demo\\upload\\
String filePath = NiuaConfig.getUploadPath();
//上传文件并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file);
//拼接文件上传到服务器的绝对路径
fileName = filePath + File.separator + fileName;

第二步,解析我们Excel表中数据,并将Excel中的数据和java的属性进行匹配或赋值

Excel表数据

Excel表头数据要和实体类中Excel注解中name对应

public class Exam {@TableId(type = IdType.AUTO)@Excel(name = "序号", cellType = Excel.ColumnType.NUMERIC)private Long id;@Excel(name = "考试名称")private String name;@Excel(name = "考试时间")private LocalDateTime examTime;@Excel(name = "考试描述")private String description;@ApiModelProperty(value = "更新时间")@TableField(fill = FieldFill.INSERT_UPDATE)@Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;@ApiModelProperty(value = "创建时间")@TableField(fill = FieldFill.INSERT)@Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")private LocalDateTime createTime;@TableField(exist=false)@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")private LocalDateTime createTimeBegin;@TableField(exist=false)@JsonFormat(shape = JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")private LocalDateTime createTimeEnd;@Excel(name = "删除标识0正常")private Integer deleteFlag;}
package tech.niua.admin.util;import org.springframework.web.multipart.MultipartFile;
import tech.niua.common.annotation.Excel;
import tech.niua.common.config.NiuaConfig;
import tech.niua.common.utils.file.FileUploadUtils;import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;/*** 解析我们Excel表中数据,并将Excel中的数据和java的属性进行匹配或赋值*/
public class ExcelImport {//返回List<Object>类型的数据/*** * @param file  二进制文件* @param object  实体类* @return* @throws Exception*/public static List<Object> importExcel(MultipartFile file, Class cls) throws Exception {//上传文件路径 F:\\Program Files\\java\\chaozexu\\bdks\\demo\\upload\\String filePath = NiuaConfig.getUploadPath();//上传文件并返回新文件名称String fileName = FileUploadUtils.upload(filePath, file);//拼接文件上传到服务器的绝对路径fileName = filePath + File.separator + fileName;//把上传的文件转换成输入流FileInputStream fileInputStream = new FileInputStream(new File(fileName));//输入流 和 文件路径  作为参数传入 获取List<List<Object>>类型数据的方法中List<List<Object>> list = ExcelUtils.getListByExcel(fileInputStream, fileName);//将数据转换成List<Object>类型的数据List<Object> firstRows = null;//将第一行拿出if (list != null && list.size() > 0) {firstRows = list.get(0);}//创建excelDate集合,将需要插入数据库的数据放到excelDate中List<Object> excelDate = new ArrayList<>();//遍历每行数据for (int i = 1; i < list.size(); i++) {List<Object> rows = list.get(i);//通过反射实例化处理的类Object obj = cls.newInstance();//对每行的每列进行遍历for (int j = 0; j < rows.size(); j++) {String cellVal = (String) rows.get(j);//调用方法给实体类属性赋值ExcelImport.setFieldValueByFieldName(obj, firstRows.get(j).toString().trim(), cellVal);}excelDate.add(obj);}return excelDate;}/*** 通过反射判断注解和属性名并给实体类赋值* 将获取的数据的数据类型,转化为实体类属性类型* @param object* @param fieldName* @param val*/public static void setFieldValueByFieldName(Object object, String fieldName, Object val) {try {//通过反射获取类中属性Field[] fields = object.getClass().getDeclaredFields();for (int i = 0; i < fields.length; i++) {Field field = fields[i];//反射对属性进行赋值//强制类型转换field.setAccessible(true);//拿到当前实体类字段的Excel注解Excel excel = field.getAnnotation(Excel.class);if(excel == null){continue;}if(fieldName.equals(excel.name())||fieldName.equals(field.getName())){//把属性值set进对象//将String类型强转换为其实体类相对应的类型if(field.getType()==Integer.class){field.set(object,Integer.valueOf(val.toString()));} else if(field.getType()==Long.class){field.set(object,Long.valueOf(val.toString()));}else if(field.getType()== LocalDateTime.class){DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime LocalTime = LocalDateTime.parse( val.toString(),df);field.set(object,LocalTime);}elsefield.set(object, val);return;}}} catch (Exception e) {e.printStackTrace();}}}

Excel工具类(将Excel表中数据转成List<List<Object>>形式)

package tech.niua.admin.util;import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** Created by Guanzhong Hu* Date :2020/2/12* Description : excel导入工具类* Version :1.0*/
public class ExcelUtils {private final static String excel2003L =".xls";    //2003- 版本的excelprivate final static String excel2007U =".xlsx";   //2007+ 版本的excel/*** @Description:获取IO流中的数据,组装成List<List<Object>>对象* @param in,fileName* @return* @throws IOException*/public static List<List<Object>> getListByExcel(InputStream in, String fileName) throws Exception{List<List<Object>> list = null;//创建Excel工作薄Workbook work = getWorkbook(in,fileName);if(null == work){throw new Exception("创建Excel工作薄为空!");}Sheet sheet = null;  //页数Row row = null;  //行数Cell cell = null;  //列数list = new ArrayList<List<Object>>();//遍历Excel中所有的sheetfor (int i = 0; i < work.getNumberOfSheets(); i++) {sheet = work.getSheetAt(i);if(sheet==null){continue;}//遍历当前sheet中的所有行for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {row = sheet.getRow(j);if(row==null){continue;}//遍历所有的列List<Object> li = new ArrayList<Object>();for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {cell = row.getCell(y);li.add(getValue(cell));}list.add(li);}}return list;}/*** @Description:根据文件后缀,自适应上传文件的版本* @param inStr,fileName* @return* @throws Exception*/public static  Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{Workbook wb = null;String fileType = fileName.substring(fileName.lastIndexOf("."));if(excel2003L.equals(fileType)){wb = new HSSFWorkbook(inStr);  //2003-}else if(excel2007U.equals(fileType)){wb = new XSSFWorkbook(inStr);  //2007+}else{throw new Exception("解析的文件格式有误!");}return wb;}/*** @Description:对表格中数值进行格式化* @param cell* @return*///解决excel类型问题,获得数值public static String getValue(Cell cell) {String value = "";if(null==cell){return value;}switch (cell.getCellType()) {//数值型case NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {//如果是date类型则 ,获取该cell的date值Date date = DateUtil.getJavaDate(cell.getNumericCellValue());SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");value = format.format(date);;}else {// 纯数字BigDecimal big=new BigDecimal(cell.getNumericCellValue());value = big.toString();//解决1234.0  去掉后面的.0if(null!=value&&!"".equals(value.trim())){String[] item = value.split("[.]");if(1<item.length&&"0".equals(item[1])){value=item[0];}}}break;//字符串类型case STRING:value = cell.getStringCellValue();break;// 公式类型case FORMULA://读公式计算值value = String.valueOf(cell.getNumericCellValue());if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串value = cell.getStringCellValue();}break;// 布尔类型case BOOLEAN:value = " "+ cell.getBooleanCellValue();break;default:value = cell.getStringCellValue();}if("null".endsWith(value.trim())){value="";}return value;}}

第三步,批量插入到我们的数据库

    /*** 数据导入* @return*/@PreAuthorize("hasAuthority('/exam/dataImport')")@PostMapping("/dataImport")public ResultJson uploadFile(MultipartFile file) throws Exception {List<Object> objects = ExcelImport.importExcel(file,Exam.class);List<Exam> list = (List)objects;boolean flag = examService.saveOrUpdateBatch(list);if(flag){return ResultJson.ok();}return ResultJson.failure(ResultCode.NOT_UPDATE);}

vue上传功能

<template><div class="component-upload-image"><el-uploaddrag:action="uploadImgUrl":on-success="handleUploadSuccess":before-upload="handleBeforeUpload":on-error="handleUploadError"name="file":show-file-list="false":headers="headers"><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div></el-upload><el-row><span>{{uploadUrlPath}}</span></el-row></div>
</template><script>import { getToken } from '@/utils/auth';export default {components: {},data() {return {uploadImgUrl:  "/v1/exam/dataImport", // 上传的图片服务器地址headers: {Authorization: "Bearer " + getToken(),},uploadUrlPath: "没有文件上传",};},props: {value: {type: String,default: "",},},methods: {handleUploadSuccess(res) {this.uploadUrlPath = JSON.stringify(res);this.loading.close();},handleBeforeUpload() {this.loading = this.$loading({lock: true,text: "上传中",background: "rgba(0, 0, 0, 0.7)",});},handleUploadError() {this.$message({type: "error",message: "上传失败",});this.loading.close();},},watch: {},};
</script><style scoped lang="scss">.avatar {width: 100%;height: 100%;}
</style>

结果展示

将Excel表中数据导入数据库(看了就会)相关推荐

  1. python怎么导入sql数据库,##使用python将excel表中数据导入sql server数据库

    如何用python将excel数据导入到postgresql数据库中 把excel表格另存为csv文件 python将exce文件含有多个sheet同时l导入sqlserver数据库 需要使用xlrd ...

  2. 如何将Excel文件中数据导入数据库

    最近在公司中遇到一个问题,需要将Excel中的数据导入数据库,开始我的思路是:解析Excel文件,或许所需数据,生成SQL语句,然后在数据库中执行,如果有需要这样写的,可以在我的主页中下载,我已经上传 ...

  3. java上传excel文件代码,求java把上传文件的excel表中数据存入数据库中.实现录入的代码?...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 CREATE TABLE [dbo].[p_bom_user_info] ( [ID] varchar(50) NULL , [SESAID] varch ...

  4. 从EXCEL文件将数据导入数据库的向导程序设计!

    原创文章,转载请注明出处! 最近在做一个向导程序,希望把EXCEL表中数据导入数据库,首先是选择数据源.字段匹配最后进行数据检验和错误设置!类的关系比较复杂,希望理清类与类之间的关系.程序的架构有些像 ...

  5. navicat导入excel表中数据出错问题

    navicat导入excel表中数据出错问题 解决办法,修改excel表中重复的字段

  6. code的bootstrap如何有提示 vs_如何用DataFocus对Excel表中数据进行分析?

    常见的数据分析方法有 结构分析.对比分析.平均分析和交叉分析等等.那么,如何用DataFocus进行数据分析?如何对Excel表中数据进行分析呢?接下来,我们先简单看下对Excel表中数据进行结构分析 ...

  7. python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc

    利用Python处理和分析Excel表中数据实战 [利用python进行数据分析--基础篇]利用Python处理和分析Excel表中数据实战 原创 2017年06月28日 15:09:32 标签: p ...

  8. 将Excel表的数据导入mysql

    将Excel表的数据导入mysql 准备工作 在mysql已有表 准备工作 安装Navicat 12 for MySQL工具 工具下载地址:https://www.navicat.com.cn/pro ...

  9. Delphi读取并用ListView打印输出Excel表中数据

    Delphi7读取并用ListView打印输出Excel表中数据 我自己也是才开始学的,想做这么个功能在网上看了蛮多案例,感觉缺了很多细节,很多案例不能说是差不多吧,完全就是一模一样,属于是你抄我我抄 ...

  10. python和excel数据分析_利用Python处理和分析Excel表中数据实战

    作为一个学习用Python进行数据分析的新手来说,通过本文来记录分享一些我在用Python中的pandas.numpy来分析Excel表中数据的数据清洗和整理的工作,目的是熟悉numpy以及panda ...

最新文章

  1. 更精准地生成字幕!哥大Facebook开发AI新框架,多模态融合,性能更强
  2. 010_JavaScript变量
  3. engineering likes?
  4. boost::hana::detail::has_duplicates用法的测试程序
  5. Netflix混沌工程手册Part 2:混沌工程原则
  6. java注解执行顺序_如何确保java中的注释执行顺序?
  7. 小爱同学App下架苹果App Store 网友:SiriOS警告?
  8. Django中间件简析
  9. 计算机基础知识100题 含答案,计算机基础知识练习试题及答案
  10. 案例解读|江苏银行—智多星大数据分析云平台实践
  11. 高版本linux安装gamit,GAMIT10.6安装包下载
  12. 网页聊天室制作步骤分享
  13. 字节架构师:来说说 Kafka 的消费者客户端详解,你都搞懂了吗。
  14. 曲师大教务系统服务器,曲阜师范大学掌上教务
  15. Java常见面试题(二)
  16. java——配置环境变量
  17. EMC组建BRS部门 让备份不再成为困扰
  18. 下载linux系统centos7,CentOS 7.4.1708 下载
  19. C++ 省略 std:: 前缀
  20. USB CDC 4G Module 调试问题总结

热门文章

  1. 双摄方案android,科普短文,各种手机双摄像头搭配方案及工作原理简介
  2. 计算机文件只读模式,电脑文件只读模式如何修改 – 手机爱问
  3. art-template模板引擎和其它第三方模块搭配使用
  4. 用Python实现小黑屋游戏
  5. Python-基于request豆瓣电影票房信息爬取,简单粗暴
  6. Excel数据分析从入门到精通(九)28个图表之KPI分析
  7. LeetCode(数据库)- 计算税后工资
  8. 1/1917钓鱼思维导图
  9. [bzoj3202] [SDOI2013]项链
  10. 【毕设记录日记】深度学习|铝型材表面缺陷视觉检测算法:YOLOv5环境搭建、基础知识、问题解决、优化方法