首页 > 其他分享 >vue,js直接导出excel,xlsx的方法,XLSX_STYLE 行高设置失效的问题解决

vue,js直接导出excel,xlsx的方法,XLSX_STYLE 行高设置失效的问题解决

时间:2024-04-27 11:33:04浏览次数:24  
标签:xlsx STYLE vue 000000 color style rgb thin

1、先安装依赖:xlsx、xlsx-style、file-saver三个包

npm install xlsx xlsx-style file-saver

2、引入:

<script>
import * as XLSX from 'xlsx/xlsx.mjs'
import XLSX_STYLE from 'xlsx-style';
import { saveAs } from 'file-saver';
export default {
  name: 'HelloWorld',
  data () {
    return {
      showData:[
        {type:1,createdTime:222,logistNo:"大课间分数段赛覅u覅欧派",note:"科技含量快递费科技大时代哈的你看老师的话副科老师"},
        {type:1,createdTime:222,logistNo:3,note:"asdfads"},
      ]
    }
  },

3、两个方法:

methods:{
    exportExcel() {
    console.log("start")
      const data = this.showData.map(item => {
        return {
          '类型': item.type,
          '订单日期': item.createdTime,
          '订单号': item.logistNo,
          '备注': item.note,
        }
      });
      // 定义表头样式
      const headerStyle = {
        fill: {
          fgColor: { rgb: '0070C0' },
        },
        font: {
          color: { rgb: 'ffffff' },
          name: '微软雅黑',
          sz: 11,
          bold:true
        },
        border: {
          top: { style: 'thin', color: { rgb: '000000' } },
          bottom: { style: 'thin', color: { rgb: '000000' } },
          left: { style: 'thin', color: { rgb: '000000' } },
          right: { style: 'thin', color: { rgb: '000000' } },
        },
        alignment: {
          horizontal: 'center',
          vertical: 'center',
          wrapText: true,
        },
      };
      const contentStyle = {
        font: {
          name: '宋体',
          sz: 10,
        },
        border: {
          top: { style: 'thin', color: { rgb: '000000' } },
          bottom: { style: 'thin', color: { rgb: '000000' } },
          left: { style: 'thin', color: { rgb: '000000' } },
          right: { style: 'thin', color: { rgb: '000000' } },
        },
        alignment: {
          horizontal: 'center',
          vertical: 'center',
          wrapText: false,//超长自动换行
        },
      };
      const worksheet = XLSX.utils.json_to_sheet(data);
      var wscols = [{ wch: 30 }, { wch: 30 }, { wch: 50 }]
      var wsrows = [{ hpx: 888 }, { hpx: 305 }]
      worksheet['!cols'] = wscols//设置列宽
      worksheet['!rows'] = wsrows//设置行高********************注意

      // 将表头样式应用到 worksheet 对象中的表头单元格
      const headerRange = XLSX.utils.decode_range(worksheet['!ref']);
      for (let col = headerRange.s.c; col <= headerRange.e.c; col++) {
        const headerCell = XLSX.utils.encode_cell({ r: headerRange.s.r, c: col });
        worksheet[headerCell].s = headerStyle;
      }

      // 将内容样式应用到 worksheet 对象中的所有单元格
      const contentRange = XLSX.utils.decode_range(worksheet['!ref']);
      for (let row = contentRange.s.r + 1; row <= contentRange.e.r; row++) {
        for (let col = contentRange.s.c; col <= contentRange.e.c; col++) {
          const contentCell = XLSX.utils.encode_cell({ r: row, c: col });
          worksheet[contentCell].s = contentStyle;
        }
      }
      const workbook = XLSX.utils.book_new();
      XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
      // 将 workbook 对象转换为二进制数据流并下载
      const wbout = XLSX_STYLE.write(workbook, { bookType:'xlsx',type:'binary' });
      const blob = new Blob([this.s2ab(wbout)],{type:'application/octet-stream'});
      saveAs(blob, 'table.xlsx');
    },
    s2ab(s) {
      const buf = new ArrayBuffer(s.length);
      const view = new Uint8Array(buf);
      for (let i = 0; i < s.length; i++) {
        view[i] = s.charCodeAt(i) & 0xFF;
      }
      return buf;
    },
  },

 问题解决:

行高的设置不起作用,是因为XLSX_STYLE包里面没有这个方法,但是xlsx里面有:

\node_modules\xlsx-style\xlsx.js

里面找到:write_ws_xml_data 函数注释掉

用这个里面的函数替换:

\node_modules\xlsx\xlsx.js

function write_ws_xml_data(ws, opts, idx, wb) {......}

同时根据报错,一起加入:

var DEF_PPI = 96, PPI = DEF_PPI;
  function px2pt(px) { return px * 96 / PPI; }
  function pt2px(pt) { return pt * PPI / 96; }
  function write_ws_xml_data(ws, opts, idx, wb) {}

这样就完美了。

标签:xlsx,STYLE,vue,000000,color,style,rgb,thin
From: https://www.cnblogs.com/prefertea/p/18161865

相关文章

  • Vue中form表单常用rules校验规则
    是否合法IP地址constcheckIPCode=(rule,value,callback)=>{ if(/^(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])$/ .test(value......
  • vue箭头函数、js-for循环、事件修饰符、摁键事件和修饰符、表单控制、完整购物车版本
    【箭头函数】1<!DOCTYPEhtml>2<htmllang="en">3<head>4<metacharset="UTF-8">5<title>Title</title>6<scriptsrc="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">&l......
  • vue3 快速入门系列 —— 状态管理 pinia
    其他章节请看:vue3快速入门系列Piniavue3状态管理这里选择pinia。虽然vuex4已支持Vue3的CompositionAPI,但是vue3官网推荐新的应用使用pinia——vue3pinia集中式状态管理redux、mobx、vuex、pinia都是集中式状态管理工具。与之对应的就是分布式。Pinia符......
  • vue3打包js内存溢出
     第一步:npminstall-gincrease-memory-limit第二步:npminstallincrease-memory-limit—save-dev第三步:package.json文件中修改   "build:win32":"cross-envLIMIT=2048increase-memory-limitBUILD_TARGET=win32node.electron-vue/build.js",//添加这个......
  • Vue3.0
    Vue2中的optionsAPI和Vue3.0中compositionAPIoptionsAPI示例compositionAPI是一组基于函数的API,可以更灵活的组织组件的逻辑createAPP函数的第一个参数即compositionAPI对象用于创建应用实例createApp({setup(){ constcount=ref(0)return{......
  • 基于Vue 2的前端如何引入评论区组件Artalk
    1.Artalk介绍Artalk是一个可以集成的评论区组件,可以直接添加到前端页面,而不用自己开发评论区来保存评论,支持点赞/踩,还支持评论区之间的相互回复,以及一些表情包的使用,同时也有丰富的后台管理页面【如以下展示】[========]2.Artalk服务器部署2.1环境条件Vue2Artalk2.8......
  • The "TypeScript Vue Plugin (Volar)" extension is no longer needed since v2. Plea
    这个报错信息表明你正在使用的是VisualStudioCode或者其他支持Volar的编辑器,而Volar是一个为Vue3应用提供TypeScript支持的工具。这个报错指出自从Volar版本2开始,"TypeScriptVue插件(Volar)"这个扩展就不再需要了。解决方法:如果你在使用的是VisualStudioCode编辑器,并且安装......
  • js使用xlsx读取excel文件
    官方案例:https://oss.sheetjs.com/sheetjs/参考:https://www.jb51.net/javascript/293098ilx.htm大致的代码如下,如果要实际使用还得修改修改完善完善。<inputtype="file"id="uploadExcel"multiple onChange=’onImportExcel'/>onImportExcel=file=>{//......
  • 《Vue.js设计与实现》 第八章 挂载与更新
    8.1挂载子节点和元素的属性8.2HTMLAttributes与DOMProperties8.3正确地设置元素属性8.4class的处理8.5卸载操作8.6区分vnode的类型8.7事件的处理8.8事件冒泡与更新时机问题8.9更新子节点8.10文本节点和注释节点8.11Fragment......
  • 模仿实现Vue的双向绑定
    简单模仿Vue的单项绑定和双向绑定,可以解析v-bind和v-mode标签<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>模拟Vue单向绑定和双向绑定</title> </head> <body> <divid="app"> <inputtype=&......