<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近遇到一個需求:前端匯出excel檔案,其中有部分資料使用者不能操作,部分列資料可以篩選,並且存在前一列的資料值會影響後一列資料值的輸入範圍的情況。
需要匯出的前端表格如上圖所示,其中:
專案使用的是React + AntD
在這個需求出來之前,前端匯入匯出excel檔案時我使用的是xlsx這個庫。但是,如果想要修改excel表格樣式的話,是需要使用收費的專業版本。帶著開源第一,絕不花錢的基本原則,本人就找到了ExcleJS這個庫。
ExcleJS不僅完全開源,還配備著中文檔案這可真的是用著放心也開心!
安裝:
npm install exceljs npm install file-saver
建立workbook,新增名為Demo的sheet,設定預設行高為20,設定列(表頭);
新增行資訊(allData前端頁面表格中的資料);
最後給表頭新增顏色。
// 建立工作簿 const workbook = new ExcelJs.Workbook(); // 新增sheet const worksheet = workbook.addWorksheet('Demo'); // 設定 sheet 的預設行高 worksheet.properties.defaultRowHeight = 20; // 設定列 worksheet.columns = [ { header: 'Index', key: 'index', width: 10 }, { header: 'Name', key: 'name', width: 25 }, { header: 'Type', key: 'group', width: 25, outlineLevel: 1 }, { header: 'Group', key: 'type', width: 25, outlineLevel: 1 }, { header: 'Region', key: 'modbusRegion', width: 25, outlineLevel: 1 }, { header: 'Address', key: 'modbusAddress', width: 25, outlineLevel: 1 }, ]; // 新增行 worksheet.addRows(allData); // 給表頭新增背景色 let headerRow = worksheet.getRow(1); headerRow.eachCell((cell) => { cell.fill = { type: 'pattern', pattern: 'solid', fgColor: {argb: 'dde0e7'}, } })
// 將自動篩選器設定為從 A2 到 F1 worksheet.autoFilter = { from: 'C1', to: 'E1', }
// 鎖定工資表 await worksheet.protect('the-password', { autoFilter:true, selectLockedCells:false, });
const allData = [...this.state.dataSource] let length = allData.length for(let i = 0 ;i < length; i++){ // Region的輸入範圍 let coilArr = ['"Coil,Discrete Input"'] let registerArr = ['"Holding Register,Input Register"'] let listArr = [] if(allData[i].type === 'BOOL'){ listArr = coilArr } else{ listArr = registerArr } // 可編輯的單元格在E、F中 worksheet.getCell(`E${i+2}`).protection = { locked: false, }; // Region的輸入校驗 worksheet.getCell(`E${i+2}`).dataValidation = { type: 'list', allowBlank: true, formulae: listArr, showErrorMessage: true, errorTitle: '非法輸入', error: '取值範圍為:'+listArr }; worksheet.getCell(`F${i+2}`).protection = { locked: false, }; // Address的輸入校驗 worksheet.getCell(`F${i+2}`).dataValidation = { type: 'whole', operator: 'between', allowBlank: true, showErrorMessage: true, formulae: [0,65535], errorTitle: '非法輸入', error: '取值範圍為:[0,65535]' }; }
以上的程式碼中,worksheet.getCell(E${i+2}
).dataValidation是進行單元格資料驗證的函數,具體的使用可參考官方檔案。
// 匯出excel this.saveWorkbook(workbook, 'xlsx-demo.xlsx');
使用者輸入錯誤給出錯誤提醒,並且不儲存錯誤資料。
使用者輸入錯誤給出錯誤提醒,並且不儲存錯誤資料。
// 匯出xls exportXLS = async () =>{ const allData = [...this.state.dataSource] let length = allData.length // 建立工作簿 const workbook = new ExcelJs.Workbook(); // 新增sheet const worksheet = workbook.addWorksheet('demo'); // 設定 sheet 的預設行高 worksheet.properties.defaultRowHeight = 20; // 設定列 worksheet.columns = [ { header: 'Index', key: 'index', width: 10 }, { header: 'Name', key: 'name', width: 25 }, { header: 'Group', key: 'group', width: 25, outlineLevel: 1 }, { header: 'Type', key: 'type', width: 25, outlineLevel: 1 }, { header: 'Region', key: 'modbusRegion', width: 25, outlineLevel: 1 }, { header: 'Address', key: 'modbusAddress', width: 25, outlineLevel: 1 }, ]; // 新增行 worksheet.addRows(allData); // 給表頭新增背景色 let headerRow = worksheet.getRow(1); // 通過 cell 設定背景色,更精準 headerRow.eachCell((cell) => { cell.fill = { type: 'pattern', pattern: 'solid', fgColor: {argb: 'dde0e7'}, } }) // 將自動篩選器設定為從 C1 到 F1 worksheet.autoFilter = { from: 'C1', to: 'E1', } // 鎖定工資表 await worksheet.protect('the-password', { autoFilter:true, selectLockedCells:false, }); // 判斷哪些單元格可以被使用者操作,並且判斷該單元格的輸入限制是什麼 for(let i = 0 ;i < length; i++){ // 根據不同型別選擇篩選的框 let coilArr = ['"Coil,Discrete Input"'] let registerArr = ['"Holding Register,Input Register"'] let listArr = [] if(allData[i].type === 'BOOL'){ listArr = coilArr } else{ listArr = registerArr } // 可編輯的單元格在E、F中 worksheet.getCell(`E${i+2}`).protection = { locked: false, }; worksheet.getCell(`E${i+2}`).dataValidation = { type: 'list', allowBlank: true, formulae: listArr, showErrorMessage: true, errorTitle: '非法輸入', error: '取值範圍為:'+listArr }; worksheet.getCell(`F${i+2}`).protection = { locked: false, }; worksheet.getCell(`F${i+2}`).dataValidation = { type: 'whole', operator: 'between', allowBlank: true, showErrorMessage: true, formulae: [0,65535], errorTitle: '非法輸入', error: '取值範圍為:[0,65535]' }; } // 匯出excel this.saveWorkbook(workbook, 'xlsx-demo.xlsx'); }
ExcelJS 功能很強大,如合併單元格、合併行和列、修改單元格的樣式、設定頁首頁尾、操作檢視、新增公式、使用富文字等功能都是可以實現的。
官方檔案十分詳細,大家有需求的話直接看官方檔案。
以上就是前端使用xlsx庫匯出帶有樣式的excel檔案的詳細內容,更多關於前端xlsx庫匯出excel的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45