java 后端及客户端用POI方式导出和下载文件

一、创建文件导出的工具类

package io.renren.modules.generator.WeiXinUtil;

import org.apache.poi.hssf.usermodel.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;

public class exportExcelUtils {

    public static byte[] export(String sheetTitle, String[] title, List<Object> list) {

        HSSFWorkbook wb = new HSSFWorkbook();//创建excel表
        HSSFSheet sheet = wb.createSheet(sheetTitle);
        sheet.setDefaultColumnWidth(20);//设置默认行宽

        //表头样式(加粗,水平居中,垂直居中)
        HSSFCellStyle cellStyle = wb.createCellStyle();
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
        //设置边框样式
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

        HSSFFont fontStyle = wb.createFont();
        fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cellStyle.setFont(fontStyle);

        //标题样式(加粗,垂直居中)
        HSSFCellStyle cellStyle2 = wb.createCellStyle();
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
        cellStyle2.setFont(fontStyle);

        //设置边框样式
        cellStyle2.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
        cellStyle2.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
        cellStyle2.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
        cellStyle2.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

        //字段样式(垂直居中)
        HSSFCellStyle cellStyle3 = wb.createCellStyle();
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中

        //设置边框样式
        cellStyle3.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
        cellStyle3.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
        cellStyle3.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
        cellStyle3.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框

        //创建表头
        HSSFRow row = sheet.createRow(0);
       row.setHeightInPoints(20);//行高

        HSSFCell cell = row.createCell(0);
        cell.setCellValue(sheetTitle);
        cell.setCellStyle(cellStyle);*/

        //创建标题
        HSSFRow rowTitle = sheet.createRow(0);
        rowTitle.setHeightInPoints(20);

        HSSFCell hc;
        for (int i = 0; i < title.length; i++) {
            hc = rowTitle.createCell(i);
            hc.setCellValue(title[i]);
            hc.setCellStyle(cellStyle2);
        }

        byte result[] = null;
        ByteArrayOutputStream out = null;

        try {
            //创建表格数据
            Field[] fields;
            int i =1;
            for (Object obj : list) {
                fields = obj.getClass().getDeclaredFields();
                HSSFRow rowBody = sheet.createRow(i);
                rowBody.setHeightInPoints(20);
                int j = 0;
               // 显示的列是你所要封装的实体类的每个对象,而且顺序是你创建对象的顺序
               for (Field f : fields) {
                    f.setAccessible(true);
                    hc = rowBody.createCell(j);
                    if (f.get(obj) != null ) { 
                       hc.setCellValue(f.get(obj).toString());
                    }else{
                      hc.setCellValue("");
                    }
                    hc.setCellStyle(cellStyle3);
                    j++;
                 }
                i++;
            }

            out = new ByteArrayOutputStream();
            wb.write(out);
            result =  out.toByteArray();
        } catch (Exception ex) {
            throw new RuntimeException("报表导出异常"+ex.getMessage());
        } finally{
            try {
                if(null != out){
                    out.close();
                }
            } catch (IOException ex) {
                throw new RuntimeException("报表导出异常"+ex.getMessage());
            }
        }
        return result;
    }

}

二、业务逻辑层调用

 @Override
    public void checkOutDoorLogExcel(Map<String, Object> params, HttpServletResponse response){
        String filePath=null;
        List<DoorLogEntity> loglist = doorLogDao.selectAll(params);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            String data=sdf.format(new Date());
            //当前用户桌面
            File desktopDir = FileSystemView.getFileSystemView().getHomeDirectory();
            //  获取本地桌面路径
            String desktopPath = desktopDir.getAbsolutePath();
            filePath = desktopPath.replaceAll("\\\\", "\\\\\\\\");

            String sheetTitle = "进出店日志报表"+data;;
            String[] title = {"店铺", "用户昵称", "电话", "进店时间", "离店时间", "在店总时长", "开门信息", "开门结果"};

            filePath = filePath + "\\\\" + sheetTitle + ".xls";
            List<Object> list = new ArrayList<Object>();
            for (int i = 0; i < loglist.size(); i++) {
                DoorLogEntity u = new DoorLogEntity();
                u.setShopname(loglist.get(i).getShopname());
                u.setNickname(loglist.get(i).getNickname());
                u.setPhone(loglist.get(i).getPhone());
                u.setOpendata(loglist.get(i).getOpendata());
                u.setCheckoutdata(loglist.get(i).getCheckoutdata());
                u.setTotaltime(loglist.get(i).getTotaltime());
                u.setMsg(loglist.get(i).getMsg());
                u.setOpenresult(loglist.get(i).getOpenresult());
                list.add(u);
            }
            byte[] b = exportExcelUtils.export(sheetTitle, title, list);
            try {
                File f = new File(filePath);
                if (f.exists()) {
                    f.delete();
                    f.createNewFile();

                     // 使用commons-io-2.0.1.jar下的方法实现文件上传 
                    FileUtils.writeByteArrayToFile(f, b, true);
                } else {
                    f.createNewFile();
                    FileUtils.writeByteArrayToFile(f, b, true);
                }

            /* 此处以上代码是将数据导出到服务器端
            *此处以下代码是实现下载到客户端
            */
                String name= sheetTitle+".xls";
                response.setCharacterEncoding("UTF-8");
                //设置输出文件类型为excel文件
                response.setContentType("application/vnd.ms-excel");
                //通知浏览器下载文件而不是打开
                response.setHeader("Content-Disposition", "attachment;fileName="+java.net.URLEncoder.encode(name, "UTF-8"));
               response.setHeader("Pragma", java.net.URLEncoder.encode(name, "UTF-8"));

                long size = f.length();
                byte[] buffer = new byte[(int)size];
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                OutputStream os = null; //输出流
                try {
                    os = response.getOutputStream();
                    fis = new FileInputStream(f);
                    bis=new BufferedInputStream(fis);
                    int len = 0;
                    while((len = bis.read(buffer)) >-1){
                        os.write(buffer, 0, len);//并不是每次都能读到1024个字节,所有用len作为每次读取数据的长度,否则会出现文件损坏的错误
                    }
                    os.flush();
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException("模板文件读取失败"+e.getMessage());
                }finally {
                    bis.close();
                    fis.close();
                    os.close();
                }
                f.delete();
            } catch (IOException ex) {
                throw new RuntimeException("报表导出异常" + ex.getMessage());
            }

    }

3、controller类

/**
 * 导出进出点日志报表
 */
@RequestMapping("/checkoutlog")
public void checkoutlog(@RequestParam Map<String,Object> params, HttpServletResponse response){
    doorLogService.checkOutDoorLogExcel(params,response);

}

4 所需要导入的工具包

https://download.csdn.net/download/qq_33238562/11266306 

5、在pom.xml中增加依赖

扫描二维码关注公众号,回复: 9857367 查看本文章
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.9</version>
</dependency>

6、vue 下载文件到客户端

 <el-form-item>
        <el-button @click="exportexcel()" type="primary">导出文件</el-button>
      </el-form-item>



// 导出
    exportexcel() {
      this.$http({
        url: this.$http.adornUrl("/generator/doorlog/checkoutlog"),
        method: "get",
 
        // 如果用blob对象来接收,此处一定要设置responseType:'blob',不然会报文件已损坏
        responseType:'blob',  
        params: this.$http.adornParams({
          shopname: this.dataForm.shopname,
          nickname: this.dataForm.nickname,
          phone: this.dataForm.phone,
          userid: this.$store.state.user.id //获取当前登录用户的id ,用户名:this.$store.state.user.name
        })
      })
      .then(function(res) {
          // 将后台返回的数据二进制流转化为base64
          let blob = new Blob([res.data], {type: "application/vnd.ms-excel"}); 
      let objectUrl = URL.createObjectURL(blob); 
      //window.location.href = objectUrl;  
          var alink = document.createElement("a");
          alink.href = objectUrl;
          alink.download = '进出店日志'; //日志名
          alink.click();
        })
    }
  }
发布了46 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_33238562/article/details/95217321