下载

要在Vue前端实现对文档流下载功能,可以通过以下几种方法:

1、使用a标签和Blob对象进行文件下载,2、利用第三方库如FileSaver.js。下面详细介绍这几种方法的具体实现步骤及其原理。

一、通过Axios获取文件并下载,使用a标签和Blob对象进行文件下载

这种方法适用于从服务器端获取文件并下载的场景,特别是当文件是通过API接口返回的。

  1. 使用Axios获取文件数据:

    Axios是一个基于Promise的HTTP客户端,可以方便地进行AJAX请求。我们可以通过Axios获取文件数据,并将其转换为Blob对象。

  2. 下载文件:

    获取到文件数据后,同样可以使用a标签和Blob对象的组合进行文件下载。

import axios from 'axios';


//下载时,添加加载中的效果
  const downloadLoadingInstance = ElLoading.service({
    text: "正在下载数据,请稍候",
    background: "rgba(0, 0, 0, 0.7)",
  })
axios({
    method: 'get',
    url: 'https://example.com/file', // 替换为你的文件URL
    responseType: 'blob'

}).then(response => {
  // 创建Blob对象,这段代码创建了一个默认的Blob对象,没有指定字符编码。因此,它使用浏览器默认的字符编码(通常是UTF-8)
  const url = window.URL.createObjectURL(new Blob([data]));
  // 创建隐藏的a标签
  const a = document.createElement('a');
 //将这个<a>元素的href属性设置为前面创建的Blob对象的URL
  a.href = url;
  a.download = filename; // 替换为你的文件名,例:`${params.service + "-" + new Date().getTime()}.xlsx`
//将a标签添加到文档中 document.body.appendChild(a); // 触发下载 a.click(); //清理工作 document.body.removeChild(a);//从文档中移除这个<a>元素,以保持DOM的整洁 window.URL.revokeObjectURL(url); // 释放之前创建的Blob URL,以节省内存资源 downloadLoadingInstance.close();//下载完成关闭加载中效果 }).catch(error => { console.error('文件下载失败', error); });

 

二、利用第三方库如FileSaver.js

FileSaver.js是一个专门用于文件保存的库,简化了Blob对象文件下载的过程。它提供了一个saveAs方法,可以直接将Blob对象保存为文件。

    1. 安装FileSaver.js:

      可以通过npm或yarn安装FileSaver.js。

npm install file-saver
    1. 使用FileSaver.js进行文件下载:

      通过FileSaver.js的saveAs方法,可以轻松实现文件下载。

示例代码:

import { saveAs } from 'file-saver';
// 创建Blob对象
const data = new Blob(['Hello, world!'], { type: 'text/plain' });//Blob 包含的是纯文本数据。
// 使用FileSaver.js保存文件
saveAs(data, 'example.txt');

 

要在Vue3前端现对获取的文本数据下载功能,可以通过以下几种方法:

1、使用名为 SheetJS 的 JavaScript 库下面详细介绍这几种方法的具体实现步骤及其原理。

一、前端对获取的文本数据进行下载

1.使用名为 SheetJS 的 JavaScript 库,将一个 JSON 数据转换为 Excel 文件,设置单元格的格式和列宽,然后生成并下载该文件

  let downData = []
  //good数组为要下载的表格数据,但是最终要的格式有所改变,需要处理:
  good.value.forEach(item => {
    let res = [];
    console.log('item',item)
    console.log('item.channelNo',item.circle)
    console.log('item.mode',item.mode)
    console.log('item.BitRate',item.BitRate)
    let arr = []
    arr.push(item.no1) //第一列数据
    arr.push(item.satelliteCode)
    downData.push(arr)
  })
  //宽度
  const options = {
    '!cols': [
      {wpx: 134},
      {wpx: 134},
    ]
  };
  const exportData = downData.map(item => {
    return {
      '名称1': item[0],
      '名称2': item[1],
    }
  })
// 创建 Workbook 对象
  const workbook = XLSX.utils.book_new();
// 创建 Worksheet 对象
  const worksheet = XLSX.utils.json_to_sheet(exportData);

  for (const key in worksheet) {
    if (worksheet[key] instanceof Object) {
      if (worksheet[key].v) {
        worksheet[key].t = 's'
      }
      worksheet[key].s = {
        alignment: {
          vertical: 'center',
          horizontal: 'left',
          indent: 0,
        }
      }
    }
  }
  worksheet['!cols'] = options['!cols']
// 将 Worksheet 添加到 Workbook 中,moment()是获取当前时间
  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
  const tail = '-' + moment()
// 生成 Excel 文件并下载

  XLSX.writeFile(workbook, `下载文件名${tail}.xlsx`);

  

 

附:点击按钮,下载echarts为HTML格式

//写页面组件

<el-button type="primary" @click="saveAsHtml(chartId)">保存为HTML
<div :id="chartId" style=" width: 100%;height: 100%;">
</div>

//定义变量

const chartId = ref(''); 
let htmlaa = ref({})
//引入echarts 
import * as echarts from "echarts";

//编写方法

const saveAsHtml = (chartId) => {
let s = {}
getHtml(item)
proxy.$modal.msgWarning('请稍候,正在下载中.....');
setTimeout(() => {
console.log('htmlaa.value', htmlaa.value)
s = writer(${chartId}.html, htmlaa.value, 'utf-8');//(文件名,内容,编码)
}, 1000)
return s
};
function getHtml(item) {
let params = {
stationId: props.planInfo.stationId,
startTime: startTime.value,
endTime: endTime.value,
deviceId: item.deviceId,
paramId: item.paramId
}
let chartData1 = {}
console.log('params', params)
getlistAll(params).then(res => {
if (res.code === 200) {
//获取图表信息,这里和上面可能对不太上,因为我上面用的遍历画图,这里用接口获取图表数据
chartValue = res.data;
nextTick(() => {
// 把配置和数据放这里,处理数据
let option = initOption(item.chartId);
nextTick(() => {
// 获取图表数据,由于数据最终要放到HTML中,将对象转成JSON格式
chartData1 = JSON.stringify(option);
console.log(option, "option")
console.log(chartData1, "chartData1")
//最终的HTML,想什么样自己写,body里放模板组件和处理数据方法即可
htmlaa.value = `          </div>
                <script type="text/javascript" src="https://registry.npmmirror.com/echarts/5.5.1/files/dist/echarts.min.js"><\/script>
                 <script type="text/javascript">
                   const dom = document.getElementById('${item.chartId}');

                   console.log(dom,"dom")

                   const myChart = echarts.init(dom, null, {
                      renderer: 'svg',
                      useDirtyRect: false
                    });
                    // if (option && typeof option === 'object') {
                    //
                    // }

                     myChart.setOption(${chartData1});
                     window.addEventListener('resize', myChart.resize);
                 <\/script>
              </body>
            </html>`
    })
  })
}
})
}

function writer(fileName, content, option) {
var a = document.createElement('a');
var url = window.URL.createObjectURL(new Blob([content],
{type: (option.type || "text/plain") + ";charset=" + (option.encoding || 'utf-8')}));
a.href = url;
a.download = fileName || 'file';
a.click();
window.URL.revokeObjectURL(url);
}

  参考文章:https://worktile.com/kb/p/3639751

posted @ 2024-08-29 10:55  没心没肺没人性  阅读(41)  评论(0)    收藏  举报