如果你有需要使用前端匯出
Excel
且需要將
Excel
加上樣式,推薦參考這篇文章!
如果你剛好使用
xlsx-style
碰到了套件本身的
Error
問題,更推薦參考這篇文章!
如果你只是想單純看看前端怎麼使用套件將
Data、Table、JSON
匯出,超級推薦這篇,但請各路大神手下留情。
xlsx-style
這個套件且踩坑一段時間,一路到成功解決這個問題。
如果你只想知道關於
xlsx-style
的
./cptable
坑,歡迎跳至下方使用指南瀏覽。
不得不說前端之路真的很孤獨啊,筆者察覺到台中(不確定是不是只有台中,因為目前只在台中就職)的前端職缺超級超級超級缺,但職缺待遇卻都超級超級超級差,不曉得到底是沒有人才?!還是沒有好公司呢?!因為這個原因,所以每間公司的前端都少得可憐,能討論的人也都很有限…有空在寫一篇文章來談談這個狀況吧
d3.js
的
csv api
即可達成匯入匯出,甚至可以匯出圖表。
在最後決定使用
xlsx-style
時,其實也考慮過
exceljs
,但因為需求上需要在輸出後加上樣式,故改選前者,如果你並不需要更改樣式,可以選擇後者,仔細去
Github
瞧瞧,後者有中文介紹(
對 筆者就是膚淺
),且前者說真的文件不易讀,而且後來很多
Fork
出來相關的套件有很多隱藏的坑。
xlsx-style issues Can’t resolve ‘./cptable’ in ‘myPath\node_modules\xlsx-style\dist’ #100
not found cptable in node_modules/xlsx-style/dist/cpexcel.js_FWodong的博客-程序员宅基地
vue导入xlsx-style组件报错Can‘t resolve ‘./cptable‘ in ‘xxx\node_modules_xlsx
看到後面因為瞧到了
Vue
的解法,但筆者使用的是
React
,不過兩者原理應該相去不遠,所以筆者開始研究怎麼解開這個難題。
請不要再直接改
807
行了…
react-app-rewired
這個套件,而這個檔案是什麼;以往寫
Vue
都是直接創建
Webpack.config.js
去修改
Webpack
的設定,但因為
React
透過
Create React App
去建立 React 應用的一個腳手架工具,他將你不需要關心的設定都配置好,就像
Apple IOS
,所以直接創建並配置
Webpack.config.js
不是一個聰明的決定。
React
其實預設有提供
eject
可以噴射出(
抱歉筆者字典直接翻譯,覺得很好記就用這個詞了
)他們原本的封裝在
Create React App
的配置,反編譯到目前的專案,缺點是
之後 Create React App 升級後你再也享受不到升級後的好處,因為他已經是以檔案的形式存在的你專案
,故這邊不推薦這個『
噴射設定方式
』。
為了享有
Create React App
之後升級還能跟上升級後的福利,又能客製化設定,這邊就要依靠
react-app-rewired
這個套件。
而
customize-cra
這個套件提供了
override
這個
api
,讓程式可以吃到你創建的
config-overrides.js
這支檔案,這隻檔案可以想像成
webpack.config.js
。
接著讓我們創建一支檔案放在專案根目錄,命名為
config-overrides.js
,然後裡面打上:
1 2 3 4 5 6 7
const { override, addWebpackExternals } = require ("customize-cra" );module .exports = override ( addWebpackExternals ({ "./cptable" : "var cptable" , }) );
正如上方提到爬文時看見了
Vue
的配置,大致的用意就是告訴編譯時,如果碰到
./cptable
這個關鍵字,就替換成
var cptable
。
然後到
package.json
把
react-scripts start
那邊的程式碼改為:
1 2 3 4 5 6 7 8 9
"scripts" : { "start" : "react-app-rewired start" , "build" : "react-app-rewired build" , "test" : "react-app-rewired test" , "eject" : "react-scripts eject" },
最後再重跑一次
npm start
,就會發現沒有噴錯了(
筆者計時卡關半已天多…
)。
這個步驟講了這麼多,簡單快速的在敘述一下整個過程。
安裝套件
react-app-rewired
用於最後替代
package.json
的
react-scripts
安裝套件
customize-cra
用於透過該套件
api
去吃到
config-overrides.js
的設定 及
取代編譯後套件的錯誤
創建
config-overrides.js
修改
webpack
的配置。
休息一下,我們繼續。
JavaScript导出excel文件,并修改文件样式
,這邊只會大略說明。
—–
Cell Object(單元格)
—–
通常指的是
Worksheet Object(工作表)
裡面的其中一個格子,裡面的屬性可參考
xlsx Github - Cell Object
,這邊基本上會用到的就是下列三個。
v 單元格的值
t 單元格的類型,”b”布爾值、”n”數字、”e”錯誤、”s”字符串、”d”日期
s 單元格的樣式(這個是重點)
另外重點需要知道
Cell Object(單元格)
的格式為
{c: C, r: R}
,
C
為列號、
R
為行號,很簡單吧,以下圖為例
王五
就是在
{c: 1, r: 5}
,記得
格子開頭都是 0 開始算
。
xlsx 裡面有提供 utils 可以去對單元格進行操作,例如:LSX.utils.encode_row()、XLSX.utils.encode_cell()…等等
—–
Worksheet Object(工作表)
—–
這個工作表可以透過
xlsx
的
worksheet
去對單元格做
合併、凍結、樣式
…等等的設定,一樣可以詳細參考
xlsx Github - Worksheet Object
。
Worksheet[‘!ref’]:
!ref
代表這個工作表裡面的
Cell Object(單元格)
範圍。
Worksheet[‘!merges’]:可以合併儲存格,裡面需要帶入物件
{s: { c: C }, e: { r: R }}
開始到結束的格子,裡面
C
及
R
地方為你的格子格式,算法可以看上面的
Cell Object(單元格)
。
Worksheet[‘!freeze’]:可以凍結單元格,變成類似懸浮的表頭。
Worksheet 並不是 API 而是你需要自己去抓到 sheet,下面會有範例,這邊先上圖。
—–
Workbook Object(工作簿)
—–
這個應該就很明白了,多個
Worksheet Object(工作表)
就是
Workbook Object(工作簿)
,一樣可參考
xlsx Github - Workbook Object
。
這邊只需要我們可以命名
Worksheet Object(工作表)
的名稱,然後把對應的
Worksheet Object(工作表)
丟進去,如下方範例:
1 2 3 4 5 6
const Workbook = { SheetNames : ["sheet_1" ], Sheets : { sheet_1 : Worksheet , }, };
xlsx Github - Cell Styles
,或是可參考其他作者的翻譯
JavaScript匯出excel檔案,並修改檔案樣式
。
接著透過
xlsx-style
的
write()
去把檔案編寫成
Excel
讀得懂的格式,詳細內容如下圖。
請一定要使用
xlsx-style
的
write()
,不然輸出後的檔案樣式不會變更,有興趣可以試看看。
最後在透過官方提供的
function
把上面的內容轉為
blob
,
function
如下,詳細也可參考
官方文件
:
1 2 3 4 5 6
const 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; };
最後的最後透過套件
file-saver
,省去自己寫
function
透過
api saveAs
去下載這個
blob
,大功告成!
點我
JavaScript导出excel文件,并修改文件样式
ITW01 -
JavaScript匯出excel檔案,並修改檔案樣式
Gihub -
xlsx-style
Gihub -
xlsx aka Sheetjs
Github -
react-app-rewired