SSM excel文件的导入导出
对于excel文件的导入导出,后台接收读取和建表封存都是固定死的,所以对于excel导入时,excel文件内容必须匹配后台相关对象,不然报错。
excel文件导出,用<a><a/>标签即可,通过后台去完成 ,不可用ajax去写导出,ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。
文件的下载是以二进制形式进行的,ajax没法解析后台返回的文件流,所以无法处理二进制流response输出来下载文件。
当获取前台导入这个命令后,会通过Mybatis获取mysql数据库所有相关数据,通过for循环将获取集合中一个个对象及对象属性写入表中,导出。
对于excel文件的导入则是可以通过form表单和ajax两种方法导入,前者在controller控制器里面返回字符串,会直接显示在页面上,需要手动重新刷新页面。
后者……,虽然很想使用,但网上并没有找到有关纯ajax写入后台的案例,不过有几类别人封装好的ajax插件用于写入excel文件的,有兴趣可以去找找。
文件上传,控制台获取到文件,读取文件里面value值,封存到其对象中,通过Mybatis保存数据库中。(UPDATE good SET g_id = UUID(),mybatis添加对象时uuid为主键,只要mysql主键为String类型长度足够容纳uuid自动生成长度)
<!-- html -->
<!-- excel文件导出 -->
<p><a href="${pageContext.request.contextPath}/user/exportExcel">导出</a>
<!-- excel文件导入 -->
<form action="${pageContext.request.contextPath}/user/importExcel" method="post" enctype="multipart/form-data">
<input type="file" name="userExcel" />
<input type="submit" value="导入">
</form>
//控制层
//导出excel文档
@RequestMapping("/exportExcel")
@ResponseBody
public void exportExcel(HttpServletRequest request,HttpServletResponse response){
try {
//获取数据源
List<User> userList = userService.queryUserAll(); //导出excel
response.setHeader("Content-Disposition","attachment;filename="+new String("用户信息.xls".getBytes(),"ISO-8859-1"));
response.setContentType("application/x-excel;charset=UTF-8");
OutputStream outputStream = response.getOutputStream();
//导出
userService.exportExcel(userList,outputStream);
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//导入
@RequestMapping("/importExcel")
//@ResponseBody
public String importExcel(MultipartFile userExcel,HttpServletRequest request,HttpSession session){
if(userExcel == null){
session.setAttribute("excelName", "未上传文件,上传失败!");
return "redirect:queryUserAll";
}
String userExcelFileName = userExcel.getOriginalFilename();
if(!userExcelFileName.matches("^.+\\.(?i)((xls)|(xlsx))$")){
session.setAttribute("excelName", "文件格式不正确!请使用.xls或.xlsx后缀的文档,导入失败!");
return "redirect:queryUserAll";
}
//导入
try {
userService.importExcel(userExcel);
} catch (IOException | InvalidFormatException e) {
e.printStackTrace();
}
session.setAttribute("excelName", "导入成功!");
return "redirect:queryUserAll";
}
//service层
//导出
@Override
public void exportExcel(List<User> userList, OutputStream outputStream) throws IOException {
//1.创建工作簿
HSSFWorkbook hwb =new HSSFWorkbook();
//1.1创建合并单元格
//CellRangeAddress cellRangeAddress =new CellRangeAddress(0,0,0,4);
//2.创建工作表
HSSFSheet sheet = hwb.createSheet("用户信息表");
//2.1添加合并单元格
//sheet.addMergedRegion(cellRangeAddress);
//3.1创建第一行及单元格
HSSFRow row1 = sheet.createRow(0);
HSSFCell cell1 = row1.createCell(0);
cell1.setCellValue("用户信息");
//3.2创建第二行及单元格
HSSFRow row2 = sheet.createRow(1);
String[] row2Cell = {"编号","姓名","性别","年龄","部门名称"};
for (int i =0 ; i < row2Cell.length ; i++ ){
row2.createCell(i).setCellValue(row2Cell[i]);
}
//3.3创建第三行及单元格
if(userList!= null && userList.size()>0){
for(int j=0 ; j<userList.size() ;j++){
HSSFRow rowUser = sheet.createRow(j+2);
rowUser.createCell(0).setCellValue(userList.get(j).getId());
rowUser.createCell(1).setCellValue(userList.get(j).getName());
rowUser.createCell(2).setCellValue(userList.get(j).getSex());
rowUser.createCell(3).setCellValue(userList.get(j).getAge());
//rowUser.createCell(4).setCellValue(userList.get(j).getId());
}
}
//5.输出
hwb.write(outputStream);
}
//导入
@Override
public void importExcel(MultipartFile userExcel) throws IOException, InvalidFormatException {
//获取输入流
InputStream inputStream = userExcel.getInputStream();
//创建读取工作簿
Workbook workbook = WorkbookFactory.create(inputStream);
//获取工作表
Sheet sheet = workbook.getSheetAt(0);
//获取总行
int rows=sheet.getPhysicalNumberOfRows();
if(rows>2){
//获取单元格
for (int i = 2; i < rows; i++) {
Row row = sheet.getRow(i);
User user =new User(); try {
String id = row.getCell(0).getStringCellValue();
user.setId(Integer.parseInt(id));
} catch (IllegalStateException e) {
int id=(int)row.getCell(0).getNumericCellValue();
user.setId(id);
} String name = row.getCell(1).getStringCellValue();
user.setName(name); String sex = row.getCell(2).getStringCellValue();
user.setSex(sex); try {
String age = row.getCell(3).getStringCellValue();
user.setAge(Integer.parseInt(age));
} catch (IllegalStateException e) {
int age=(int)row.getCell(3).getNumericCellValue();
user.setAge(age);
}
//想数据库中添加新对象
addUser(user);//方法
} } inputStream.close();
}
SSM excel文件的导入导出的更多相关文章
- NPOI对excel文件的导入导出
现理解:将一个Excel文件(工作簿-IWorkBook)看做是一个你要操作的对象,每个工作簿包含多个工作表(ISheet)对象,每个工作表中又包含多个行对象(IRow),每行又包含多个单元格(ICe ...
- java项目中Excel文件的导入导出
package poi.excel; import java.io.IOException; import java.io.InputStream; import java.io.OutputStre ...
- EasyExcel完成excel文件的导入导出
简介 常见的Excel分析框架有Apache poi 和EasyExcel, poi在另一篇已经介绍过了,详情可以看[https://www.cnblogs.com/jasmine-e/p/16064 ...
- 使用PHPExcel实现Excel文件的导入和导出(模板导出)
在之前有写过一篇文章讲述了使用PHP快速生成excel表格文件并下载,这种方式生成Excel文件,生成速度很快,但是有缺点是:1.单纯的生成Excel文件,生成的文件没有样式,单元格属性(填充色,宽度 ...
- 循序渐进开发WinForm项目(5)--Excel数据的导入导出操作
随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...
- SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
* 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) ...
- java实现文件批量导入导出实例(兼容xls,xlsx)
1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iRepo ...
- SQL SERVER 和ACCESS、EXCEL的数据导入导出
SQL SERVER 与ACCESS.EXCEL之间的数据转换SQL SERVER 和ACCESS的数据导入导出[日期:2007-05-06] 来源:Linux公社 作者:Linux 熟 悉 ...
- 使用phpExcel实现Excel数据的导入导出(完全步骤)
使用phpExcel实现Excel数据的导入导出(完全步骤) 很多文章都有提到关于使用phpExcel实现Excel数据的导入导出,大部分文章都差不多,或者就是转载的,都会出现一些问题,下面是本人 ...
随机推荐
- selenium修改cookie
WebDriver操作cookie的方法:cookie以字典形式保存 get_cookies() 获取所有的cookie get_cookie(name) 返回字典的key为"n ...
- echarts 角度渐变环形图心得
今天做了一个图,把自己的遇到的问题和体会记录一下,以防忘记 echarts地址 https://gallery.echartsjs.com/editor.html?c=xEPtLLmG4G 参考官网地 ...
- C# 封装SDK 获取摄像头的水平角度和垂直角度
最近需要做一个C#版本的控制终端,控制摄像头,获取摄像头的水平角度和垂直角度 获取当前摄像头的角度,需要调用一个名为NET_DVR_GetDVRConfig的bool类型的函数 在C++中,函数定义: ...
- QSS 记录
1.border-style 属性分别有 none 定义无边框. hidden 与 "none" 相同.不过应用于表时除外,对于表,hidden 用于解决边框冲突. dotted ...
- 倍增法求LCA(最近公共最先)
对于有根树T的两个结点u.v,最近公共祖先x=LCA(u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. 如图,根据定义可以看出14和15的最近公共祖先是10, 15和16的最近公共 ...
- 解决安卓JNI native 线程不能正常退出问题二
直面这个解决方法的可以看我转载的博客 https://www.cnblogs.com/Carlsblog/p/9438016.html 本方法是个投机取巧法,不过也解决了不能正常 ...
- web前端bug积累
在将img转换为canvas时,在firefox中,如果img引用的svg使用了fill=(#id),此fill是无效的,可能导致整个转换失效,html2canvas.js也不行.chrome有效,其 ...
- WebSocket 实战--转
原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/ WebSocket 前世今生 众所周知,Web 应用的交互过程通常是客户端 ...
- Log4Net 记录错误日志。
点击进入推荐链接 1.先添加log4net.dll的引用. 2.在程序入口的地方(Gloabal文件)加上这句log4net.Config.XmlConfigurator.Configure(). ...
- 简易OA漫谈之工作流设计(六,快捷表单和动态表单)
如果没有表单设计功能,我们一般建物理表,再把表单挂接到流程, 我们可以把外接表单的地址填到表单地址中,地址中会传递一个id. 如果使用外接表单,在审批的时候可能会“不太友好”,因为在审批单上看不到任何 ...