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. 参考链接

相关推荐
phltxy5 分钟前
MCP 从协议到 Spring AI 实战
人工智能·spring·oracle
Volunteer Technology2 小时前
SpringSecurity请求流转的本质
java·spring
云烟成雨TD4 小时前
Spring AI 1.x 系列【42】MCP 服务端 Spring Boot 启动器
java·人工智能·spring
云烟成雨TD4 小时前
Spring AI 1.x 系列【38】模型上下文协议(MCP)
java·人工智能·spring
Alson_Code4 小时前
Spring AI-1.1.0
java·人工智能·后端·spring·ai编程
小小放舟、4 小时前
@JsonCreator 注解详解——从枚举反序列化说起
spring boot·spring·spring cloud·java-ee·maven·intellij-idea·状态模式
摇滚侠6 小时前
Spring 零基础入门到进阶 入门 06-10
java·spring·intellij-idea
總鑽風7 小时前
Spring AI实战:快速集成阿里通义千问
java·后端·spring·ai编程
云烟成雨TD7 小时前
Spring AI 1.x 系列【43】基于标准输入输出 (STDIO) 与服务端推送事件 (SSE) 的 MCP 服务端
java·人工智能·spring
砍材农夫8 小时前
物联网实战:Spring Boot + Netty 搭建 MQTT平台 | 多协议适配与模块化设计
java·spring boot·后端·物联网·spring