SSM中Excel的导出和导入

Excel导出:

//该请求必须是同步的
@RequestMapping("/workbench/activity/exportCheckedActivity.do")
public void downloadActivityExcelByIds(String[] id,HttpServletResponse response) throws IOException {
//获取对象,封装为List
List<TblActivity> list = activityService.queryAllActivityByIds(id);
// 创建一个新的工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个新的Sheet
HSSFSheet sheet1 = workbook.createSheet("Sheet1");
//创建新行
HSSFRow row = sheet1.createRow(0);
//设置该行的每个单元格
row.createCell(0).setCellValue("id");
row.createCell(1).setCellValue("owner");
row.createCell(2).setCellValue("name");
row.createCell(3).setCellValue("start_date");
//遍历list集合,将每个对象放到独立的一行中
for (int i = 0; i < list.size(); i++) {
row = sheet1.createRow(i + 1);
row.createCell(0).setCellValue(list.get(i).getId());
row.createCell(1).setCellValue(list.get(i).getOwner());
row.createCell(2).setCellValue(list.get(i).getName());
row.createCell(3).setCellValue(list.get(i).getStartDate());
}
//获得输出流
ServletOutputStream os = response.getOutputStream();
//清除首部的空白行
response.reset();
//设执响应内容,格式为EXCEL表格
response.setContentType("application/vnd.ms-excel");
//设置响应头,Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准
response.setHeader("Content-disposition", "attachment;filename=activityList.xls");
//将workbook中的数据经输出流写出
workbook.write(os);
workbook.close();
}

Excel导入:

1、使用SpringMVC上传文件,需要用到commons-fileupload

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>

2、需要在spring的配置文件中配置一下multipartResolver

<!--配置文件上传解析器 id 必须是multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="#{1024*1024*80}"/>
<property name="defaultEncoding" value="utf-8"/>
</bean>

注意:name必须为multipartResolver,不然会报错

3、jsp页面

// 给导入按钮添加单击事件
$("#importActivityBtn").click(function () {
// 收集参数,也就是文件名
var activityFileName = $("#activityFile").val();
// 截取导入文件的类型
var suffix = activityFileName.substr(activityFileName.lastIndexOf(".") + 1).toLocaleLowerCase();
if(suffix != "xls"){
alert("只支持xls文件");
return;
}
//获得上传的文件,并判断大小
var activityFile = $("#activityFile").get(0).files[0];
if(activityFile.size > 5 * 1024 * 1024){
alert("文件大小不超过5MB");
return;
}
// FormData是ajax提供的接口,可以模拟键值对向后台提交参数;
// FormData最大的优势是不但能提交文本数据,还能提交二进制数据
var formData = new FormData();
formData.append("file", activityFile);
//发送请求
$.ajax({
url:'workbench/activity/importActivity.do',
data:formData,
// 设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是true
processData:false,
// 设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是true
contentType:false,
type:'post',
dataType:'json',
success:function (data) {
if (data.code === "1"){
// 提示成功导入记录条数
alert("成功导入" + data.returnData + "条记录");
// 关闭模态窗口
$("#importActivityModal").modal("hide");
// 刷新市场活动列表,显示第一页数据,保持每页显示条数不变
queryActivityByConditionForPage(1, $("#page-master").bs_pagination('getOption', 'rowsPerPage'));
} else {
// 提示信息
alert(data.msg);
// 模态窗口不关闭
$("#importActivityModal").modal("show");
}
}
});
});

4、java

@RequestMapping("workbench/activity/importActivity.do")
@ResponseBody
//使用MultipartFile file 来接收前端传来的文件数据,必须同名
public Object uploadActivityExcel(MultipartFile file, HttpSession session){
//ReturnObject是一个向前端返回信息的类
ReturnObject returnObject = new ReturnObject();
//存储识别出来的TblActivity对象
List<TblActivity> list = new ArrayList<>();
try {
//获取输入流
InputStream is = file.getInputStream();
BufferedInputStream bufferedInputStream = new BufferedInputStream(is);
//POIFSFileSystem需要输入流
POIFSFileSystem fileSystem = new POIFSFileSystem(bufferedInputStream);
//HSSFWorkbook需要POIFSFileSystem
HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
//获取sheet
HSSFSheet sheet = workbook.getSheetAt(0);
int lastRowNum = sheet.getLastRowNum();
//遍历sheet,将数据存到list中
for (int i = 1; i <= lastRowNum; i++) {
HSSFRow row = sheet.getRow(i);
TblActivity activity = new TblActivity();
//补充其他数据
activity.setId(UUIDUtils.getUUID());
User user = (User) session.getAttribute(Constants.SESSION_USER);
activity.setCreateBy(user.getId());
activity.setOwner(user.getId());
activity.setCreateTime(DateUtils.getStringByDate(new Date()));
//遍历excel中行中cell数据
for (int rowN = 1; rowN < row.getLastCellNum(); rowN++) {
HSSFCell cell = row.getCell(rowN);
//获取cell中的数据
String s = cell.getStringCellValue();
//将数据保存到activity对象中
switch (rowN){
case 1:
activity.setName(s);
break;
case 2:
activity.setStartDate(s);
break;
case 3:
activity.setEndDate(s);
break;
case 4:
activity.setCost(s);
break;
case 5:
activity.setDescription(s);
break;
}
}
list.add(activity);
//设置成功导入的数据条数
returnObject.setReturnData(i);
}
//数据已经存到了list中,调用service中的方法,将数据存到数据库
for (int i = 0; i < list.size(); i++) {
activityService.insertActivity(list.get(i));
}
//生成returnObject的信息
returnObject.setCode(Constants.RETURN_OBJECT_CODE_SUCCESS);
}catch (Exception e){
e.printStackTrace();
returnObject.setCode(Constants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMsg("系统忙");
}
return returnObject;
}
posted @   z-laoyao  阅读(428)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示