从前端最后到数据库,分为页面(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,返回信息,在前端提示用户。