springMVC中从Excel文件中导入导出数据

目录

  • [1. 数据库展示](#1. 数据库展示)
  • [2. 导入依赖](#2. 导入依赖)
  • [3. 写方法](#3. 写方法)
    • [3.1 导入数据](#3.1 导入数据)
    • [3.2 导出数据](#3.2 导出数据)
  • [4. 效果](#4. 效果)
  • [5. 不足](#5. 不足)
  • [6. 参考链接](#6. 参考链接)

1. 数据库展示

2. 导入依赖

pom.xml

xml 复制代码
        <!--文件上传处理-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
        </dependency>

        <!--poi依赖-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.15</version>
        </dependency>

在springmvc.xml中插入语句,限制导入大小

xml 复制代码
    <!--图片转换器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置上传文件的最大尺寸 -->
        <property name="maxUploadSize" value="10024000"></property>
    </bean>

3. 写方法

3.1 导入数据

java 复制代码
@RequestMapping("/workbench/activity/importActivity.do")
    public @ResponseBody Object importActivity(MultipartFile activityFile, String userName, HttpSession session){
        System.out.println("userName="+userName);
        User user=(User) session.getAttribute("sessionUser");
        ReturnObject returnObject=new ReturnObject();
        try {
            InputStream is=activityFile.getInputStream();
            HSSFWorkbook wb=new HSSFWorkbook(is);
            //根据wb获取HSSFSheet对象,封装了一页的所有信息
            HSSFSheet sheet=wb.getSheetAt(0);//页的下标,下标从0开始,依次增加
            //根据sheet获取HSSFRow对象,封装了一行的所有信息
            HSSFRow row=null;
            HSSFCell cell=null;
            Activity activity=null;
            List<Activity> activityList=new ArrayList<>();
            for(int i=1;i<=sheet.getLastRowNum();i++) {//sheet.getLastRowNum():最后一行的下标
                row=sheet.getRow(i);//行的下标,下标从0开始,依次增加
                activity=new Activity();
                activity.setId(UUIDUtils.getUUID());
                activity.setOwner("2");	// 设置人
                activity.setCreateTime(DateUtils.formateDateTime(new Date()));
                activity.setCreateBy("2");	// 设置创造人

                for(int j=0;j<row.getLastCellNum();j++) {//row.getLastCellNum():最后一列的下标+1
                    //根据row获取HSSFCell对象,封装了一列的所有信息
                    cell=row.getCell(j);//列的下标,下标从0开始,依次增加

                    //获取列中的数据
                    String cellValue= HSSFUtils.getCellValueForStr(cell);
                    if(j==0){
                        activity.setName(cellValue);
                    }else if(j==1){
                        activity.setStartDate(cellValue);
                    }else if(j==2){
                        activity.setEndDate(cellValue);
                    }else if(j==3){
                        activity.setCost(cellValue);
                    }else if(j==4){
                        activity.setDescription(cellValue);
                    }
                }

                //每一行中所有列都封装完成之后,把activity保存到list中
                activityList.add(activity);
            }

            //调用service层方法,保存市场活动,这里就不多说了
            int ret=activityService.saveCreateActivityByList(activityList);
			// 这里设置一下code,传输给前端
            returnObject.setCode("1");
            // 设置数据
            returnObject.setRetData(ret);
        }catch (Exception e){
            e.printStackTrace();
            returnObject.setCode("0");
            returnObject.setMessage("系统忙,请稍后重试....");
        }

        return returnObject;
    }

获取随机ID

java 复制代码
public class UUIDUtils {
    public static String getUUID(){
        return UUID.randomUUID().toString().replaceAll("-","");
    }
}

获取当前时间

java 复制代码
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtils {
    /**
     * 对指定的date对象进行格式化: yyyy-MM-dd HH:mm:ss
     * @param date
     * @return
     */
    public static String formateDateTime(Date date){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr=sdf.format(date);
        return dateStr;
    }

    /**
     * 对指定的date对象进行格式化: yyyy-MM-dd
     * @param date
     * @return
     */
    public static String formateDate(Date date){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        String dateStr=sdf.format(date);
        return dateStr;
    }

    /**
     * 对指定的date对象进行格式化: HH:mm:ss
     * @param date
     * @return
     */
    public static String formateTime(Date date){
        SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
        String dateStr=sdf.format(date);
        return dateStr;
    }
}

HSSFUtils.java:关于excel文件操作的工具类

java 复制代码
import org.apache.poi.hssf.usermodel.HSSFCell;

/**
 * 关于excel文件操作的工具类
 */
public class HSSFUtils {
    /**
     * 从指定的HSSFCell对象中获取列的值
     * @return
     */
    public static String getCellValueForStr(HSSFCell cell){
        String ret="";
        if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
            ret=cell.getStringCellValue();
        }else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
            ret=cell.getNumericCellValue()+"";
        }else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
            ret=cell.getBooleanCellValue()+"";
        }else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA){
            ret=cell.getCellFormula();
        }else{
            ret="";
        }

        return ret;
    }
}

前端的设计代码:

html 复制代码
//给"导入"按钮添加单击事件
$("#importActivityBtn").click(function () {
	//收集参数
	var activityFileName=$("#activityFile").val();
	var suffix=activityFileName.substr(activityFileName.lastIndexOf(".")+1).toLocaleLowerCase();//xls,XLS,Xls,xLs,....
	if(suffix!="xls"){
		alert("只支持xls文件");
		return;
	}
	var activityFile=$("#activityFile")[0].files[0];
	if(activityFile.size>5*1024*1024){
		alert("文件大小不超过5MB");
		return;
	}

	//FormData是ajax提供的接口,可以模拟键值对向后台提交参数;
	//FormData最大的优势是不但能提交文本数据,还能提交二进制数据
	var formData=new FormData();
	formData.append("activityFile",activityFile);
	formData.append("userName","张三");
	//发送请求
	$.ajax({
		url:'workbench/activity/importActivity.do',
		data:formData,
		processData:false,//设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是true
		contentType:false,//设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是true
		type:'post',
		dataType:'json',
		success:function (data) {
			if(data.code=="1"){
				//提示成功导入记录条数
				alert("成功导入"+data.retData+"条记录");
				// 自己设置展示
			}else{
				//提示信息
				alert(data.message);
			}
		}
	});
});

3.2 导出数据

java 复制代码
// 导出
@RequestMapping("/workbench/activity/exportAllActivitys.do")
public void exportAllActivitys(HttpServletResponse response) throws Exception{
    //调用service层方法,查询所有的市场活动,不多说什么,这是基础
    List<Activity> activityList=activityService.queryAllActivitys();
    //创建exel文件,并且把activityList写入到excel文件中
    HSSFWorkbook wb=new HSSFWorkbook();
    HSSFSheet sheet=wb.createSheet("市场活动列表");
    HSSFRow row=sheet.createRow(0);
    HSSFCell cell=row.createCell(0);
    cell.setCellValue("ID");
    cell=row.createCell(1);
    cell.setCellValue("所有者");
    cell=row.createCell(2);
    cell.setCellValue("名称");
    cell=row.createCell(3);
    cell.setCellValue("开始日期");
    cell=row.createCell(4);
    cell.setCellValue("结束日期");
    cell=row.createCell(5);
    cell.setCellValue("成本");
    cell=row.createCell(6);
    cell.setCellValue("描述");
    cell=row.createCell(7);
    cell.setCellValue("创建时间");
    cell=row.createCell(8);
    cell.setCellValue("创建者");
    cell=row.createCell(9);
    cell.setCellValue("修改时间");
    cell=row.createCell(10);
    cell.setCellValue("修改者");
    //遍历activityList,创建HSSFRow对象,生成所有的数据行
    if(activityList!=null && activityList.size()>0){
        Activity activity=null;
        for(int i=0;i<activityList.size();i++){
            activity=activityList.get(i);

            //每遍历出一个activity,生成一行
            row=sheet.createRow(i+1);
            //每一行创建11列,每一列的数据从activity中获取
            cell=row.createCell(0);
            cell.setCellValue(activity.getId());
            cell=row.createCell(1);
            cell.setCellValue(activity.getOwner());
            cell=row.createCell(2);
            cell.setCellValue(activity.getName());
            cell=row.createCell(3);
            cell.setCellValue(activity.getStartDate());
            cell=row.createCell(4);
            cell.setCellValue(activity.getEndDate());
            cell=row.createCell(5);
            cell.setCellValue(activity.getCost());
            cell=row.createCell(6);
            cell.setCellValue(activity.getDescription());
            cell=row.createCell(7);
            cell.setCellValue(activity.getCreateTime());
            cell=row.createCell(8);
            cell.setCellValue(activity.getCreateBy());
            cell=row.createCell(9);
            cell.setCellValue(activity.getEditTime());
            cell=row.createCell(10);
            cell.setCellValue(activity.getEditBy());
        }
    }
    //把生成的excel文件下载到客户端
    response.setContentType("application/octet-stream;charset=UTF-8");
    response.addHeader("Content-Disposition","attachment;filename=activityList.xls");
    OutputStream out=response.getOutputStream();
    wb.write(out);
    wb.close();
    out.flush();
}

前端代码:

html 复制代码
//给"批量导出"按钮添加单击事件
$("#exportActivityAllBtn").click(function () {
	//发送同步请求
	window.location.href="workbench/activity/exportAllActivitys.do";
});

4. 效果

下载

上传

5. 不足

无法精准判断每一列对应的数据,必须以一个固定的表规范才能使用

6. 参考链接

相关推荐
2501_903238651 小时前
自定义登录页面的Spring Security实践
java·后端·spring·个人开发
飞翔的佩奇2 小时前
Java项目: 基于SpringBoot+mybatis+maven+mysql实现的图书管理系统(含源码+数据库+答辩PPT+毕业论文)
java·数据库·spring boot·mysql·spring·毕业设计·图书管理
Future_yzx4 小时前
Spring MVC学习——发送请求(@RequestMapping注解及请求参数绑定)
学习·spring·mvc
程序猿零零漆9 小时前
SpringCloud系列教程:微服务的未来(二十)Seata快速入门、部署TC服务、微服务集成Seata
java·spring·spring cloud·微服务
Miketutu19 小时前
Spring MVC消息转换器
java·spring
小小虫码21 小时前
项目中用的网关Gateway及SpringCloud
spring·spring cloud·gateway
带刺的坐椅1 天前
无耳科技 Solon v3.0.7 发布(2025农历新年版)
java·spring·mvc·solon·aop
精通HelloWorld!1 天前
使用HttpClient和HttpRequest发送HTTP请求
java·spring boot·网络协议·spring·http
LUCIAZZZ1 天前
基于Docker以KRaft模式快速部署Kafka
java·运维·spring·docker·容器·kafka
拾忆,想起1 天前
如何选择Spring AOP的动态代理?JDK与CGLIB的适用场景
spring boot·后端·spring·spring cloud·微服务