首页 > 其他分享 >前端实现Excel导出【xlsx】【xlsx-js-style】

前端实现Excel导出【xlsx】【xlsx-js-style】

时间:2023-11-07 21:22:49浏览次数:34  
标签:XLSX style const xlsx utils 单元格 Excel workbook

最终效果

场景

有的时候我们需要根据服务端返回的数据来导出excel表格

优化一:设置单元格样式

比如:可以调节背景色、字体样式、border

xlsx基础库不提供样式设置,可以使用xlsx-js-style库,这个库是xlsx库的fork版本,并添加了样式定义

详细样式可以查看https://github.com/gitbrent/xlsx-js-style/

  1. 安装插件
npm i -s xlsx-js-style
  1. 导出单元格带样式
const data = [
    ["zs", 20, "1991-06-01"],
    ["ww", 14, "2001-09-01"],
    ["ls", 31, "1993-04-14"],
  ];
const workbook = XLSX.utils.book_new();
const worksheet = XLSX.utils.json_to_sheet(data);

// 设置单元格属性
worksheet["A1"].s = {
  font: { bold: true },
  alignment: {
    horizontal: "center",
    vertical: "center",
  },
  fill: {
    fgColor: {
      rgb: "FF0000",
    },
  },
};

XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
XLSX.writeFile(workbook, "data.xlsx");

优化二:去除默认表头,表头自定义

const data = [
  ['zs', 20, '1991-06-01'],
  ['ww', 14, '2001-09-01'],
  ['ls', 31, '1993-04-14'],
]

// 表头设置
data.unshift(['姓名', '年龄', '出生日期'])

const workbook = XLSX.utils.book_new()
const worksheet = XLSX.utils.json_to_sheet(data, {
  skipHeader: true,
})

XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
XLSX.writeFile(workbook, 'data.xlsx')

优化三:设置列宽

const data = [
  ['zs', 20, '1991-06-01'],
  ['ww', 14, '2001-09-01'],
  ['ls', 31, '1993-04-14'],
]

const workbook = XLSX.utils.book_new()
const worksheet = XLSX.utils.json_to_sheet(data, {
  skipHeader: true,
})

// 设置列宽
worksheet['!cols'] = [
  {
    wpx: 200,
  },
]

XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
XLSX.writeFile(workbook, 'data.xlsx')

优化四:合并单元格

const data = [
  ['zs', 20, '1991-06-01'],
  ['ww', 14, '2001-09-01'],
  ['ls', 31, '1993-04-14'],
]

const workbook = XLSX.utils.book_new()
const worksheet = XLSX.utils.json_to_sheet(data, {
  skipHeader: true,
})

// s 表示要合并的单元格范围的左上角单元格,r 表示该单元格的行号,c 表示该单元格的列号,行列号从 0 开始计数。
//    所以 { r: 0, c: 0 } 表示第 1 行第 1 列的单元格,即 A1 单元格。
// e 表示要合并的单元格范围的右下角单元格,其含义与 s 相同。
//    所以 { r: 1, c: 1 } 表示第 2 行第 2 列的单元格,即 B2 单元格。
// 因此,{ s: { r: 0, c: 0 }, e: { r: 1, c: 1 } } 表示要合并第 1 行第 1 列和第 2 行第 2 列之间的元格。
// 注意,合并会以开始位置单元格中的内容为准,所以合并后的单元格中的内容为 A1 单元格中的内容。
worksheet['!merges'] = [
  {
    s: {
      r: 0,
      c: 0,
    },
    e: {
      r: 1,
      c: 1,
    },
  },
]

XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
XLSX.writeFile(workbook, 'data.xlsx')

终极版

实现优化一、二、三

import { exportExcel } from '@/utils/excel'

const exportClick6 = () => {
  // 页面上展示的列, 比如使用了element-ui中的table组件
  const columns = [
    {
      prop: 'name',
      label: '姓名',
      width: 150,
      excelStyle: {
        font: { bold: true },
        alignment: {
          horizontal: 'center',
          vertical: 'center',
        },
        fill: {
          fgColor: {
            rgb: 'FFFF00',
          },
        },
      },
    },
    {
      prop: 'age',
      label: '年龄',
      width: 300,
    },
    {
      prop: 'date',
      label: '出生日期',
      excelStyle: {
        fill: {
          fgColor: {
            rgb: '00FFFF',
          },
        },
      },
    },
  ]
  const tableData = [
    {
      name: 'zs',
      age: 20,
      date: '1991-06-01',
      address: '广州市',
    },
    {
      name: 'ww',
      age: 14,
      date: '2001-09-01',
    },
    {
      name: 'ls',
      age: 31,
      date: '1993-04-14',
    },
  ]

  exportExcel('test', tableData, columns)
}

utils/excel

import * as XLSX from 'xlsx-js-style'

export function exportExcel(excelName, data, columns) {
  const newData = []
  const keys = columns.map((item) => item['prop'])
  const headers = columns.map((item) => item['label'])

  data.forEach((item) => {
    const row = []
    for (let key of keys) {
      row.push(item[key])
    }
    newData.push(row)
  })
  // 添加表头
  newData.unshift(headers)

  const workbook = XLSX.utils.book_new()
  const worksheet = XLSX.utils.json_to_sheet(newData, {
    skipHeader: true,
  })

  // 设置列宽
  const columnsWidth = columns.map((item) => {
    return {
      wpx: item.width,
    }
  })
  worksheet['!cols'] = columnsWidth

  // 设置表头样式
  columns.forEach((item, index) => {
    if (item['excelStyle']) {
      const cell = indexToLetters(index) + 1
      worksheet[cell].s = item['excelStyle']
    }
  })

  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1')
  XLSX.writeFile(workbook, `${excelName}.xlsx`)
}

function indexToLetters(i) {
  if (i >= 0 && i <= 25) {
    return String.fromCharCode(65 + i)
  } else {
    return undefined
  }
}

参考文章

https://blog.csdn.net/qq_42611074/article/details/130580395

标签:XLSX,style,const,xlsx,utils,单元格,Excel,workbook
From: https://www.cnblogs.com/it774274680/p/17816053.html

相关文章

  • # yyds干货盘点 # 盘点一个Excel表格数据筛选的问题(上篇)
    大家好,我是皮皮。一、前言前几天有粉丝问我Excel数据筛选的问题,原始数据如下图所示,其实一开始的总学时是字符串格式,我直接在wps里边进行了批量转换为数据操作,下面一起来看看需求吧。粉丝的需求是根据原始表格,然后填充下表:二、实现过程这里其实使用Excel就可以实现,这里介绍两个方法,......
  • C# 关于导出的Excel设置批注 设置格式为int类型 设置字体
    将数据导出,导出Excel有时候需要一些条件,比如:1.需要给某一列的表头加批注;2:需要设置某一列为int格式1.给某一列的表头加批注1List<string>texts=newList<string>();2List<int>ids=newList<int>();3texts.Add("......
  • uview:根据style某个样式,修改该class内的其他样式。
    背景:小程序使用uviewui,根据设计需要将选中的日期颜色变成绿色,但是api并没有相关属性。样式穿透,也没有可以区分选中和不选中的class。唯一能找到不一样的就是font-weight属性,选中的是bold,未选中的是normal。因此可以使用where来定位到该标签,从而修改其样式。 关键代码:.u-......
  • 如何使用Python将PDF转为Excel
    PDF文件是一种静态文档格式,通常难以编辑,而Excel则是一个灵活的表格工具。如果你需要处理PDF表格中的数据,那么将其导出为Excel文件可以大大节省工作时间和精力。Excel提供的强大数据编辑和格式化功能,允许你对转换后的PDF数据进行修改、排序、筛选、计算等操作。同时,你还可以调整单......
  • How to search for ? (question mark) in Excel
    The?isawildcardwhichrepresentsasinglecharacter,andthe*isawildcardcharacterthatrepresentsanystringofcharacters.Whensearchingforeitherwildcardcharacter,Excelwillsimplyfindeverything,whetherornottheseactualcharactersapp......
  • ASP.NET窗体开发实现下载Excel表格数据
    使用Excel表格下载,还是要先下载NPOI插件,下载安装后,才能直接下载Excel表格。usingSystem;usingSystem.Collections.Generic;usingSystem.Data;usingSystem.IO;usingSystem.Linq;usingSystem.Web;usingSystem.Web.UI;usingSystem.Web.UI.WebControls;usingEnglishPr......
  • EXCEL VBA自动设置坐标轴上下限
    下面的效果图展示了,将图表Y轴的的最大/最小值进行了动态设置Y轴最大值为:数据源最大值+2Y轴最小值为:数据源最小值-2通过上面的方法,数据源变化,那么Y轴的上下限也会自动变化 代码部分关键字MinimumScale设置Y轴的最小值关键字MaximumScale设置Y轴的最小值通过Max与Min......
  • 在线预览文件-word、excel、图片、ppt
    vue中引入插件 VueOffice,npm下载,以下插件需要单独下载VueOfficeDocxVueOfficeExcel<template><divstyle="height:700px;overflow:auto;"><vue-office-docxstyle="min-height:700px;":src="excel"@rendered="rendered&......
  • # yyds干货盘点 #3个Excel表格中每个门店物品不同,想要汇总在一起(方法四)
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公处理的问题,一起来看看吧。上一篇文章中,我们已经看到了三种解决办法了,这一篇文章我们一起来看看另外一种方法。二、实现过程这里【瑜亮老师】给了concat纵向合并的方式能操作的方法,代码如下......
  • 使用openpyxl库读取Excel文件数据
    在Python中,我们经常需要读取和处理Excel文件中的数据。openpyxl是一个功能强大的库,可以轻松地实现Excel文件的读写操作。本文将介绍如何使用openpyxl库读取Excel文件中的数据。1.导入所需库首先,我们需要导入openpyxl库,这个库提供了许多用于操作Excel文件的功能。fromopenpyx......