尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

vue3-导入导出文件和打印文件

vue3-导入导出文件和打印文件
📅 发布时间:2026/7/15 7:08:48

调用api下载excel文件

export const exportShopTarget = (参数) => request.get(`api链接?查询参数`, { Body请求参数 }, { responseType: 'blob' } )

一定要加上responseType: 'blob'这个参数,否则会显示文件损坏

下载单个文件:

const exportData = async () => { try { const response = await exportShopTarget(参数) const url = window.URL.createObjectURL(new Blob([response.data])) const link = document.createElement('a') link.href = url link.setAttribute( 'download', `目标数据.xlsx` ) // 设置下载文件的名称 document.body.appendChild(link) link.click() // 清理:释放内存中的URL对象 document.body.removeChild(link) window.URL.revokeObjectURL(url) } catch (error) { ElMessage({ message: `导出失败`, type: 'error' }) } }

批量下载压缩文件:

把selectedFileList数组使用encodeURIComponent编码传递

const encodedElements = selectedFileList.value.map((item) => '"' + item + '"') const queryString = encodedElements.join(',') const codeListEncoded = encodeURIComponent('[' + queryString + ']') const response = await downloadFile(codeListEncoded) if (response.status === 200) { const url = window.URL.createObjectURL(new Blob([response.data])) const link = document.createElement('a') link.href = url link.setAttribute('download', '批量下载.zip') document.body.appendChild(link) link.click() document.body.removeChild(link) loading.value = false } else { ElMessage({ message: `文件下载失败,${response.data.msg}`, type: 'error' }) }

读取excel文件里的数据转化为json数组

首先安装xlsx

pnpm install xlsx
import * as XLSX from 'xlsx' const file = fileList.value[0] const reader = new FileReader() reader.onload = async (e) => { const data = new Uint8Array(e.target.result) const workbook = XLSX.read(data, { type: 'array' }) const sheetName = workbook.SheetNames[0] // 获取第一个工作表的名称 const worksheet = workbook.Sheets[sheetName] const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }) // header: 1 表示第一行作为头部信息 console.log(jsonData.splice(1))//获取除去表头的json数据 } reader.readAsArrayBuffer(file)

下载静态excel文件模板

把文件放置在public文件里面的static文件里,文件名要用英文

<el-button type="primary" color="#A88D5B"> <a href="/static/importTemplate.xlsx" download="店铺目标导入模板" style="color: white; text-decoration: none" >下载导入模板 </a> </el-button>

调用api上传文件

import request from '@/utils/request' //文件上传接口 export const fileUpload = (formData) => request.post('接口', formData, { headers: { 'Content-Type': 'multipart/form-data' // 设置 Content-Type 为 multipart/form-data } })
import { fileUpload } from '@/api/file.js' import { ref } from 'vue' const selectedFileList = ref({ fileList: [], codeList: [] }) const uploadFile = (e, code) => { let file = e.target.files[0] // 获取选中的文件 if (file) { selectedFileList.value.fileList.push(file)//文件列表 selectedFileList.value.codeList.push(code)//文件对应的code列表 } e.target.value = '' // 允许重复上传同一个文件 } const submit = () => { if (selectedFileList.value.fileList.length === 0) { ElMessage({ message: '请至少勾选一个要上传的文件', type: 'warning' }) return } ElMessageBox.confirm( `确认上传已勾选的${selectedFileList.value.fileList.length}个文件?`, '温馨提示', { type: 'info', confirmButtonText: '确认', cancelButtonText: '取消', confirmButtonClass: 'ExitConfirmButton', cancelButtonClass: 'ExitCancelButton' } ) .then(async () => { let formData = new FormData() selectedFileList.value.fileList.forEach((fileObj, index) => { formData.append(`files[${index}]`, fileObj) }) selectedFileList.value.codeList.forEach((code, index) => { formData.append(`fileCodes[${index}]`, code) }) const response = await fileUpload(formData) if (response.data.code === 0) { ElMessage({ message: '文件上传成功', type: 'success' }) filterFileList() selectedFileList.value = { fileList: [], codeList: [] } } else { ElMessage({ message: `文件上传失败,${response.data.msg}`, type: 'error' }) } }) .catch(() => { //取消后执行 }) }
<input type="file" @change="(e) => uploadFile(e,文件code)" />

使用formData上传文件的注意点:

1.api接口里要加headers: {
'Content-Type': 'multipart/form-data'
}

2.formData就类似于一个对象,使用api传递时外面就不要包{}了,就变成json类型了

3.formData.append(参数名, 值):参数名要和后端对应上

4.查看是否携带内容,标头有内容长度

打印文件

const printTotal = async () => { const content = printFrame.value.contentWindow.document content.open() content.write(document.getElementById('salesTotal').innerHTML) // 获取并写入内容 content.close() printFrame.value.contentWindow.print() }
<ticketTotal style="zoom: 1.5" id="salesTotal" />

可以打印某个组件里的内容,而不打印全部页面,而且也不影响其他的运行

zoom: 1.5的作用是放大/缩小组件的显示

或者写成:

const getPrintHtml = (elementId) => { const el = document.getElementById(elementId) if (!el) return '' const clone = el.cloneNode(true) clone.removeAttribute('id') clone.style.zoom = '1' clone.style.marginTop = '0' return clone.outerHTML } const printDocument = (elementId) => { const html = getPrintHtml(elementId) if (!html) return const doc = printFrame.value.contentWindow.document doc.open() doc.write(`<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style> @page { size: 80mm auto; margin: 0; } html, body { margin: 0; padding: 0; width: auto; height: auto; } @media print { html, body { height: auto; overflow: visible; } } </style> </head> <body>${html}</body> </html>`) doc.close() printFrame.value.contentWindow.print() } const printTotal = () => printDocument('salesTotal')

style设置的解析:

  • @page { size: 80mm auto; margin: 0; }— 按热敏小票宽度(约 80mm,可根据打印机实际宽度来调整),高度随内容自动伸缩;设置margin: 0会去掉勾选系统自带的页眉和页脚功能
  • margin: 0; padding: 0
    去掉浏览器默认边距,避免四周多出空白。

  • width/height: auto
    让页面宽高跟小票内容走,而不是固定成一整页屏幕高度。

  • @media print里的height: auto+overflow: visible
    只在真正打印时生效:高度仍随内容伸缩,内容不被裁切,方便配合上面的@page { size: 80mm auto }做「纸宽固定、纸高自适应」。

相关新闻

  • ok-ww:鸣潮自动化效率工具终极指南,解放双手的完整解决方案
  • 运算器实验——从74LS181到进位锁存:8位ALU的时序与状态管理实战
  • 蓝牙音频模块与共振喇叭技术:嵌入式音频设备开发指南

最新新闻

  • 基于STM32 DAC与XL6008的数控升压电源实现与精度优化
  • 忻州礼品定制杂粮推荐哪家? - 中媒介
  • 开源项目PicoGUS路线图:未来将支持哪些令人期待的新功能?
  • 深入解析yocto-embedded-tools交叉编译器构建:支持ARM64/ARM32/RISCV64/X86_64架构
  • OC角色情感权重排序:从夯到拉构建深度叙事关系网
  • y=cos(x)/x 在x=0处的垂直渐近线与无穷极限成因

日新闻

  • 告别启动盘残留:用Diskpart彻底清除U盘EFI分区与恢复完整空间
  • 2026 年宜春诚信的塑料缠绕膜厂家哪个好,缠绕膜背后的秘密:你不知道的成本陷阱 - 领域鉴赏官
  • Arch ECS 入门指南:10分钟掌握C#高性能数据驱动架构

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号