欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

小小導出,我大前端足矣!

admin
2024年3月30日 0:40 本文熱度 681

一、問題剖析

那是一個傾盆大雨的早上,花瓣隨風雨落在我的肩膀上,是五顏六色的花朵。

我輕輕撫摸著他,隨后撥開第一朵花瓣,她不愛我。

撥開第二朵,她愛我。

正當我沉迷于甜蜜的幻想中,后端小白 🙋 喊道:這個導出你前端應該就能做的吧!

🙋🏻‍♂️ 那是自然,有什么功能是我大前端做不了的,必須得讓你們大開眼界。

二、為什么導出要前端做?

前端導出的場景:

  1. 輕量級數據:如果要導出的表格數據相對較小,可以直接在前端生成和導出,避免服務器端的處理和通信開銷。
  2. 數據已存在于前端:如果表格數據已經以 JSON 或其他形式存在于前端,可以直接利用前端技術將其導出為 Excel、CSV 或其他格式。
  3. 實時生成/計算:如果導出的表格需要根據用戶輸入或動態生成,可以使用前端技術基于用戶操作實時生成表格,并提供導出功能。
  4. 快速響應:前端導出表格可以提供更快的響應速度,避免等待服務器端的處理和下載時間。

后端導出的場景:

  1. 大量數據:如果要導出的表格數據量很大,超過了前端處理能力或網絡傳輸限制,那么在服務器端進行導出會更高效。
  2. 安全性和數據保護:敏感數據不適合在前端暴露,因此在服務器端進行導出可以更好地控制和保護數據的安全。
  3. 復雜的業務邏輯:如果導出涉及復雜的業務邏輯、數據處理或數據查詢,使用服務器端的計算能力和數據庫訪問更合適。
  4. 跨平臺支持:如果需要支持多個前端平臺(如 Web、移動應用等),將導出功能放在服務器端可以提供一致的導出體驗。

三、講解一下在前端做的導出

xlsx、xlsx-style

如果是只做表格導出:www.npmjs.com/package/xls…[4]

如果導出要包含樣式:www.npmjs.com/package/xls…[5]

import XLSX from"xlsx";

exportData() {
 let tableName = '表格'

 if(!getVal(this.dataList, 'length')){
   this.$message.info("暫時數據");
   return
 }


 // 處理頭部
 let headers = {
   "B2": "字段-B2",
   "E2": "字段-E2",
 }
 const props = [ "B2", "E2" ]
 let tmp_dataListFilter = [
   {
     "B2": "字段-B2",
     "E2": "字段-E2",
   },
   {
     "E2": "2",
     "B2": "2",
   }
 ]

 tmp_dataListFilter.unshift(headers) // 將表頭放入數據源前面
 let wb =  XLSX.utils.book_new();
 let contentWs =  XLSX.utils.json_to_sheet(tmp_dataListFilter, {
   skipHeader: true,   // 是否忽略表頭,默認為false
   origin: "A2"// 設置插入位置
 });
 // /單獨設置某個單元格內容
 contentWs["A1"]={
   t:"s",
   v:tableName,
 };
 // /設置單元格合并!merges為一個對象數組,每個對象設定了單元格合并的規側,
 // /{s:{r:0,c:},e:{r:0,c:2}為一個規則,s:起始位置,e:結束位置,r:行,c:列
 contentWs["!merges"]=[{ s:{r:0,c:0 },e:{r:0,c:props.length - 1 }}]

 // 設置單元格的寬度
 contentWs["!cols"] = []
 props.forEach(p => contentWs["!cols"].push({wch: 35}))
 XLSX.utils.book_append_sheet(wb,contentWs,tableName)    // 表格內的下面的tab
 XLSX.writeFile(wb,tableName + ".xlsx"); // 導出文件名字
},

package.json

"xlsx": "^0.15.5",
"xlsx-style": "^0.8.13"

大概效果如下:

3.png

感覺前端導出也很容易。

哦哦,那你別高興太早。

四、需求升級:單元格要居中和加粗。

xlsx

嘗試使用 xlsx-style 設樣式。

官方文檔:github.com/rockboom/Sh…[6]

文檔說給單元格設置 s 為對象

4.png

let contentWs = XLSX.utils.json_to_sheet(tmp_dataListFilter, {
 skipHeader: true, // 是否忽略表頭,默認為false
 origin: "A2", // 設置插入位置
});
// /單獨設置某個單元格內容
contentWs["A1"] = {
 t: "s",
 v: tableName,
 s:{ // 這個是關鍵s
   font: { bold: true },
   alignment: { horizontal: 'center' }
 }
};

發現設置無效。

有人說要改 xlsx、xlsx-style 源碼:

大概的意思是:修改 xlsx.extendscript.js、xlsx.full.min.js 更改文件變量。

發現仍然無效。

使用 binary 方式保存

  1. 首先保存的時候 type 要改成 binary 方式
  2. 保存的時候需要使用 xlsx-style 模塊
var writingOpt = {
 bookType: 'xlsx',
 bookSST: true,
 type: 'binary'// <--- 1.改這里
}


/*
2.  type:'array'改為'binary' 后因為下面代碼會報錯, 打不開excel
new Blob([wbout], { type: 'application/octet-stream' }
要文本轉換成數組緩存后再生成二進制對象
*/


// 添加String To ArrayBuffer
function s2ab(s) {
 var buf = newArrayBuffer(s.length);
 var view = newUint8Array(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)

可以下載了。但依然樣式沒起作用。

使用 xlsx-style 模塊生成文件

首先安裝模塊

npm install xlsx-style

在項目里安裝報好多錯誤直接強制安裝,不檢查依賴。

npm install xlsx-style -force

安裝完成后 找不到 cptable 模塊會報錯
報錯內容如下:

./node_modules/xlsx-style/dist/cpexcel.js Module not found: Error: Can't resolve './cptable' in

這個問題在 vue.config.js 里配置一下就可以解決。
其他框架自己找找方法,反正只要不讓他報錯能啟動就行。

module.exports = {
//  ...其他配置省略
 configureWebpack: {
//  ...其他配置省略
   externals:{
     './cptable':'var cptable'
   },
 },

安裝完 xlsx-style 后改代碼

import XLSX2 from"xlsx-style";    // 1. 引入模塊

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

仍然無效。

總結 xlsx

大概的意思是說:默認不支持改變樣式,想要支持改變樣式,需要使用它的收費版本。

本著勤儉節約的原則,很多人使用了另一個第三方庫:xlsx-style[4] ,但是使用起來極其復雜,還需要改 node_modules 源碼,這個庫最后更新時間也定格在了 6 年前。還有一些其他的第三方樣式拓展庫,質量參差不齊。

使用成本和后期的維護成本很高,不得不放棄。

ExcelJS

ExcelJS 終于可以了

ExcelJS[5] 周下載量 450k,github star 9k,并且擁有中文文檔,對國內開發者很友好。雖然文檔是以 README 的形式,可讀性不太好,但重在內容,常用的功能基本都有覆蓋。

最近更新時間是 6 個月內,試用了一下,集成很簡單,再加之文檔豐富,就選它了。

npm install exceljs
npm install file-saver // 下載到本地還需要另一個庫:file-saver

基本操作

//導入ExcelJS
import ExcelJS from"exceljs";

//下載文件
download_file(buffer, fileName) {
console.log("導出");
let fileURL = window.URL.createObjectURL(new Blob([buffer]));
let fileLink = document.createElement("a");
fileLink.href = fileURL;
fileLink.setAttribute("download", fileName);
document.body.appendChild(fileLink);
fileLink.click();
}

導出 xlsx 表格的代碼

//下面是導出的函數
asyncexport() {
const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet("Sheet1");
//這里是數據列表
const data = [
{ id: 1, name: "艾倫", age: 20, sex: "男", achievement: 90 },
{ id: 2, name: "柏然", age: 25, sex: "男", achievement: 86 },
];
// 設置列,這里的width就是列寬
worksheet.columns = [
{ header: "序號", key: "id", width: 10},
       { header: "姓名", key: "name", width: 10 },
];

// 批量插入數據
data.forEach(item => worksheet.addRow(item));

// 寫入文件
const buffer = await workbook.xlsx.writeBuffer();
//下載文件
this.download_file(buffer, "填報匯總.xlsx");
}

設置行高和列寬

列寬上面已經有了,這里說明一下行高怎么設置
worksheet.getRow(2).height = 30;

合并單元格

worksheet.mergeCells("B1:C1");

自定義表格樣式

//設置樣式表格樣式,font里面設置字體大小,顏色(這里是argb要注意),加粗
//alignment 設置單元格的水平和垂直居中
const B1 = worksheet.getCell('B1')
B1.font = { size: 20, color:{ argb: 'FF8B008B' }, bold: true }
B1.alignment = { horizontal: 'center', vertical: 'middle' }

ExcelJS 實戰

import ExcelJS from"exceljs";

//下載文件
download_file(buffer, fileName) {
   console.log("導出");
   let fileURL = window.URL.createObjectURL(new Blob([buffer]));
   let fileLink = document.createElement("a");
   fileLink.href = fileURL;
   fileLink.setAttribute("download", fileName);
   document.body.appendChild(fileLink);
   fileLink.click();
},
async exportClick() {
   const loading = this.$loading({
     lock: true,
     text: "數據導出中,請耐心等待!",
     spinner: "el-icon-loading",
     background: "rgba(0, 0, 0, 0.7)",
   });

 this.tableData = [
   { a: 1, b:2 }
 ]
 const enterpriseVisitsColumns = [
   {
       prop: "a",
       label: "銀行",
     },
     {
       prop: "b",
       label: "企業數",
     }
 ]

   // 表格數據:this.tableData
   if (!(this.tableData && this.tableData.length)) {
     this.$message.info("暫無數據");
     loading.close();
     return;
   }

   let tableName = this.tableName; // 表格名
   const workbook = new ExcelJS.Workbook();
   const worksheet = workbook.addWorksheet(tableName);
   const props = enterpriseVisitsColumns();
   //這里是數據列表
   const data = this.tableData;
   // 設置列,這里的width就是列寬
   let arr = [];
   props.forEach((p) => {
   arr.push({
       header: p.label,
       key: p.prop,
       width: 25,
   });
   });
   worksheet.columns = arr;

   // 插入一行到指定位置,現在我往表格最前面加一行,值為表名
   const rowIndex = 1; // 要插入的行位置
   const newRow = worksheet.insertRow(rowIndex);
   // 設置新行的單元格值
   newRow.getCell(1).value = tableName; // 值為表名

   // 批量插入數據,上面插一條,這里就是從第二行開始加
   data.forEach((item) => worksheet.addRow(item));

   //設置樣式表格樣式,font里面設置字體大小,顏色(這里是argb要注意),加粗
   //alignment 設置單元格的水平和垂直居中
   // const B1 = worksheet.getCell("B1");
   // B1.font = { size: 20, color: { argb: "FF8B008B" }, bold: true };
   // B1.alignment = { horizontal: "center", vertical: "middle" };

   // 合并單元格,就是把A1開始到J1的單元格合并
   worksheet.mergeCells("A1:J1");

   // 批量設置所有表格數據的樣式
   worksheet.eachRow((row, rowNumber) => {
   let size = rowNumber == 1 ? 16 : rowNumber == 2 ? 12 : "";
   //設置表頭樣式
   row.eachCell((cell) => {
       cell.font = {
       size,
       // color:{ argb: 'FF8B008B' },
       bold: true,
       };
       cell.alignment = { horizontal: "center", vertical: "middle" };
   });

   //設置所有行高
   row.height = 30;
   });

   // 寫入文件
   const buffer = await workbook.xlsx.writeBuffer();
   //下載文件
   this.download_file(buffer, tableName + ".xlsx");

   loading.close();
},

后記

導出功能并不是說都是前端或者后端實現,要具體情況,具體分析,我相信哪方都可以做,但誰適合做,這個才是我們需要去思考的。

就如同我們項目中,該例子后面也是前端實現的,大數據分頁當然還是得后端同學來實現較好。


該文章在 2024/3/30 0:40:03 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved