javascript下载纯文本、下载Excel,前端解析Excel,下载的Excel无法打开问题解决

js支持下载xml至本地

const downloadContentFile = (filename, text) => {
  const element = document.createElement('a');
  element.setAttribute('href', `data:text/plain;charset=utf-8,${encodeURIComponent(text)}`);
  element.setAttribute('download', filename);
  element.style.display = 'none';
  element.click();
  element.remove();
} ;

js读取后端返回文件流内容

//新建一个fileReader
let reader = new FileReader();
//执行读文件的函数,设置编码格式
reader.readAsText(file, "UTF-8");
//读取文件中的内容
reader.onload = function (e) {
    const content = e.target.result;
}

后端返回Excel文件流(blob),下载excel

由于后端返回的是csv文件(例如模板.csv)Excel文件为csv后缀,所以new Blob([text], { type: "application/vnd.ms-excel" })

  • 读取后端返回的blob文件流信息
const getContentFile = (file) => {
 console.log("file", file);
  //新建一个fileReader
  let reader = new FileReader();
  //执行读文件的函数,设置编码格式
//Excel,需要将文件转为blob或文件流
  reader.readAsArrayBuffer(file, "UTF-8");
  //读取文件中的内容
  reader.onload = function (e) {
    const content = e.target.result;
    console.log("content", content);
    downloadContentFile(file.name, content);
  };
};
  • 将文件内容生成URL放置标签a中下载
 const downloadContentFile = (filename, text) => {
  let blob = new Blob([text], { type: "application/vnd.ms-excel" });
  const element = document.createElement("a");
 const href = URL.createObjectURL(blob);
  element.href = href;
  element.setAttribute("download", filename);
  element.style.display = "none";
  element.click();
  //调用这个方法来让浏览器知道不用在内存中继续保留对这个文件的引用了。
  URL.revokeObjectURL(href);
  element.remove();
};

在这里插入图片描述

下载Excel遇到的问题

  • 前端下载Excel无法打开
    可以看到后端返回的Excel类型
    在这里插入图片描述

后端返回Excel文件(blob)的借口

export const downloadTemplate = () => {
  return instance({
    method: "GET",
    url: "/api/common/template",
    responseEncoding: "utf8"
  });
};

可以看到返回的数据一串乱码
在这里插入图片描述

在这里插入图片描述

解决:请求时添加·responseType: "blob"


export const downloadTemplate = () => {
  return instance({
    method: "GET",
    url: "/api/basic/temp",
    responseType: "blob",
    responseEncoding: "utf8"
  });
};

可以看到返回的数据时blob
在这里插入图片描述

前端上传Excel文件解析内容展示到table中

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

安装依赖

npm install xlsx
XLSX.utils.sheet_to_json(workbook.Sheets[sheet])
sheet_to_json<T>(worksheet: WorkSheet, opts?: Sheet2JSONOpts): T[];
export interface Sheet2JSONOpts extends DateNFOption {
    /** Output format */
    header?: "A"|number|string[];

    /** Override worksheet range */
    range?: any;

    /** Include or omit blank lines in the output */
    blankrows?: boolean;

    /** Default value for null/undefined values */
    defval?: any;

    /** if true, return raw data; if false, return formatted text */
    raw?: boolean;

    /** if true, skip hidden rows and columns */
    skipHidden?: boolean;

    /** if true, return raw numbers; if false, return formatted numbers */
    rawNumbers?: boolean;
}

解析xlsx文件封装函数,带入参数

const excelColumn = [
  "A",
  "B",
  "C",
  "D",
  "E",
  "F",
  "G",
  "H",
  "I",
  "J",
  "K",
  "L",
  "M",
  "N",
  "O",
  "P",
  "Q",
];
let XLSX = require("xlsx");

export const readfileByExcel = async (file) => {
  return new Promise((resolve, reject) => {
    let fileReader = new FileReader();
    fileReader.onload = function (event) {
      let workbook;
      let result = []; // 存储获取到的数据
      try {
        let data = event.target.result;
        workbook = XLSX.read(data, {
          type: "binary", // 以二进制流方式读取得到整份excel表格对象
        });
      } catch (e) {
        reject(e);
        return;
      }
      const sheet2JSONOpts = {
        header: excelColumn,
        defval: "",
      };

      // 遍历每张表读取
      for (let sheet in workbook.Sheets) {
        if (workbook.Sheets.hasOwnProperty(sheet)) {
          result = result.concat(
            XLSX.utils.sheet_to_json(workbook.Sheets[sheet], sheet2JSONOpts)
          );
          break; // 如果只取第一张表,就取消注释这行
        }
      }
      resolve(result);
    };

    // 以二进制方式打开文件
    fileReader.readAsBinaryString(file);
  });
};
const sheet2JSONOpts = {
  header: excelColumn,
  defval: "",
};

可以看出返回的结果

  • 每一行一个数组元素返回,第一行表头也会返回
  • 数组的索引为指定传入的参数,value值为单元格内容

在这里插入图片描述

注明(此处无关紧要):数组最后一个元素都是空值,是因为导入的excel表里面最后一行有元素,但是是空值,后面默认情况下那样空值一行是因为改例子把模板的最后一行删除了

默认

for (let sheet in workbook.Sheets) {
 if (workbook.Sheets.hasOwnProperty(sheet)) {
   result = result.concat(
     XLSX.utils.sheet_to_json(workbook.Sheets[sheet])
   );
   break; // 如果只取第一张表,就取消注释这行
 }
}

可以看出结果

  • 每一行一个数组元素返回,第一行表头不会返回
  • 数组的索引为表头单元格内容,value值为单元格内容
    在这里插入图片描述

前端实现将一个字符串在浏览器中预览并且下载至本地log.txt

前端将字符串内容下载至本地

export const downloadContentFile = (filename, text) => {
  const element = document.createElement('a');
  element.setAttribute('href', `data:text/plain;charset=utf-8,${encodeURIComponent(text)}`);
  element.setAttribute('download', filename);
  element.style.display = 'none';
  element.click();
  element.remove();
} ;

前端支持将字符串文本内容生成URL在浏览器中预览

//假设,与后文截图无关
const context = “\n hello world \n this is pencil”
const url =  URL.createObjectURL(new Blob([context], { type: 'text/plain }));
window.open(url);

在这里插入图片描述
可以看到,在浏览中打开,中文符号会乱码

解决在浏览器中打开中文符号乱码问题

const url =  URL.createObjectURL(new Blob([context], { type: 'application/json;charset=UTF-8' }));
window.open(url);

或者

const url =  URL.createObjectURL(new Blob([item?.shellLog], { type: 'text/plain;charset=UTF-8' }));
window.open(url);

在这里插入图片描述

后端返回URL,前端点击下载

同源

 function download(url, filename){
      const elelink = document.createElement("a");
      elelink.style.display = 'none';
      elelink.target = '_blank';
      elelink.href = url;
      elelink.download = filename;
      document.body.appendChild(elelink);
      elelink.click();
      document.body.removeChild(elelink);
 }

直接将url赋值

window.location.href= url;

使用href 的下载地址 和 当前网站地址 必须是 同源的,否则download不生效。

不同源

export const downloadUrl = (url, filename) => {
  const x = new window.XMLHttpRequest();
  x.open('GET', url, true);
  x.responseType = 'blob';
  x.onload = () => {
    const url = window.URL.createObjectURL(x.response);
    const a = document.createElement('a');
    a.href = url;
    a.download = filename;
    a.click();
  };
  x.send();
};
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在前端 Vue 中实现下载 Excel,你可以使用第三方库如 `xlsx` 或者 `file-saver`。其中,`xlsx` 库用于生成 Excel 文件,而 `file-saver` 库则用于将生成的文件保存到本地。 以下是一个简单的示例: 1. 首先,安装库: ```bash npm install xlsx file-saver --save ``` 2. 在 Vue 组件中导入库: ```javascript import XLSX from 'xlsx'; import FileSaver from 'file-saver'; ``` 3. 在组件中定义一个方法来生成并下载 Excel 文件: ```javascript methods: { downloadExcel() { //创建一个工作簿 const wb = XLSX.utils.book_new(); //创建一个工作表 const ws = XLSX.utils.json_to_sheet([{ name: 'John', age: 28 },{ name: 'Jane', age: 32 }]); //将工作表添加到工作簿中 XLSX.utils.book_append_sheet(wb, ws, 'Sheet1'); //将工作簿转换成二进制数据 const wbout = XLSX.write(wb, { bookType: 'xlsx', type: 'binary' }); //将二进制数据转换成Blob对象 const blob = new Blob([s2ab(wbout)], { type: 'application/octet-stream' }); //使用file-saver库将文件保存到本地 FileSaver.saveAs(blob, 'example.xlsx'); } } ``` 4. 在模板中添加一个下载按钮,并绑定上述方法: ```html <template> <button @click="downloadExcel">下载Excel文件</button> </template> ``` 注意,上述代码中的 `s2ab` 是一个辅助函数,用于将字符串转换成二进制数组: ```javascript function s2ab(s) { const buf = new ArrayBuffer(s.length); const view = new Uint8Array(buf); for (let i = 0; i < s.length; i++) { view[i] = s.charCodeAt(i) & 0xFF; } return buf; } ``` 这样,当用户点击下载按钮时,就会生成并下载一个名为 `example.xlsx` 的 Excel 文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值