PC端常用的文件导出的方法(ts版)

记录下以往搜集到的几个常用的操作文件的方法,包含表格、文件、图片的导出

npm install xlsx --save --registry=https://registry.npmmirror.com --legacy-peer-deps
import * as XLSX from 'xlsx'
/**
 * 导出
 * @param blob 导出
 * @param fileName 下载文件名
 */
const download = (blob: Blob, fileName: string = 'fileName') => {
  const url = URL.createObjectURL(blob)
  const link = document.createElement('a')
  link.href = url
  link.setAttribute('download', fileName)
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
  URL.revokeObjectURL(url)
}
/**
 * 导出文件
 * @param buffer
 * @param fileName 下载文件名
 */
export const downloadFile = (buffer: any, fileName?: string) => {
  const blob = new Blob([buffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
  download(blob, fileName)
}
/**
 * 导出选择的数据
 * @param selectedData 选择的数据
 * @param fileName 下载文件名
 */
export const exportSelectedData = (selectedData: any, fileName?: string) => {
  const worksheet = XLSX.utils.json_to_sheet(selectedData)
  const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] }
  // 客户端浏览器环境下直接生成Excel文件并提示保存
  const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' })
  downloadFile(excelBuffer, fileName)
}
/**
 * 根据表格id导出excel
 * @param el 表格id
 * @param fileName 下载文件名
 */
export const exportExcelByEl = (el: string, fileName?: string) => {
  // 转换成excel时,使用原始的格式
  const xlsxParam = { raw: true }
  const fix = document.querySelector('.el-table__fixed')
  let workbook
  if (fix) {
    workbook = XLSX.utils.table_to_book(document.querySelector(el)?.appendChild(fix), xlsxParam)
    document.querySelector(el)?.appendChild(fix)
  } else {
    workbook = XLSX.utils.table_to_book(document.querySelector(el), { raw: true })
  }
  const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', bookSST: true, type: 'array' })
  downloadFile(excelBuffer, fileName)
}
/**
 * 导出图片
 * @param url 远程图片地址
 * @param fileName 下载文件名
 */
export const downloadImgByUrl = (url: string, fileName?: string) => {
  const canvas = document.createElement('canvas')
  const img = document.createElement('img')
  // 解决跨域 Canvas 污染问题
  img.setAttribute('crossOrigin', 'Anonymous')
  //将资源链接赋值过去,才能触发img.onload事件
  img.src = url
  img.onload = function (e) {
    canvas.width = img.width
    canvas.height = img.height
    const context = canvas.getContext('2d', { alpha: false })
    if (!context) throw '无法创建canvas画布,下载失败'
    //绘制图片
    context.drawImage(img, 0, 0, img.width, img.height)
    canvas.toBlob((blob) => {
      if (blob) download(blob, fileName)
    })
  }
}
/**
 * 二进制流转base64
 * @param data 二进制流
 * @returns base64
 */
export function binaryToBase64V1 (data:any) {
  const binaryData = new Blob([data])
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.onloadend = () => {
      // readAsDataURL 按照字符串处理,此处忽略ts检查
      // @ts-ignore
      const base64String = reader.result?.split(',')[1]
      resolve(base64String)
    };
    reader.onerror = reject
    // 开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL 格式的 Base64 字符串以表示所读取文件的内容。
    reader.readAsDataURL(binaryData)
  })
}
/**
 * 二进制流转base64
 * @param data 二进制流
 * @returns base64
 */
export function binaryToBase64V2 (data:any) {
  const binaryData = new Blob([data])
  return new Promise((resolve, reject) => {
    const reader = new FileReader()
    reader.onloadend = () => {
      // readAsArrayBuffer 按照 ArrayBuffer 处理,此处忽略ts检查
      // @ts-ignore
      const base64String = base64Encode(reader.result)
      resolve(base64String)
    };
    reader.onerror = reject
    // 开始读取指定的 Blob中的内容,一旦完成,result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象。
    reader.readAsArrayBuffer(binaryData)
  })
}
/**
 * 使用TextEncoder将ArrayBuffer转换为字符串,再使用btoa函数将字符串转换为Base64
 * @param arrayBuffer
 * @returns string
 */
function base64Encode (arrayBuffer:ArrayBuffer): string {
  const uint8Array = new Uint8Array(arrayBuffer)
  let binaryString = '';
  for (let i = 0; i < uint8Array.length; i++) {
    binaryString += String.fromCharCode(uint8Array[i]);
  }
  return btoa(binaryString);
}

其中 exportExcelByEl 根据 DOM导出的,依赖于 element-plus 

js版本可自行改造下。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TypeScript中,可以使用interface关键字来定义接口,并且可以通过export关键字将接口导出导出接口的方式有两种,一种是直接在定义接口的同时使用export关键字导出,例如: export interface Config { name: string; } 另一种方式是先定义接口,然后在另一个文件中使用export default关键字导出接口,例如: interface Config { name: string; } export default Config; 这样就可以在其他文件中使用import语句导入并使用该接口了。需要注意的是,interface支持同时声明和默认导出,而type不支持。 值得一提的是,interface和type alias在继承方式上也有区别。interface使用extends关键字来进行扩展,例如: interface Animal { name: string; } interface Bear extends Animal { honey: boolean; } 而type alias使用&操作符来进行扩展,例如: type Animal = { name: string; } type Bear = Animal & { honey: boolean; } 这就是在TypeScript中使用interface导出的方式。希望能对你有所帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [TS中的interface与type的区别](https://blog.csdn.net/yhl521112/article/details/124836325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [ts -type alias 和interface的区别](https://blog.csdn.net/weixin_28750673/article/details/124841143)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [json-to-ts-interface:json字符串自动转换为TypeScript interface定义](https://download.csdn.net/download/weixin_42116701/19195334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值