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

1. 数据库展示

在这里插入图片描述

2. 导入依赖

pom.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>

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

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

3. 写方法

3.1 导入数据

@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

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

获取当前时间

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文件操作的工具类

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;
    }
}

前端的设计代码:

//给"导入"按钮添加单击事件
$("#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 导出数据

// 导出
@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();
}

前端代码:

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

4. 效果

在这里插入图片描述

下载
在这里插入图片描述
在这里插入图片描述

上传
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5. 不足

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

6. 参考链接

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringMVC导入Excel文件有多种方法,以下是其一种常见的方法: 1. 准备Excel文件 首先需要准备一个Excel文件,可以使用Microsoft Excel或类似的软件创建。 2. 添加依赖 在pom.xml添加Apache POI依赖,如下所示: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> ``` 3. 创建控制器 创建一个Spring MVC控制器来处理文件上传请求。在控制器添加一个方法,该方法使用MultipartFile参数接收上传的文件,并使用Apache POI读取Excel文件数据。 ``` @Controller public class ExcelController { @PostMapping("/upload") public String uploadExcel(@RequestParam("file") MultipartFile file) throws IOException { Workbook workbook = new XSSFWorkbook(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { for (Cell cell : row) { System.out.print(cell.getStringCellValue() + "\t"); } System.out.println(); } workbook.close(); return "redirect:/success"; } } ``` 4. 定义表单页面 在表单页面添加一个文件上传组件,并将其提交到控制器的uploadExcel方法。 ``` <form method="post" action="/upload" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">上传</button> </form> ``` 5. 运行应用程序 在浏览器访问表单页面,选择要上传的Excel文件并提交表单。控制器将读取Excel文件数据并打印到控制台。如果上传成功,将重定向到成功页面。 注意事项: - 在上传文件时,应该添加enctype="multipart/form-data"属性到表单标签,否则文件将无法上传。 - Apache POI提供了许多API来处理Excel文件,可以根据具体需求进行选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值