vue+xlsx-js-style导出Excel自定义样式

1.安装插件 npm install xlsx-js-style@1.2.0 --save

2.封装导出方法 export_array_to_STYLES

//excel.js
import XLSXS from 'xlsx-js-style'
export const export_array_to_STYLES = ({ key, data, widthList, align, title, filename, styles }) => {

  let workbook = XLSXS.utils.book_new(); // 工作簿
  const arr = json_to_array(key, data);
  const excelData = [title, ...arr];
  let worksheet = XLSXS.utils.aoa_to_sheet(excelData); // 数据表
  let cols = []; // 设置每列的宽度
  let rows = [];//行高
  // wpx 字段表示以像素为单位,wch 字段表示以字符为单位
  if (!(align && align.length > 0)) { return false; }
  for (let i = 0; i <= excelData[0].length; i++) {
    let col = {};
    col.wpx = widthList&&widthList.length>0?widthList[i]:30;
    cols.push(col);
  }
  for (let i = 1; i <= excelData.length; i++) {
    rows.push({ hpx: 32 });
  }
  worksheet['!cols'] = cols; // 设置列宽信息到工作表
  worksheet['!rows'] = rows;// 设置列高信息到工作表
  //以下是样式设置,样式设置放在组织完数据之后,xlsx-js-style的核心API就是SheetJS的

  const set = { "A": 0, "B": 1, "C": 2, "D": 3, "E": 4, "F": 5, "G": 6, "H": 7, "I": 8, "J": 9, "K": 10, "L": 11, "M": 12, "N": 13, "O": 14, "P": 15, "Q": 16, "R": 17, "S": 18, "T": 19, "U": 20, "V": 21, "W": 22, "X": 23, "Y": 24, "Z": 25 }
  Object.keys(worksheet).forEach((key, i) => {
    // 非!开头的属性都是单元格
    if (!key.startsWith("!")) {
      if (i < title.length) {
        //表头设置
        worksheet[key].s = {
          font: {
            bold: true,
            sz: 11,
            name: '宋体',
          },
          // alignment 对齐方式
          alignment: {
            vertical: 'center', // 垂直居中
            horizontal: 'center'
          },
          // border 边框属性
          border: {
            top: { style: 'thin' },
            bottom: { style: 'thin' },
            left: { style: 'thin' },
            right: { style: 'thin' }
          },
          // fill 颜色填充属性
          fill: {
            fgColor: { rgb: 'FFFFFF' },
          }
        };
      } else {
        //默认样式
        const styleCss = {
          font: {
            bold: false,
            sz: 10,
            name: '宋体',
          },
          // alignment 对齐方式
          alignment: {
            vertical: 'center', // 垂直居中
            horizontal: align[set[key.charAt(0)]] // 水平居中
          },
          // border 边框属性
          border: {
            top: { style: 'thin' },
            bottom: { style: 'thin' },
            left: { style: 'thin' },
            right: { style: 'thin' }
          },
          // fill 颜色填充属性
          fill: {
            fgColor: { rgb: 'FFFFFF' },
          }
        };
        if (styles && styles[key]) {
          styles[key].alignment.horizontal = align[set[key.charAt(0)]];
        }
        worksheet[key].s = styles && styles[key] ? styles[key] : styleCss;

      }

    }
  })
  XLSXS.utils.book_append_sheet(workbook, worksheet, "Sheet1");
  XLSXS.writeFile(workbook, filename + ".xlsx");
};

使用

import { export_array_to_STYLES } from '@/utils/excel.js';
export default {
      data(){
          return {
                  list:[]//表格数据
                  columns:[],//表格列配置
          }
    },
    methods:{
          Excel(){
                var title = [], key = [],align = [],widthList = [],styles={};
                //根据业务需要过滤不需要的列
                var columnsProp = this.columns.filter((e) => {
                    return e.prop == e.isProp;
                })
              function generateBig_1() {
                var str = [];
                for (var i = 65; i < 91; i++) {
                  str.push(String.fromCharCode(i));
                }
                return str;
              }
               this.list.map((e, i) => {
                  title.map((es, j) => {
                  let arr = generateBig_1();
                  const name = arr[j] + (i + 2);
                  styles[name] = {
                    font: {
                      bold: false,
                      sz: 10,
                      name: '宋体',
                    },
                    // alignment 对齐方式
                    alignment: {
                      vertical: 'center', // 垂直居中
                      horizontal: 'center', // 水平居中 默认已经强制设置为表格对齐方式 此处可不填
                    },
                    border: {
                      top: { style: 'thin' },
                      bottom: { style: 'thin' },
                      left: { style: 'thin' },
                      right: { style: 'thin' }
                    },
                    // fill 颜色填充属性
                    fill: {
                      fgColor: { rgb: 'ffffff' },
                    }
                  }
                })
               })
                columnsProp.map((e, i) => {
                    title.push(e.label);
                    key.push(e.property);
                    widthList.push(e.minWidth);
                    align.push(columnsProp[i].align);
                });
              export_array_to_STYLES({
                   key: key,//表格prop
                  styles:styles,//导出表格每个单元格样式(不含表头,表头样式固定写死,见excel.js)
                   widthList:widthList,//表格列width
                   title: title,//表格标题文字
                   data: this.list,//表格数据
                  align: align,//表格对齐方式,默认表头写死居中(见excel.js),此处设置为表格内容居中方式
                  filename: 'xxxxx'//导出表格名称
                });
          }
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,270评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,489评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,630评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,906评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,928评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,718评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,442评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,345评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,802评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,984评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,117评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,810评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,462评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,011评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,139评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,377评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,060评论 2 355