前端实现将数据(含文字、图片)导出到Excel中

安装exceljs

创建工作簿

import ExcelJS from 'exceljs'

// 创建工作簿
  const workbook = new ExcelJS.Workbook()

添加工作表

// 添加工作表
  const worksheet = workbook.addWorksheet('sheet1')

在工作表中设置列

const columns = ref([
  {
    title: 'name',
    dataIndex: 'name',
    width: 200
  },
  {
    title: 'color',
    dataIndex: 'color',
    width: 100
  },
  {
    title: 'img',
    dataIndex: 'img'
  }
])
// 在工作表中,设置列
  worksheet.columns = columns.value.map((item) => {
    const { title, dataIndex, width } = item
    return {
      header: title,
      key: dataIndex,
      width: width ? width/10 : 40
    }
  })

在工作表中添加行

const dataSource = ref([
  {
    name: '玫瑰花',
    color: '红色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  },
  {
    name: '菊花',
    color: '黄色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  },
  {
    name: '牡丹花',
    color: '紫色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  },
  {
    name: '梅花',
    color: '白色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  },
  {
    name: '桃花花',
    color: '粉色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  }
])

// 在工作表中,添加行数据
  const data = JSON.parse(JSON.stringify(dataSource.value)).map((item) => {
    item.img = ''
    return item
  })

  worksheet.addRows(data)
  let wbImg: any = []
  for (const item of dataSource.value) {
    const { img, name } = item
    const index = dataSource.value.findIndex((item) => item.name === name)
    // 将图片转换为base64, 并在工作簿中添加图片
    console.log(img);
    
    const base64str = await urlToBase64(img)
    wbImg[index] = workbook.addImage({
      base64: base64str,
      extension: 'png'
    })

    // 将图片添加到工作表中
    worksheet.addImage(wbImg[index], {
      tl: { col: 2, row: index + 1},
      ext: { width: 200, height: 200}
    })

    // 设置行高
    const row = worksheet.getRow(index + 2)
    row.height = 150
  }

const urlToBase64 = (url: string) => {
  return new Promise((resolve, reject) => {
    let image = new Image()
    image.onload = () => {
      let canvas = document.createElement('canvas')
      canvas.width = 500
      canvas.height = 500
      // 将图片插入画布并开始绘制
      canvas.getContext('2d').drawImage(image, 0, 0)
      let result = canvas.toDataURL('image/png')
      resolve(result)
    }
    // CORS 策略,会存在跨域问题https://stackoverflow.com/questions/20424279/canvas-todataurl-securityerror
    image.setAttribute('crossOrigin', 'Anonymous')
    image.src = url
    image.onerror = () => {
      reject(new Error('urlToBase64 error'))
    }
  })
}

写入 buffer, 并下载excel文件

// 写入buffer
  const buffer = await workbook.xlsx.writeBuffer()
  download(buffer, '我的工作簿.xlsx')

// 通过blob的方式进行下载
const download = (_blob: any, filename: any) => {
  const blob = new Blob([_blob])
  const downloadElement = document.createElement('a')
  downloadElement.style.display = 'none'
  const href = window.URL.createObjectURL(blob) // 创建下载的链接
  downloadElement.href = href
  downloadElement.download = filename // 下载后文件名
  document.body.appendChild(downloadElement)
  downloadElement.click() // 点击下载
  document.body.removeChild(downloadElement) // 下载完成移除元素
  window.URL.revokeObjectURL(href) // 释放掉blob对象
}

附上所有代码

<template>
  <a-button type="primary" @click="onClick" class="w-200px">导出为EXCEL</a-button>
  <a-table
    :columns="columns"
    :data-source="dataSource"
    :pagination="false"
    bordered
  >
    <template #bodyCell="{ column, text}">
      <template v-if="column.dataIndex === 'img'">
        <a-image :width="50" :height="50" :src="text" />
      </template>
    </template>
  </a-table>
</template>

<script setup lang="ts">
import ExcelJS from 'exceljs'

const columns = ref([
  {
    title: 'name',
    dataIndex: 'name',
    width: 200
  },
  {
    title: 'color',
    dataIndex: 'color',
    width: 100
  },
  {
    title: 'img',
    dataIndex: 'img'
  }
])

const dataSource = ref([
  {
    name: '玫瑰花',
    color: '红色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  },
  {
    name: '菊花',
    color: '黄色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  },
  {
    name: '牡丹花',
    color: '紫色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  },
  {
    name: '梅花',
    color: '白色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  },
  {
    name: '桃花花',
    color: '粉色',
    img: 'https://img2.baidu.com/it/u=4020335929,583313623&fm=253&fmt=auto&app=138&f=JPEG?w=512&h=384'
  }
])

const onClick = async() => {

  // 创建工作簿
  const workbook = new ExcelJS.Workbook()

  // 添加工作表
  const worksheet = workbook.addWorksheet('sheet1')

  // 在工作表中,设置列
  worksheet.columns = columns.value.map((item) => {
    const { title, dataIndex, width } = item
    return {
      header: title,
      key: dataIndex,
      width: width ? width/10 : 40
    }
  })
  
  // 在工作表中,添加行数据
  const data = JSON.parse(JSON.stringify(dataSource.value)).map((item) => {
    item.img = ''
    return item
  })

  worksheet.addRows(data)
  let wbImg: any = []
  for (const item of dataSource.value) {
    const { img, name } = item
    const index = dataSource.value.findIndex((item) => item.name === name)
    // 将图片转换为base64, 并在工作簿中添加图片
    console.log(img);
    
    const base64str = await urlToBase64(img)
    wbImg[index] = workbook.addImage({
      base64: base64str,
      extension: 'png'
    })

    // 将图片添加到工作表中
    worksheet.addImage(wbImg[index], {
      tl: { col: 2, row: index + 1},
      ext: { width: 200, height: 200}
    })

    // 设置行高
    const row = worksheet.getRow(index + 2)
    row.height = 150
  }

  // 写入buffer
  const buffer = await workbook.xlsx.writeBuffer()
  download(buffer, '我的工作簿.xlsx')
}

const urlToBase64 = (url: string) => {
  return new Promise((resolve, reject) => {
    let image = new Image()
    image.onload = () => {
      let canvas = document.createElement('canvas')
      canvas.width = 500
      canvas.height = 500
      // 将图片插入画布并开始绘制
      canvas.getContext('2d').drawImage(image, 0, 0)
      let result = canvas.toDataURL('image/png')
      resolve(result)
    }
    // CORS 策略,会存在跨域问题https://stackoverflow.com/questions/20424279/canvas-todataurl-securityerror
    image.setAttribute('crossOrigin', 'Anonymous')
    image.src = url
    image.onerror = () => {
      reject(new Error('urlToBase64 error'))
    }
  })
}

// 通过blob的方式进行下载
const download = (_blob: any, filename: any) => {
  const blob = new Blob([_blob])
  const downloadElement = document.createElement('a')
  downloadElement.style.display = 'none'
  const href = window.URL.createObjectURL(blob) // 创建下载的链接
  downloadElement.href = href
  downloadElement.download = filename // 下载后文件名
  document.body.appendChild(downloadElement)
  downloadElement.click() // 点击下载
  document.body.removeChild(downloadElement) // 下载完成移除元素
  window.URL.revokeObjectURL(href) // 释放掉blob对象
}
</script>

<style lang="scss" scoped>
</style>

实现效果展示

页面
在这里插入图片描述

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用Apache POI库来实现将doris表数据导出excel。具体实现步骤如下: 1. 首先,需要连接到doris数据库,可以使用JDBC连接。 2. 查询doris表数据,并将数据存储到一个List或者数组。 3. 创建一个新的Excel文件,并创建一个工作表。 4. 遍历List或者数组数据,将数据写入到Excel文件。 5. 最后,保存Excel文件。 以下是一个简单的Java代码示例: ``` import java.io.FileOutputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExportDataToExcel { public static void main(String[] args) { try { // 连接到doris数据库 Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:9030/test", "root", ""); // 查询doris表数据 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM doris_table"); // 将数据存储到List List<String[]> dataList = new ArrayList<String[]>(); while (rs.next()) { String[] data = new String[3]; data[0] = rs.getString("id"); data[1] = rs.getString("name"); data[2] = rs.getString("age"); dataList.add(data); } // 创建一个新的Excel文件 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建一个工作表 org.apache.poi.ss.usermodel.Sheet sheet = workbook.createSheet("Sheet1"); // 遍历List数据,将数据写入到Excel文件 int rowNum = 0; for (String[] data : dataList) { Row row = sheet.createRow(rowNum++); int colNum = 0; for (String field : data) { Cell cell = row.createCell(colNum++); cell.setCellValue(field); } } // 保存Excel文件 FileOutputStream outputStream = new FileOutputStream("doris_data.xlsx"); workbook.write(outputStream); workbook.close(); System.out.println("数据已成功导出Excel文件!"); // 关闭连接 rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值