tlv8实现excel数据导入到数据库

这篇博客介绍了如何使用Spring MVC接收前端上传的Excel文件,并通过ExcelUtils工具类解析数据,然后利用MyBatis将解析内容存入数据库的完整流程。涉及到的关键技术包括:前端layui的文件上传,后端Spring Controller接收文件,Excel文件解析以及MyBatis的数据库操作。
摘要由CSDN通过智能技术生成

目录

一、实现思路

二、关键技术

1、控制层接收文件

2、解析excel文件

3、数据存入数据库

三、具体实现

1、页面上传文件

2、服务端就收文件

3、解析处理数据


一、实现思路

1、网页上传excel文件(.xls或.xlsx)

2、服务端接收文件(控制层)

3、处理excel文件(解析)

4、将解析出来的内容插入数据库

二、关键技术

1、控制层接收文件

tlv8使用的控制层为spring的@Controller,所以我们需要用Controller接收文件:

@Controller
public class ImportContractItems {

	@ResponseBody
	@RequestMapping(value = "/importContractItems")
	public Object execute(@RequestParam("file") MultipartFile file, String contractID) throws Exception {
    return null;
    }
}

关键是拿到从前端上传上来的文件(file),类型为:org.springframework.web.multipart.MultipartFile

2、解析excel文件

tlv8提供了一个公共类:com.tlv8.core.utils.ExcelUtils可以很方便的把excel的内容读取到一个二维数组中:

Workbook workbook = ExcelUtils.getWorkbook(file);
String[][] datas = ExcelUtils.readSheet(workbook, 0);

3、数据存入数据库

tlv8采用的持久层为mybatis,基础包提供了一个快速获取数据库session的方法:

DBUtils.getSession(dbkey); dbkey为数据库连接配置中的“数据源名称”

SqlSession session = DBUtils.getSession("oa");
Connection conn = session.getConnection();

获得java.sql.Connection后参照JDBC的API操作数据库即可。

三、具体实现

1、页面上传文件

1.1、grid工具栏添加导入按钮:importbtn = subdgrid3.insertSelfBar("导入清单","60px","");

HTML写按钮:<button id="importbtn">导入</button>

 1.2、JS控制

layui.upload.render({
		elem:'#'+importbtn,
		url:cpath+'/pur/importContractItems',
		accept: 'file',
		dataType: 'json',
		data:{contractID:ContraData.rowid},
		done: function(res, index, upload){
			if(res.code != '-1'){ 
				subdgrid3.refreshData();
			}else{
				alert(res.msg);
			}
		}
	});

引用layui:

<link type="text/css" rel="stylesheet" href="../../../resources/layui/css/layui.css"></link>

<script type="text/javascript" src="../../../resources/layui/layui.js"></script>

layui文件上传

2、服务端就收文件

控制层的方法里面增加参数:@RequestParam("file") MultipartFile file

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("/pur")
public class ImportContractItems {
     @ResponseBody
	@RequestMapping(value = "/importContractItems")
	public Object execute(@RequestParam("file") MultipartFile file, String contractID) throws Exception {
        JSONObject res = new JSONObject();
        return res;
    }   
}

3、解析处理数据

利用公共类:com.tlv8.core.utils.ExcelUtils解析excel内容:

Workbook workbook = ExcelUtils.getWorkbook(file);
String[][] datas = ExcelUtils.readSheet(workbook, 0);//0:excel工作簿的编号第一个从0开始

解析完成之后插入数据库:

利用公共类:com.tlv8.base.db.DBUtils获得数据库连接:

SqlSession session = DBUtils.getSession("oa");
Connection conn = session.getConnection();

完整的代码实例:

package com.tlv8.pur.contract;

import java.sql.Connection;
import java.sql.PreparedStatement;

import org.apache.ibatis.jdbc.SQL;
import org.apache.ibatis.session.SqlSession;
import org.apache.poi.ss.usermodel.Workbook;
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.tlv8.base.db.DBUtils;
import com.tlv8.base.utils.IDUtils;
import com.tlv8.core.utils.ExcelUtils;

/**
 * 合同清单导入
 * 
 * @author chenqian
 *
 */
@Controller
@RequestMapping("/pur")
public class ImportContractItems {

	@ResponseBody
	@RequestMapping(value = "/importContractItems")
	public Object execute(@RequestParam("file") MultipartFile file, String contractID) throws Exception {
		JSONObject res = new JSONObject();
		SqlSession session = DBUtils.getSession("oa");
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			String fileName = file.getOriginalFilename();
			if (fileName == null || "".equals(fileName)) {
				res.put("code", -1);
				res.put("msg", "导入失败:未选择文件或文件类型不正确!");
			} else if (fileName.toLowerCase().indexOf("xls") < 0 && !"".equals(fileName)) {
				res.put("code", -1);
				res.put("msg", "导入失败:文件类型不正确!正确的导入文件为Excel");
			} else {
				Workbook workbook = ExcelUtils.getWorkbook(file);
				String[][] datas = ExcelUtils.readSheet(workbook, 0);

				SQL sql = new SQL();
				sql.INSERT_INTO("pur_contract_items");
				sql.INTO_COLUMNS("fID", "fcontractID", "fbrand", "fnumber", "fprice", "ftotalprice", "fremarks");
				sql.INTO_COLUMNS("funit", "fservices", "fgoodsname", "fmodel", "fMaincfp", "VERSION", "fnum",
						"fmanufacturer", "fplaceofOrigin");
				sql.INTO_VALUES("?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?");
				
				conn = session.getConnection();
				for (int i = 1; i < datas.length; i++) {
					ps = conn.prepareStatement(sql.toString());
					ps.setString(1, IDUtils.getGUID());
					ps.setString(2, contractID);
					ps.setString(3, datas[i][0]);// 品牌
					ps.setString(4, datas[i][1]);// 数量
					ps.setString(5, datas[i][3]);// 单价
					ps.setDouble(6, Double.valueOf(datas[i][1])*Double.valueOf(datas[i][3]));// 总价
					ps.setString(7, datas[i][6]);
					ps.setString(8, datas[i][2]);//
					ps.setString(9, datas[i][5]);// 服务内容
					ps.setString(10, datas[i][7]);// 货物名称
					ps.setString(11, datas[i][8]);// 型号
					ps.setString(12, datas[i][9]);// 主要配置参数
					ps.setInt(13, 0);
					ps.setInt(14, i);
					ps.setString(15, datas[i][10]);// 制造商
					ps.setString(16, datas[i][11]);// 产地
					ps.executeUpdate();
				}
				session.commit(true);
				res.put("code", 0);
				res.put("msg", "导入成功!");
			}
		} catch (Exception e) {
			session.rollback(true);
			res.put("code", -1);
			res.put("msg", "导入失败!详细:" + e.getMessage());
			e.printStackTrace();
		} finally {
			DBUtils.CloseConn(session, conn, ps, null);
		}
		return res;
	}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前剖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值