IBS-EasyPoi文件导入与导出

请求和响应对象
在这里插入图片描述
2003版:HSSF
2007版:XSSF
使用JAVA操作EXCEL文件:
输出内容到Excel文件:
Excel文件成为一个工作簿,可以创建多个sheet:工作表,一个工作表有很多行数据:Row,每一行中具有多个列,每一列为一个cell:单元格
1、首先创建2007版的工作簿:workbook
2、通过工作簿创建工作表,可以指定工作表名称,默认为sheet1、sheet2
3、准备数据
4、创建输出流,指定文件名称
5、使用工作簿的write方法传入输出流
6、关流
读取Excel中的内容
1、首先创建2007版的工作簿:workbook
2、通过索引获取到工作表:getSheetAt(0)
3、首选获取总行数,然后编写循环每一行,然后获取当前行的列数,再然后获取当前行的每一个列,最后获取单元格的内容
EasyPOI
1、导包

	<dependency>
      <groupId>cn.afterturn</groupId>
      <artifactId>easypoi-base</artifactId>
      <version>3.2.0</version>
    </dependency>
    <dependency>
      <groupId>cn.afterturn</groupId>
      <artifactId>easypoi-web</artifactId>
      <version>3.2.0</version>
    </dependency>
    <dependency>
      <groupId>cn.afterturn</groupId>
      <artifactId>easypoi-annotation</artifactId>
      <version>3.2.0</version>
    </dependency>

2、创建domain实体类
通过@Excel注解导入导出数据:
1、@Excel注解的name属性值必须和Excel文件中的表头名称保持一致
2、name属性的值不能有空格
3、必须有无参构造的方法
4、每个字段必须有setget方法


导入数据

@Test
public void testReadExcel() throws Exception{
    ImportParams params = new ImportParams();
    params.setTitleRows(1);
    params.setHeadRows(1);
    List<PoiEmployee> list = ExcelImportUtil.importExcel(new FileInputStream("emp.xlsx"), PoiEmployee.class, params);
    list.forEach(poiEmployee -> System.out.println(poiEmployee));
}

导出数据
replace属性表示替换:{“男_1”,“女_2”} 表示将1替换成男,将2替换成女
domain:

 @Excel(name = "性别",replace = {"男_1","女_2"})
 private Integer sex;
@Test
    public void testFormat() throws Exception{
        //准备数据
        List<PoiEmployee> list = new ArrayList<>();
        list.add(new PoiEmployee("admin1","admin1@qq.com",31,"财务部",1));
        list.add(new PoiEmployee("admin2","admin2@qq.com",27,"财务部",2));
        list.add(new PoiEmployee("admin3","admin3@qq.com",25,"IT部",1));
        list.add(new PoiEmployee("admin4","admin4@qq.com",29,"IT部",2));

        //设置工作簿名称和标题
        ExportParams params = new ExportParams();
        params.setSheetName("员工列表");
        params.setTitle("员工信息");

        //使用EasyPoi提供的工具类导出
        Workbook workbook = ExcelExportUtil.exportExcel(params,PoiEmployee.class,list);
        //将数据填充到Excel中
        OutputStream os = new FileOutputStream("员工列表2.xls");
        workbook.write(os);
        os.close();
        workbook.close();
    }

日期时间格式化:
只需要在domain实体类的字段上面添加fomat即可

@Excel(name = "生日",format = "yyyy-MM-dd")
private Date birthDay = new Date();

图片处理:
type 属性表示指定导出的数据类型
导出类型:
1是文本 2是图片,3是函数,10是数字 默认是1表示文本

@Excel(name = "头像",type = 2,width = 10,height = 20)
private String image="images/hi.png";

关联对象的属性
首先创建被关联对象的实体类
字段上面添加@Excel注解并指定名称

@Excel(name = "部门名称")
 private String name;

关联对象的实体类字段只需要添加@ExcelEntity注解即可

@ExcelEntity
private PoiDepartment department;

Test:

@Test
    public void testEmployeeAndDepartment() throws Exception{

        PoiDepartment department01 = new PoiDepartment(1L, "喝酒吃肉部");
        PoiDepartment department02 = new PoiDepartment(1L, "公关部");


        //准备数据
        List<PoiEmployee> list = new ArrayList<>();
        list.add(new PoiEmployee("admin1","admin1@qq.com",31,"财务部",1,department01));
        list.add(new PoiEmployee("admin2","admin2@qq.com",27,"财务部",2,department01));
        list.add(new PoiEmployee("admin3","admin3@qq.com",25,"IT部",1,department02));
        list.add(new PoiEmployee("admin4","admin4@qq.com",29,"IT部",2,department02));

        //设置工作簿名称和标题
        ExportParams params = new ExportParams();
        params.setSheetName("员工列表");
        params.setTitle("员工信息");

        //使用EasyPoi提供的工具类导出
        Workbook workbook = ExcelExportUtil.exportExcel(params,PoiEmployee.class,list);
        //将数据填充到Excel中
        OutputStream os = new FileOutputStream("员工列表5.xls");
        workbook.write(os);
        os.close();
        workbook.close();
}

集成SpringMVC
EasyPOI是基于POI而封装出来的一套工具包,其中包含了很多方便实用的工具类,包括与SpringMVC 集成的一些类,这些都被称为view,实际就是Controller类(它是加了@Controller注解的):
EasypoiBigExcelExportView 大数据量导出
EasypoiMapExcelView map 列表导出
EasypoiPDFTemplateView pdf导出
EasypoiSingleExcelView 注解导出
EasypoiTemplateExcelView 模板导出
EasypoiTemplateWordView word模板导出
MapGraphExcelView 图表导出
通过打开这些类发现,上面每一个类中都添加了@Controller注解的,所以我们想要用EasyPOI与 SpringMVC集成的话,就必须扫描包 cn.afterturn.easypoi.view

在SpringMVC.xml中进行扫描包

<context:component-scan base-package="cn.afterturn.easypoi.view"/>

导出数据
1、首先在员工列表上添加导出按钮

<a data-method="export" href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'icon-lala'">导出</a>

2、然后给按钮绑定点击事件,必须使用同步请求,发送的请求可以携带参数,进行高级查询

export:function () {
    //GET方式提交请求参数的格式
    location.href = "/employee/exportData?" + $("#searchForm").serialize();
},

3、在Controller中添加导出的方法

    @RequestMapping("/exportData")
    public String exportData(ModelMap map, EmployeeQuery employeeQuery) {
        //查询数据,支持高级查询
        List<Employee> list = employeeService.findAll(employeeQuery);
        //导出参数
        ExportParams params = new ExportParams("员工列表", "员工列表", ExcelType.XSSF);
        //冻结列
        //params.setFreezeCol(2);
        map.put(NormalExcelConstants.DATA_LIST, list);          //数据集合
        map.put(NormalExcelConstants.CLASS, Employee.class);    //导出实体
        map.put(NormalExcelConstants.PARAMS, params);           //导出参数
        map.put(NormalExcelConstants.FILE_NAME, "员工列表");     //文件名称
        return NormalExcelConstants.EASYPOI_EXCEL_VIEW;         //View实体
    }

在springMVC.xml中添加视图解析器
此视图解析器优先级高于原先那个视图解析器,也就是说当Controller中方法返回一个字符串的时候,优先使用这个视图解析器来处理,如果这个处理不了再使用原先配置的那个视图解析器

 <!-- Bean解析器,级别高于默认解析器,寻找bean对象进行二次处理 -->
    <bean id="beanNameViewResolver"
          class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0">
    </bean>

添加文件上传解析器

<!--文件上传解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置上传文件的最大尺寸为10MB -->
        <property name="maxUploadSize" value="10485760" />
    </bean>

在Employee实体类中字段添加@Excel注解
导入数据
1、创建import.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <meta charset="UTF-8">
    <%@include file="/WEB-INF/views/common.jsp"%>

    <script type="text/javascript">
        $(function () {
            $("#btn-submit").click(function () {
                $("#ff")[0].submit();
            })
        });
    </script>
</head>
<body>

<form id="ff" method="post" action="/import/importData" enctype="multipart/form-data">
    <input class="easyui-filebox" style="width: 300px;" name="excelFile"
            data-options="buttonText:'选择文件',prompt:'请选择文件进行导入'"/>
    <a id="btn-submit" href="javascript:void(0)" class="easyui-linkbutton"
       data-options="iconCls:'icon-redo'">导入</a>
</form>
    <span style="color: red">${msg}</span>
</body>
</html>

2、创建importController
excelFile变量名必须与前端表单的name属性保持一致

@Controller
@RequestMapping("/import")
public class importController {
    @Autowired
    private IDepartmentService departmentService;
    @Autowired
    private IEmployeeService employeeService;


    @RequestMapping("/index")
    public String index(){
        return "/employee/import";
    }
    @RequestMapping("/importData")
    public String importData(MultipartFile excelFile, HttpServletRequest request) throws Exception{
		
        System.out.println(excelFile.getOriginalFilename());
        ImportParams params = new ImportParams();
        //标题占1行
        params.setTitleRows(1);
        //表头占1行,从第三行开始提取数据
        params.setHeadRows(1);

        List<Employee> list = ExcelImportUtil.importExcel(excelFile.getInputStream(), Employee.class, params);
        list.forEach(employee -> {
            Department department = departmentService.findByName(employee.getDepartment().getName());
            System.out.println(department);
            employee.setDepartment(department);
            employee.setPassword(MD5Utils.getMD5Password(employee.getUsername()));
            employeeService.save(employee);
        });
        request.setAttribute("msg","导入成功!");
        return "employee/import";
    }
}

注意:EasyPOI会利用反射创建Employee对象,而Employee类中有一个Department类型的成员变量,所以EasyPOI也会去创建此对象,但是此对象为临时状态,所以此时报错
解决方式:
通过查询department表中的name属性,此时查询到的department就是持久状态的对象
导入验证

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值