SheetJS 居中

想要SheetJS 居中的時(shí)候踩了一下午的坑吩愧。

1. 導(dǎo)不出樣式的代碼

import FileSaver from 'file-saver'
import XLSX from 'xlsx'   // https://sheetjs.com


var ws = XLSX.utils.table_to_sheet(targetEl)
var wb = XLSX.utils.book_new();
var range = XLSX.utils.decode_range(ws['!ref'])

// .. 省略業(yè)務(wù)邏輯部分
let headerRow = [0,1]  

    if(headerRow){  // 頭部樣式
      // 定義樣式
      var headerStyle = {
        font: { bold: true },
        alignment: { horizontal: 'center' }
      };
      // 設(shè)置行的樣式
      for (const rowIdx of headerRow) {
        for (var col = range.s.c; col <= range.e.c; col++) {
          var cell = ws[XLSX.utils.encode_cell({ r: rowIdx, c: col })];
          cell.s = headerStyle;
          cell.v = cell.v;
          cell.t = 's'; // 強(qiáng)制將單元格類型設(shè)置為字符串
        }
      } 
    }

var writingOpt = { 
  bookType: 'xlsx',
  bookSST: true,
  type: 'array'
}
var wbout = XLSX.write(wb, writingOpt)
FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), exportName)

2. 需要有兩個(gè)地方要改

Q1. 首先保存的時(shí)候 type要改成 binary方式
Q2. 保存的時(shí)候需要使用 xlsx-style模塊

3. 開(kāi)始挖呀挖呀挖

A1. 使用binary方式保存

var writingOpt = { 
  bookType: 'xlsx',
  bookSST: true,
  type: 'binary'    // <--- 1.改這里
}


/* 
2.  type:'array'改為'binary' 后因?yàn)橄旅娲a會(huì)報(bào)錯(cuò), 打不開(kāi)excel
new Blob([wbout], { type: 'application/octet-stream' }
要文本轉(zhuǎn)換成數(shù)組緩存后再生成二進(jìn)制對(duì)象
*/

// 添加String To ArrayBuffer
function s2ab(s) {
  var buf = new ArrayBuffer(s.length);
  var view = new Uint8Array(buf);
  for (var i = 0; i < s.length; i++) {
    view[i] = s.charCodeAt(i) & 0xFF;
  }
  return buf;
} 

let blob = new Blob([s2ab(wbout)], { type: 'application/octet-stream' })

FileSaver.saveAs(blob, exportName)

代碼改完試一下核偿,可以下載了。
但依然樣式?jīng)]起作用

要是下載不了恍箭,打開(kāi)不了那可能是其他問(wèn)題了。

A2. 使用 xlsx-style 模塊生成文件
  1. 首先安裝模塊
npm install xlsx-style 

在項(xiàng)目里安裝報(bào)好多錯(cuò)誤直接強(qiáng)制安裝二驰,不檢查依賴。

npm install xlsx-style -force

然后確認(rèn) package.json 是否安裝完成,然后重啟一下服務(wù)

// package.json
  "dependencies": {
// ...其他省略
    "xlsx": "^0.17.3",
    "xlsx-style": "^0.8.13"
  }
  1. 安裝完成后 找不到cptable模塊會(huì)報(bào)錯(cuò)
    報(bào)錯(cuò)內(nèi)容如下:
./node_modules/xlsx-style/dist/cpexcel.js Module not found: Error: Can't resolve './cptable' in 

這個(gè)問(wèn)題在vue.config.js里配置一下就可以解決钟哥。
其他框架自己找找方法,反正只要不讓他報(bào)錯(cuò)能啟動(dòng)就行瞎访。

module.exports = {
//  ...其他配置省略
  configureWebpack: { 
//  ...其他配置省略
    externals:{
      './cptable':'var cptable'
    },
  },
  1. 安裝完xlsx-style后改代碼
import XLSX2 from "xlsx-style";    // 1. 引入模塊

// 2. 使用`xlsx-style` 生成腻贰。 XLSX.write => XLSX2.write
var wbout = XLSX2.write(wb, writingOpt)

4. 最終代碼

import FileSaver from 'file-saver'
import XLSX from 'xlsx'   // https://sheetjs.com
import XlsxStyle from "xlsx-style";


var ws = XLSX.utils.table_to_sheet(targetEl)
var wb = XLSX.utils.book_new();
var range = XLSX.utils.decode_range(ws['!ref'])

// .. 省略業(yè)務(wù)邏輯部分
let headerRow = [0,1]  

    if(headerRow){  // 頭部樣式
      // 定義樣式
      var headerStyle = {
        font: { bold: true },
        alignment: { horizontal: 'center' }
      };
      // 設(shè)置行的樣式
      for (const rowIdx of headerRow) {
        for (var col = range.s.c; col <= range.e.c; col++) {
          var cell = ws[XLSX.utils.encode_cell({ r: rowIdx, c: col })];
          cell.s = headerStyle;
          cell.v = cell.v;
          cell.t = 's'; // 強(qiáng)制將單元格類型設(shè)置為字符串
        }
      } 
    }

var writingOpt = { 
  bookType: 'xlsx',
  bookSST: true,
  type: 'binary'
}
var wbout = XlsxStyle.write(wb, writingOpt)

// String To ArrayBuffer
function s2ab(s) {
  var buf = new ArrayBuffer(s.length);
  var view = new Uint8Array(buf);
  for (var i = 0; i < s.length; i++) {
    view[i] = s.charCodeAt(i) & 0xFF;
  }
  return buf;
} 

let blob = new Blob([s2ab(wbout)], { type: 'application/octet-stream' })

FileSaver.saveAs(blob, exportName) 

在小小的坑里??
挖呀挖呀挖??
種小小的霸個(gè) ??
背小小的鍋 ??

完事,下班扒秸!

PS:樣式配置參考, 沒(méi)試過(guò)播演。 應(yīng)該沒(méi)啥問(wèn)題吧 ??

/*
1. `font`:設(shè)置的是字體方面的樣式
2. font>>> sz:設(shè)置的是字號(hào)
3. font>>>bold:字體加粗
4. alignment:設(shè)置單元格的居中及自動(dòng)換行
5. alignment>>>horizontal:水平是否居中
6. alignment>>>vertical:豎直是否居中
7. alignment>>>wrapText:是否換行展示內(nèi)容
8. fill:設(shè)置單元格的背景色等
9. fill>>>fgColor:設(shè)置背景色
*/
let cellStyle = {
  font: {
    sz: 20, //設(shè)置標(biāo)題的字號(hào)
    bold: true, //設(shè)置標(biāo)題是否加粗
  },
  alignment: {
    horizontal: 'center', 
    vertical: 'center', 
    wrapText: true 
  }, //設(shè)置標(biāo)題水平豎直方向居中,并自動(dòng)換行展示
  fill: {
    fgColor: { 
      rgb: 'ebebeb' 
    }  //設(shè)置標(biāo)題單元格的背景顏色
  }
}; 

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伴奥,一起剝皮案震驚了整個(gè)濱河市写烤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拾徙,老刑警劉巖洲炊,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尼啡,居然都是意外死亡暂衡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門崖瞭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狂巢,“玉大人,你說(shuō)我怎么就攤上這事书聚∷肀欤” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵寺惫,是天一觀的道長(zhǎng)疹吃。 經(jīng)常有香客問(wèn)我,道長(zhǎng)西雀,這世上最難降的妖魔是什么萨驶? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮艇肴,結(jié)果婚禮上腔呜,老公的妹妹穿的比我還像新娘。我一直安慰自己再悼,他們只是感情好核畴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著冲九,像睡著了一般谤草。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,754評(píng)論 1 307
  • 那天丑孩,我揣著相機(jī)與錄音冀宴,去河邊找鬼。 笑死温学,一個(gè)胖子當(dāng)著我的面吹牛略贮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仗岖,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逃延,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了轧拄?” 一聲冷哼從身側(cè)響起真友,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎紧帕,沒(méi)想到半個(gè)月后盔然,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡是嗜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年愈案,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鹅搪。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡站绪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出丽柿,到底是詐尸還是另有隱情恢准,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布甫题,位于F島的核電站馁筐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坠非。R本人自食惡果不足惜敏沉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炎码。 院中可真熱鬧盟迟,春花似錦、人聲如沸潦闲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)歉闰。三九已至辖众,卻和暖如春卓起,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赵辕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留概龄,地道東北人还惠。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像私杜,于是被迫代替她去往敵國(guó)和親蚕键。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容