我是靠谱客的博主 着急项链,最近开发中收集的这篇文章主要介绍Java生成文件放入json传至前端下载(以Excel为例),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

功能说明

  • 页面原来存在查询功能,现新增下载功能,将查询出来的数据导出至Excel表格
  • 数据传输格式为json

解决方案

  1. 前端发起下载请求
  2. 后台根据查询条件先查询出数据
  3. 后台将数据生成Excel表格
  4. 将Excel表格转为base64字符串,放入json,传给前端
  5. 前端获取json中的文件字符串,开启下载

关键代码

前端请求及返回处理

导出按钮

<el-button type="success" icon="el-icon-download" @click="downloaddata">导出</el-button>

开启下载方法

methods: {
  downloaddata() {
    // axios发起请求
    this.$axios({
      method: 'post',
      url: '/xxx',
      data: {
        "age": this.UserAge,
        ...
      }
    }).then((res) => {
      // 将base64格式文件转为blob供下载
      function dataURLtoBlob(base64Str) {
        var bstr = atob(base64Str), n = bstr.length, u8arr = new Uint8Array(n);
        while (n--) {
          u8arr[n] = bstr.charCodeAt(n);
        }
        // 这里设置的是excel格式的文件,其他格式见后文
        return new Blob([u8arr], { type: "application/vnd.ms-excel" });
      }
  
      const blob = dataURLtoBlob(res.data.base64file) // 入参为json中的base64编码文件
      const url = window.URL.createObjectURL(blob);
      
      // 开启下载任务
  	  const link = document.createElement('a');
      link.style.display = 'none';
      link.href = url;
      link.download = `xx信息表.xlsx`; // 下载文件名
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    }).catch((error) => {
      console.log(error)
    })     
  } 
}

其他格式举例

 'doc' => 'application/msword',
 'bin' => 'application/octet-stream',
 'exe' => 'application/octet-stream',
 'so' => 'application/octet-stream',
 'dll' => 'application/octet-stream',
 'pdf' => 'application/pdf',
 'ai' => 'application/postscript',
 'xls' => 'application/vnd.ms-excel',
 'ppt' => 'application/vnd.ms-powerpoint',
 'dir' => 'application/x-director',
 'js' => 'application/x-javascript',
 'swf' => 'application/x-shockwave-flash',
 'xhtml' => 'application/xhtml+xml',
 'xht' => 'application/xhtml+xml',
 'zip' => 'application/zip',
 'mid' => 'audio/midi',
 'midi' => 'audio/midi',
 'mp3' => 'audio/mpeg',
 'rm' => 'audio/x-pn-realaudio',
 'rpm' => 'audio/x-pn-realaudio-plugin',
 'wav' => 'audio/x-wav',
 'bmp' => 'image/bmp',
 'gif' => 'image/gif',
 'jpeg' => 'image/jpeg',
 'jpg' => 'image/jpeg',
 'png' => 'image/png',
 'css' => 'text/css',
 'html' => 'text/html',
 'htm' => 'text/html',
 'txt' => 'text/plain',
 'xsl' => 'text/xml',
 'xml' => 'text/xml',
 'mpeg' => 'video/mpeg',
 'mpg' => 'video/mpeg',
 'avi' => 'video/x-msvideo',
 'movie' => 'video/x-sgi-movie',

后台生成Excel并返回

引入java支持excel表操作的依赖

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>4.1.2</version>
  <scope>compile</scope>
</dependency>
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>4.1.2</version>
  <scope>compile</scope>
</dependency>

建立Excel工具类

public class ExcelUtil {

    /**
     * @param sheetName sheet表名
     * @param title 表标题
     * @param values 表内容
     * @param wb excel表文件,可为null
     * @return 返回一张excel表
     */
    public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {

        // 创建一个HSSFWorkbook,对应一个Excel文件
        if (wb == null) {
            wb = new HSSFWorkbook();
        }

        // 在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(sheetName);

        // 在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        HSSFRow row = sheet.createRow(0);

        // 创建单元格,并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式

        // 声明列对象
        HSSFCell cell = null;

        // 创建标题
        for (int i = 0; i < title.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(title[i]);
            cell.setCellStyle(style);
        }

        //创建内容
        for (int i = 0; i < values.length; i++) {
            row = sheet.createRow(i + 1);
            for (int j = 0; j < values[i].length; j++) {
                //将内容按顺序赋给对应的列对象
                row.createCell(j).setCellValue(values[i][j]);
            }
        }
        return wb;
    }
}

生成excel表

String[] title = {"姓名", "年龄", "电话", "住址"};
String sheetName = "sheet1";
String[][] values = new String[list.size()][title.length];
for (int i = 0; i < list.size(); i++) { // list中存放了查询出来的用户数据
  User user = list.get(i);
  values[i][0] = user.getName();
  values[i][1] = user.getAge();
  values[i][2] = user.getPhoneNumber();
  values[i][3] = user.getAddress();
}
HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, values, null);

将表格以base64编码为字符串,然后放入json返回

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
  wb.write(byteArrayOutputStream);
} catch (IOException e) {
  e.printStackTrace();
}
byte[] bytes = byteArrayOutputStream.toByteArray();
String base64file = Base64Utils.encodeToString(bytes);

// 放入json
resultJson.put("base64file", base64file);

最后

以上就是着急项链为你收集整理的Java生成文件放入json传至前端下载(以Excel为例)的全部内容,希望文章能够帮你解决Java生成文件放入json传至前端下载(以Excel为例)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部