ssm框架实现execl上传,并插入数据库功能

从前端最后到数据库,分为页面(jsp),Controller、service、mapper 。 比较简单但是使用的方法,没有封装成工具类感觉太麻烦。

用到了poi解析execl,给出pom.xml

<!-- 		导入execl jar包 -->
		<dependency>
		    <groupId>org.apache.poi</groupId>
		    <artifactId>poi</artifactId>
	    	<version>3.7</version>
	   </dependency>

页面:(jsp),enctype="multipart/form-data"  上传文件必须写, target="message" 为了插入成功之后能返回页面信息提示

<iframe id='message' name='message' style="display:none;"></iframe> 插入成功,显示提示信息实现:创建iframe,属性设置隐藏,将请求返回的信息写在里面,在通过js获取,弹窗显示。

<div class="modal-body">
	<form id="fileForm" action="${ctx}" method="post" enctype="multipart/form-data" target="message">
		<input type="file" name="fileUser" accept="xls/xlsx"><br>
	</form>		
		<iframe id='message' name='message' style="display:none;"></iframe>	
</div>
<div class="modal-footer">
	<button type="submit" class="btn btn-primary" data-dismiss="modal"
		id="submitFile">导入短号</button>
	<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
</div>

js:

$(function() {
	$("#submitFile").click(function() {
		$("#fileForm").submit();
		$('#message').unbind('load').on('load', function() {
			var result = $("#message").contents().find('body').text();
			alert(result);
		});
	});
});co

Controller:

/**
	 * 导入用户
	 * 
	 * @param <HSSFWorkbook>
	 */
	@ResponseBody
	@RequestMapping(value = "/importShortTel")
	public String importTel(@RequestParam(value = "fileUser", required = false) MultipartFile file,
			HttpServletRequest request, HttpServletResponse response) {
		if (file == null) {
			return "获取文件失败";
		}
		// 文件名
		String fileName = file.getOriginalFilename();
		// 路径
		String path = request.getSession().getServletContext().getRealPath("upload");
		// 长度
		long size = file.getSize();
		if (fileName == null || ("").equals(fileName) && size == 0) {
			return "空文件或者文件名字为空";
		}
		if (fileName.indexOf(".xls") > 0) {
			// 创建存放上传文件的文件夹
			File filePath = new File(path);
			if (!filePath.exists()) {
				filePath.mkdirs();
			}
			// 保存
			File targetFile = new File(path, fileName);
			try {
				file.transferTo(targetFile);
				InputStream in = new FileInputStream(targetFile);

				HSSFWorkbook workbook = new HSSFWorkbook(in);// 创建对Excel工作薄
				HSSFSheet sheet = workbook.getSheetAt(0);
				// 调用Service,将数据插入Excel
				int i = shortTelService.importShortTel(sheet);
				if (i > 0) {
					return "导入成功";
				} else {
					return "导入失败";
				}
			} catch (IOException e) {
				return "存在异常"+e.getMessage();
			}
		}
		return "空文件或者文件不是execl";
	}

service:获取多少列以及每列的对应的类的属性自己设置,行通过for循环读取,读取完成的是一个List集合,在Mapper里会利用到批量插入

@Override
	public Integer importShortTel(HSSFSheet sheet) {
		// 获取该工作表的第一行
		HSSFRow row = null;
		// 获取该工作表的第一个单元格
		HSSFCell cell = null;

		// 存放短号的List
		List<ShortTel> shortTelList = new ArrayList<>();
		for (int i = 1; i <= sheet.getLastRowNum(); i++) {
			// 在循环里面写,List保存的是引用,故在外边写会被覆盖,对象的地址相同
			ShortTel tel = new ShortTel();
			row = sheet.getRow(i);

			// 数字取整
			DecimalFormat df = new DecimalFormat("0");

			// 获取第I列 第一个单元格
			cell = row.getCell(0);
			if (null == cell) {
				continue;
			}
			if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
				String number = df.format(cell.getNumericCellValue());
				if (number.equals("")) {
					continue;
				}
			} else {
				if (cell.getRichStringCellValue().getString().equals("")) {
					continue;
				}
			}
			String shortTel = "";
			if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
				shortTel = df.format(cell.getNumericCellValue());
			} else {
				shortTel = cell.getRichStringCellValue().getString();
			}

			tel.setShortTel(shortTel);
			// 将放到list中
			shortTelList.add(tel);

		}

		return shortTelMapper.insertShortTelBatch(shortTelList);
	}

Mapper.xml

<insert id="insertShortTelBatch" parameterType="java.util.List">
		insert into short_tel(short_tel)
		values
		 <foreach collection="list" item="item"  separator=",">
		 	  (#{item.shortTel}) 
		 </foreach>	
	</insert>

到此 插入成功,返回插入行数,判断是不是大于0,返回信息,在前端提示用户。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值