将Excel上千条数据写入到数据库中

时间:2022-06-30 16:25:02

 简要说明:因工作需要,需要一张Excel表格中的所有数据导入到数据库中。如下表,当然这只是一部分,一共一千多条。

将Excel上千条数据写入到数据库中

前期处理:

首先要保证上图中的Excel表格中的数据不能为空,如果有为空的数据,可以稍微进行处理,比如将所有为空的数据替换成加一个空格。(我的这个解析器只能解析Microsoft Excel 97-2003 工作表 (.xls)这个格式的表格,如果不是这个形式的需要进行转化。)

然后就是找一个添加页面,添加一个上传附件的功能,即添加一个type类型为file的input标签。比如

<input name="file" type="file" />

下面的内容即我这次需要导入Excel表格内容时的方法。

public void excelImport(ModelMap model,HttpServletRequest request,

HttpServletResponse response) throws Exception{

MultipartHttpServletRequest mrequest  = (MultipartHttpServletRequest)request;

MultipartFile uploadFile = mrequest.getFile("file");

File dirFile = FileUtil.mkDir(Common.getRealPath(request) + Constant.UPLOAD_EXCEL);

//将excel表格的内容整合到一个新建的实体类中(新建实体类对应excel表格字段内容)

ImportExcel<Oils1> importExcel=new ImportExcel<Oils1>(Oils1.class);

Map<Integer, String> fieldDesc = new HashMap<Integer, String>();

fieldDesc.put(1, "gys");//燃油供应商

fieldDesc.put(2, "jyg");//加油港

//船报油品资料

fieldDesc.put(3, "viscosity");//运动粘度50°C

fieldDesc.put(4, "density");//密度15°C

fieldDesc.put(5, "shangdian");//闪点

fieldDesc.put(6, "sulphur");//硫含量

fieldDesc.put(7, "ash");//灰分

fieldDesc.put(8, "vanadium");//钒

fieldDesc.put(9, "sodium");//钠

importExcel.setFieldDesc(fieldDesc);

//解析器

Map<String, ExcelDateResolver> resolver = new HashMap<String, ExcelDateResolver>();

importExcel.setResolver(resolver);

if(!Common.isNull(uploadFile) && !uploadFile.isEmpty()){

String newFileName = Common.getNewFileName(uploadFile.getOriginalFilename(), "");

File saveFile = new File(dirFile.getAbsoluteFile() + "/" + newFileName);

FileCopyUtils.copy(uploadFile.getBytes(), saveFile);

//解析excel 之后会生成一个list,这个list是newModel类型的。

List<Oils1> list=importExcel.parse2(saveFile.getAbsolutePath(), 2);

//System.out.println(list.size());

//整合execl数据,并将数据存入数据库中

for(int i=0;i<list.size();i++){

Oils1 e=list.get(i);

//添加供油商  因为我的实体类中有一些数据是在字典表中获取,所以需//要进行处理然后添加。如果看不懂可以绿色部分直接略过

String gys=e.getGys();

TSysDate g=oilsManager.getByDname(gys);

if(g==null){

g=new TSysDate();

g.setPid(Long.parseLong("51"));

g.setIsDel(Variable.UN_DEL);

g.setDname(gys);

oilsManager.doSave(g);

}

//添加加油港

String jyg=e.getJyg();

TSysDate ts=oilsManager.getByDname(jyg);

if(ts==null){

ts=new TSysDate();

ts.setPid(Long.parseLong("48"));

ts.setIsDel(Variable.UN_DEL);

ts.setDname(jyg);

oilsManager.doSave(ts);

}

Oils o=new Oils();

//e就是代表从list中循环出来的每个对象,从e对象中获取数据放到需//要放的实体类中

o.setAsh(e.getAsh()); //灰分

o.setDensity(e.getDensity());  //密度

o.setFlash(e.getFlash());  //闪点

o.setSulphur(e.getSulphur());  //硫

o.setViscosity(e.getViscosity()); //粘度

o.setSodium(e.getSodium());  //钠

o.setDensity(e.getDensity());  //密度

o.setBay(ts);  //加油港

o.setSupplier(g);  //供油商

o.setIsDel(Variable.UN_DEL);

oilsManager.doSave(o);

}

}

System.out.println("导入Excel文件[成功]");

}

详解:

第一步后台获取页面中上传的文件,并进行一一注解,从第一列开始起个别名。切记要在项目中创建一个新的实体类newModel,并将每个字段设置set、get方法。新的实体类newModel对应图片中的内容。

第二步进行解析,如下方法

public List<T> parse2(String filePath,int beginRow) throws Exception {

List<T> rets = new ArrayList<T>();

// 提取 column

Workbook wb = null;

fis = new FileInputStream(new File(filePath));

wb = create(fis);

if(wb==null){

return null;

}

// 获得了Workbook对象之后,就可以通过它得到Sheet(工作表)对象了

sheet = wb.getSheetAt(this.sheetNum);

// System.out.println("row-size="+sheet.getLastRowNum());

for(int i=beginRow;i<=sheet.getLastRowNum();i++){

Row row=sheet.getRow(i);

//  System.out.println("row="+i);

Object b = beanClass.newInstance();

for (Integer idx : fieldDesc.keySet()) {

// System.out.println("idx="+idx);

row.getCell(idx).setCellType(Cell.CELL_TYPE_STRING);

Cell cell=row.getCell(idx);

//  System.out.println(fieldDesc.get(idx)+"---;"+cell.getStringCellValue());

if (resolver.containsKey(fieldDesc.get(idx))) {

if(cell.getStringCellValue()!=null&&!"".equals(cell.getStringCellValue())){

Date ret = resolver.get(fieldDesc.get(idx)).parse(cell.getStringCellValue());

BeanUtils.setProperty(b, fieldDesc.get(idx),ret);

}else{

BeanUtils.setProperty(b, fieldDesc.get(idx),new Date());

}

}else{

if(cell.getStringCellValue()==null){

BeanUtils.setProperty(b, fieldDesc.get(idx),null);

}else{

BeanUtils.setProperty(b, fieldDesc.get(idx),cell.getStringCellValue());

}

}

}

rets.add((T) b);

}

return rets;

}

解析完成后,会获得一个list,将list循环并插入到实体类中对应的数据中。

以下是我这次导入时所建的所有类,以上内容如果看不太懂的话,可以直接复制之后自己研究

以下为上文中所谓的newModel,为导入Excel表格所建的实体类,有些字段是多余的,可以不要。

public class Oils1 implements Serializable{

private String oilsname;  //油品名称

private String ypzl;  //油品种类

private String yycd;  //原油产地

private String jyg;  //加油港

private String gys;  //供油商

private Double sulphur;  //含硫量

private Double viscosity;  //粘度

private Double ash;  //灰分

private Double sodium;  //钠含量

private Double vanadium;  //钒含量

private Double density;  //密度

private Double heat;  //热值

private Double flash;  //闪点

private Double pour;  //倾点

private Double pitch;  //沥青分

private Double cetane;  //十六烷值

private Double diesel;  //柴油指数

private Double cloub;  //浊点

public String getOilsname() {

return oilsname;

}

public String getYycd() {

return yycd;

}

public void setYycd(String yycd) {

this.yycd = yycd;

}

public String getJyg() {

return jyg;

}

public void setJyg(String jyg) {

this.jyg = jyg;

}

public String getGys() {

return gys;

}

public void setGys(String gys) {

this.gys = gys;

}

public void setOilsname(String oilsname) {

this.oilsname = oilsname;

}

public Double getSulphur() {

return sulphur;

}

public String getYpzl() {

return ypzl;

}

public void setYpzl(String ypzl) {

this.ypzl = ypzl;

}

public void setSulphur(Double sulphur) {

this.sulphur = sulphur;

}

public Double getViscosity() {

return viscosity;

}

public void setViscosity(Double viscosity) {

this.viscosity = viscosity;

}

public Double getAsh() {

return ash;

}

public void setAsh(Double ash) {

this.ash = ash;

}

public Double getSodium() {

return sodium;

}

public void setSodium(Double sodium) {

this.sodium = sodium;

}

public Double getVanadium() {

return vanadium;

}

public void setVanadium(Double vanadium) {

this.vanadium = vanadium;

}

public Double getDensity() {

return density;

}

public void setDensity(Double density) {

this.density = density;

}

public Double getHeat() {

return heat;

}

public void setHeat(Double heat) {

this.heat = heat;

}

public Double getFlash() {

return flash;

}

public void setFlash(Double flash) {

this.flash = flash;

}

public Double getPour() {

return pour;

}

public void setPour(Double pour) {

this.pour = pour;

}

public Double getPitch() {

return pitch;

}

public void setPitch(Double pitch) {

this.pitch = pitch;

}

public Double getCetane() {

return cetane;

}

public void setCetane(Double cetane) {

this.cetane = cetane;

}

public Double getDiesel() {

return diesel;

}

public void setDiesel(Double diesel) {

this.diesel = diesel;

}

public Double getCloub() {

return cloub;

}

public void setCloub(Double cloub) {

this.cloub = cloub;

}

}

以下为导入Excel表格所建的的一个类,建一个ImportExcel类,然后直接将以下方法复制粘贴进去即可。

public class ImportExcel<T> {

private Map<Integer, String> fieldDesc = new HashMap<Integer, String>();

private Class<T> beanClass;

private InputStream fis = null;

private Sheet sheet = null;

private int sheetNum=0;

//解析器

private Map<String, ExcelDateResolver> resolver = new LinkedHashMap<String, ExcelDateResolver>();

public ImportExcel(Class<T> c) {

beanClass = c;

}

public List<T> parse(String filePath,int beginRow) throws Exception {

List<T> rets = new ArrayList<T>();

// 提取 column

Workbook wb = null;

fis = new FileInputStream(new File(filePath));

wb = create(fis);

if(wb==null){

return null;

}

// 获得了Workbook对象之后,就可以通过它得到Sheet(工作表)对象了

sheet = wb.getSheetAt(this.sheetNum);

for(int i=beginRow;i<=sheet.getLastRowNum();i++){

Row row=sheet.getRow(i);

Object b = beanClass.newInstance();

for (Integer idx : fieldDesc.keySet()) {

row.getCell(idx).setCellType(Cell.CELL_TYPE_STRING);

Cell cell=row.getCell(idx);

if (resolver.containsKey(fieldDesc.get(idx))) {

if(cell.getStringCellValue()!=null&&!"".equals(cell.getStringCellValue())){

Date ret = resolver.get(fieldDesc.get(idx)).parse(cell.getStringCellValue());

BeanUtils.setProperty(b, fieldDesc.get(idx),ret);

}else{

BeanUtils.setProperty(b, fieldDesc.get(idx),new Date());

}

}else{

BeanUtils.setProperty(b, fieldDesc.get(idx),cell.getStringCellValue());

}

}

rets.add((T) b);

}

return rets;

}

public List<T> parse2(String filePath,int beginRow) throws Exception {

List<T> rets = new ArrayList<T>();

// 提取 column

Workbook wb = null;

fis = new FileInputStream(new File(filePath));

wb = create(fis);

if(wb==null){

return null;

}

// 获得了Workbook对象之后,就可以通过它得到Sheet(工作表)对象了

sheet = wb.getSheetAt(this.sheetNum);

// System.out.println("row-size="+sheet.getLastRowNum());

for(int i=beginRow;i<=sheet.getLastRowNum();i++){

Row row=sheet.getRow(i);

//  System.out.println("row="+i);

Object b = beanClass.newInstance();

for (Integer idx : fieldDesc.keySet()) {

// System.out.println("idx="+idx);

row.getCell(idx).setCellType(Cell.CELL_TYPE_STRING);

Cell cell=row.getCell(idx);

//  System.out.println(fieldDesc.get(idx)+"---;"+cell.getStringCellValue());

if (resolver.containsKey(fieldDesc.get(idx))) {

if(cell.getStringCellValue()!=null&&!"".equals(cell.getStringCellValue())){

Date ret = resolver.get(fieldDesc.get(idx)).parse(cell.getStringCellValue());

BeanUtils.setProperty(b, fieldDesc.get(idx),ret);

}else{

BeanUtils.setProperty(b, fieldDesc.get(idx),new Date());

}

}else{

if(cell.getStringCellValue()==null){

BeanUtils.setProperty(b, fieldDesc.get(idx),null);

}else{

BeanUtils.setProperty(b, fieldDesc.get(idx),cell.getStringCellValue());

}

}

}

rets.add((T) b);

}

return rets;

}

public Workbook create(InputStream inp) throws IOException {

if (!inp.markSupported()) {

inp = new PushbackInputStream(inp, 8);

}

if (POIFSFileSystem.hasPOIFSHeader(inp)) {

return new HSSFWorkbook(inp);

}

throw new IllegalArgumentException("你的excel版本目前poi解析不了");

}

public void setFieldDesc(Map<Integer, String> fieldDesc) {

this.fieldDesc = fieldDesc;

}

public void setResolver(Map<String, ExcelDateResolver> resolver) {

this.resolver = resolver;

}

将Excel上千条数据写入到数据库中的更多相关文章

  1. 解析excel文件并将数据导入到数据库中

    今天领导给安排了一个临时工作,让我将一个excel里面的数据解析后放入数据库中,经过一个下午的努力成功完成,现在将代码献上,希望对大家有所帮助 一.需要导入的jar 1.commons-collect ...

  2. MySQL往表里插入千条数据 存储过程

    工作中遇到的问题,先记录一下,方便以后查看 存在两张表,user表和friend表 user表部分字段,如上图 friend表部分字段,如上图 往friend表插入千条数据,friend表中的user ...

  3. 检验Excel中数据是否与数据库中数据重复

    #region 记录Excel中的重复列 /// <summary> /// 记录Excel中的重复列 /// </summary> /// <param name=&q ...

  4. mysql中造3千条数据(3种方法)

    方法一:存储过程 1.存储过程如下: delimiter $$ DROP PROCEDURE IF EXISTS data CREATE PROCEDURE data(in i int) BEGIN ...

  5. 关于BufferedWriter&period;write超过30W条数据写入过慢问题。

    原创文章,转载请注明出处! ------------------------------------------------------------ 今天接到一个项目需求变更,是关于从数据库查询到30 ...

  6. angular &dollar;index获取ng-repeat的上一条数据

    <div ng-repeat="item in dataList" ng-click="func($index,$index-1)"></di ...

  7. element ui 渲染超过上百条数据时页面卡顿,更流畅的加载大量数据

    问题:element ui table渲染上百条数据,页面渲染开始出现延时 解决方案:使用pl-table 注意:设置use-virtual并给定table高度

  8. &lbrack;DJANGO&rsqb; excel十几万行数据快速导入数据库研究

    先贴原来的导入数据代码: 8 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "www.setting ...

  9. Django中从本地上传excel文件并将数据存储到数据库

    Django中从本地上传excel文件并将数据存储到数据库 一.前端界面 <div class="page-container"> <form action=&q ...

随机推荐

  1. 用SecureCRT在windows和CentOS间上传下载文件

    安装lrzsz: # yum -y install lrzsz 现在就可以正常使用rz.sz命令上传.下载数据了 配置SecureCRT的session选项的SFTP标签页和X/Y/Zmodem中的目 ...

  2. CountDownLatch、CyclicBarrier、Semaphore、Exchanger

    CountDownLatch: 允许N个线程等待其他线程完成执行.无法进行重复使用,只能用一次. 比如有2个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch ...

  3. C&num; Redis实战

    转自  :http://blog.csdn.net/qiujialongjjj/article/details/16945569 一.初步准备 Redis 是一个开源的使用ANSI C 语言编写.支持 ...

  4. 进位位(carry)与溢出位&lpar;overflow&rpar;的区别

    处理器内部以补码表示有符号数,8个二进制位能够表达的整数范围是:+127 ~ -128,16位表达的范围是:+32767 ~ -32768.如果运算结果超出了这个范围,就是产生了溢出:有溢出,说明有符 ...

  5. apscheduler的使用

    最近一个程序要用到后台定时任务,看了看python后台任务,一般2个选择,一个是apscheduler,一个celery.apscheduler比较直观简单一点,就选说说这个库吧.网上一搜索,晕死,好 ...

  6. Highcharts 多个Y轴动态刷新数据

    效果图: js代码: $(function() { $(document).ready(function() { Highcharts.setOptions({ global: { useUTC: f ...

  7. CentOS 7&period;4 安装部署 iRedMail 邮件服务器

    在公司部署了一套开源的邮件网关Scrollout F1用来测试,由于Scrollout F1需要使用IMAP协议连接到邮件服务器上的隔离邮箱,抓取GOOD和BAD文件夹里的邮件进行贝叶斯学习,但公司的 ...

  8. Python -- Gui编程 -- Win32API的使用

    消息框 messageBox.py import win32api, win32con win32api.MessageBox(0, 'Hello World!', 'Come Here', win3 ...

  9. uva10401Injured Queen Problem(递推)

    题目:uva10401Injured Queen Problem(递推) 题目大意:依然是在棋盘上放皇后的问题,这些皇后是受伤的皇后,攻击范围缩小了.攻击范围在图中用阴影表示(题目).然后给出棋盘的现 ...

  10. jshint options

    jshint -W032 忽略if代码块后有多余的分号的提示 地址:jslinterrors.com/unnecessary-semicolon asi       忽略函数定义后必须加分号的提示 c ...