首页 > 技术文章 > EasyUi通过POI 实现导出xls表格功能

sjzxs 2018-08-07 17:31 原文

  Spring +EasyUi+Spring Jpa(持久层)

EasyUi通过POI 实现导出xls表格功能

  EasyUi界面:

  

  点击导出按钮实现数据导入到xls表格中

  第一步:修改按钮事件:

@Controller
@ParentPackage("struts-default")
@Namespace("/")
@Scope("prototype")
public class SubAreaAction extends ActionSupport implements ModelDriven<Subarea>

  //注入service层

  @Resource
      private SubAreaservice subareaservice;    

  //导出按钮绑定的事件
            function doExport() {

    //实现访问action的有三种方式:form表单提交、js中调用submit方法、location.href。
                location.href="${pageContext.request.contextPath}/subArea_Export.action"
            }

第二步:在action中提供方法:

    
    @Action(value = "subArea_Export")
    public String subAreaExport() throws IOException {
        // 查询所有的数据
        List<SubArea> list = subareaservice.findSubArea();
        if (list != null && list.size() > 0) {
          //2.创建空的excel文件,在sheet页中设置标题行
          //2.1使用workbook创建空excel
            HSSFWorkbook wb = new HSSFWorkbook();

     //2.2在excel中创建空sheet
            HSSFSheet cs = wb.createSheet();
           //2.3在sheet中创建标题行
            HSSFRow row = cs.createRow(0);

          //2.4在标题行创建单元格,赋值
            row.createCell(0).setCellValue("分区编号");
            row.createCell(1).setCellValue("分区地址");
            row.createCell(2).setCellValue("分区关键字");
            row.createCell(3).setCellValue("分区辅助关键字");
            row.createCell(4).setCellValue("区域编号");
            int index = 1;

  //3.循环分区数据,将数据填充到excel中
            for (SubArea subarea : list) {

      //创建新行
                HSSFRow row1 = cs.createRow(index++);

      //创建新单元格,赋值
                row1.createCell(0).setCellValue(subarea.getId());
                row1.createCell(1).setCellValue(subarea.getAddress());
                row1.createCell(2).setCellValue(subarea.getKeyWords());
                row1.createCell(3).setCellValue(subarea.getAssistKeyWords());

  
                if (subarea.getFixedArea() != null) {
                    row1.createCell(4).setCellValue(subarea.getFixedArea().getId());
                } else {
                    row1.createCell(4).setCellValue("信息未初始化");
                }
            }
           //4.设置文件下载响应参数:文件名、一个流两个头
            String filename = "ceshi.xls";

    //获取浏览器类型
            String header = ServletActionContext.getRequest().getHeader("User-Agent");
            
            String mimeType = ServletActionContext.getServletContext().getMimeType(filename);
            filename = FileUtils.encodeDownloadFilename(filename, header);
           //一个流:response的输出流
            ServletOutputStream os = ServletActionContext.getResponse().getOutputStream();
            //两个头之一:content-type,告诉浏览器返回的数据格式
            ServletActionContext.getResponse().setContentType(mimeType);

    //两个头之二:content-disposition,告诉浏览器打开数据的方式,下载方式打开:attachment;filename=【文件名】
            ServletActionContext.getResponse().setHeader("content-disposition", "attachment;filename=" + filename);

           //5.使用response将文件返回到前台
            wb.write(os);
        }
        return NONE;
    }

第三步:通过controller层调用service层

@Service
@Transactional
public class SubAreaserviceimp implements SubAreaservice {

  @Override
    public List<SubArea> findSubArea() {
        // TODO Auto-generated method stub
        return subareadao.findAll();
    }

}

由于此测试持久层用到JPA所以不能处理持久层的代码了。

直接测试。

测试结果如图:

 

推荐阅读