spring企业开发-页面导出excel表格-第四篇

对于常用的管理系统,导出Excel是很常见的功能。

导出表格需要根据当前查询数据进行导出,那么现在就开始干。我这里使用的springMVC。

第一步:Web端页面添加导出按钮

<form action="exportIllegalDevice" method="post" id="illegalDevice">
    <input type="submit" name="export" class="btn btn-primary" id="exportButton" value="导出"/>
</form>

第二步:编写控制层接收请求

这里需要注意的是导出表格使用封装好的POI,所以在Maven项目中添加依赖:

        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.9</version>
        </dependency>

继续写代码:

    @RequestMapping("exportIllegalDevice")
    @ResponseBody
    public void exportList(HttpServletRequest request, HttpServletResponse response)throws Exception{
        String fileName = "设备列表";
        response.reset();
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(),"iso-8859-1"));
        HSSFWorkbook wb = new HSSFWorkbook();
        ServletOutputStream out=response.getOutputStream();
        wb.write(out);
        out.flush();
        out.close();
    }

先不论别的,此时在浏览器就已经可以下载一个空文件了。

这是需要我们做的就是装填数据啦!

第三步:根据业务装填数据

刚才在控制层我们只需要将

HSSFWorkbook wb = new HSSFWorkbook();

这句代码中HSSFWorkbook的对象从业务层中获取,而不是简单的new一个空对象。

业务层中装填代码为:

public HSSFWorkbook getExcelWorkBook() {
        //获取导出列表数据
        List<IllegalDevice> illegalDeviceList = illegalDeviceMapper.findByParam(new IllegalDevice());
        HSSFWorkbook hssf = ExcelUtil.exportIllgalDevice(illegalDeviceList);
        return hssf;
    }
illegalDeviceList对象是你要从数据库中导出的数据List集合

hssf对象则是生成的表格对象,看一下具体实现:

public static HSSFWorkbook exportIllgalDevice(List<IllegalDevice> list){
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("IllegalDevice");
        HSSFRow row;
        HSSFCell cell;
        //全局样式(可以影响所有的样式,就是在定义sheet的时候添加的默认样式)
        sheet.setDefaultColumnWidth(18);//设置单元格默认宽度为17
        sheet.setDefaultRowHeight((short)300);//设置行高度默认300
        //sheet.setColumnWidth(2, 22 * 512);  //设置列宽,20个字符宽

        HSSFCellStyle style = wb.createCellStyle();
        style.setWrapText(true);//设置自动换行
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//字体水平居中
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//字体垂直居中

        //设置字体样式(需要用style.setFont(font);装填进去),如果标题等想用不同样式,新建font对象,然后在下面判断添加不同样式
        HSSFFont font = wb.createFont();
        //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗
        font.setFontHeightInPoints((short)12);//设置字号
        font.setFontName("Times New Roman");//设置字体类型Times New Roman
        style.setFont(font);

        //将List集合数据装填到二维数组中
        String[][] datas = dataFilling(list);

        //进行表格行和单元格创建
        for (int i = 0; i < datas.length; i++) {
            row = sheet.createRow(i);// 创建表格行(都是从0开始代表第一行)
            if(i==0){//设置第一行行高
                row.setHeight((short)700);
            }
            for (int j = 0; j < datas[i].length; j++) {//在该行创建单元格
                cell = row.createCell(j);// 根据表格行创建单元格
                cell.setCellValue(String.valueOf(datas[i][j]));
                cell.setCellStyle(style);
            }
        }

        return wb;
    }

没错里面将Excel创建行以及单元格以及部分表格样式都进行了相关设置,而填充数据使用了二维数组。

这里的datas二维数组填充数据方法如下:

public static String[][] dataFilling(List<IllegalDevice> list){
        String[] firstTileArr = IllegalDeviceExcelTitle.titleArray();
        String[][] dataTwoArray = new String[list.size()+1][firstTileArr.length];
        //先装填第一行题头
        for (int i = 0; i < firstTileArr.length; i++) {
            dataTwoArray[0][i] = firstTileArr[i];
        }
        //装填剩余部分
        for (int i = 0; i < list.size(); i++) {
            IllegalDevice ill = list.get(i);
            dataTwoArray[i+1][0] = String.valueOf(i+1);
            dataTwoArray[i+1][1] = ill.getId_Ip();
            dataTwoArray[i+1][2] = ill.getId_Type();
            dataTwoArray[i+1][3] = ill.getId_Mac();
            dataTwoArray[i+1][4] = ill.getId_DeviceType();
            dataTwoArray[i+1][5] = ill.getId_HostName();
            dataTwoArray[i+1][6] = ill.getId_Date().toString();
            dataTwoArray[i+1][7] = ill.getId_Remark();
            dataTwoArray[i+1][8] = ill.getId_DeviceSystem();
            dataTwoArray[i+1][9] = ill.getId_Description();
            dataTwoArray[i+1][10] = ill.getId_PnpDeviceId();
            dataTwoArray[i+1][11] = ill.getId_Vendorid();
            dataTwoArray[i+1][12] = ill.getId_Productid();
            dataTwoArray[i+1][13] = ill.getId_ClassGuid();
        }
        return dataTwoArray;
    }

二维数组第一个维度代表第几行,第二个维度代表列。例如datas[2][3]:代表了第三行第四列的那个单元格。

总结:

Web项目中导出excel作为常用功能,实现的主要思想是前端使用请求,后端将文件作为流传输到前端。有时因为一些前端框架可能会导致导出的信息直接展示在页面。而不是导出文件,因此遇到问题还需要实际解决。同时文件名称乱码问题也是需要注意。最好使用英文名,奈何有时必须中文,测试一下除了window10自带的那个浏览器使用这套代码乱码,其他浏览器没问题。懒得调试,如果有人有能够解决该问题更好的方法,留言告知不胜感激!!!

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值