1. 程式人生 > >Excel 檔案匯出 js-xlsx合併單元格的實現 (vue)

Excel 檔案匯出 js-xlsx合併單元格的實現 (vue)

頁面資料如下圖:

export default {
 data() {
    return {
	tableData: [],
	colData: [],
	 originData: [{"skuId":"00001","skuName":"nameSku0001","w00001":{"warehouseId":"w00001","warehouseName":"倉庫1","quantity":50,"lockQuantity":5,"availableQuantity":45},"w00002":{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},"w00003":{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":40,"lockQuantity":1,"availableQuantity":39}},{"skuId":"00002","skuName":"nameSku0002","warehouseItem":[{"warehouseId":"w00001","warehouseName":"倉庫1","quantity":100,"lockQuantity":5,"availableQuantity":95},{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":5,"lockQuantity":5,"availableQuantity":0}],"w00001":{"warehouseId":"w00001","warehouseName":"倉庫1","quantity":100,"lockQuantity":5,"availableQuantity":95},"w00002":{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},"w00003":{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":5,"lockQuantity":5,"availableQuantity":0}},{"skuId":"00003","skuName":"nameSku0003","warehouseItem":[{"warehouseId":"w00001","warehouseName":"倉庫2","quantity":100,"lockQuantity":5,"availableQuantity":95},{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":50,"lockQuantity":5,"availableQuantity":45}],"w00001":{"warehouseId":"w00001","warehouseName":"倉庫2","quantity":100,"lockQuantity":5,"availableQuantity":95},"w00002":{"warehouseId":"w00002","warehouseName":"倉庫2","quantity":200,"lockQuantity":5,"availableQuantity":195},"w00003":{"warehouseId":"w00003","warehouseName":"倉庫3","quantity":50,"lockQuantity":5,"availableQuantity":45}}]
	}
 }
 methods: {
  initData() {
      this.tableData = this.originData.map(res => {
        res.warehouseItem.forEach(item => {
          res[item.warehouseId] = item
        })
        return res
      })
      this.originData[0].warehouseItem.forEach((res) => {
        this.colData.push({
          dataItem: res.warehouseId,
          dataName: res.warehouseName
        })
      })
    },
 exportList() {
      const wscols = [
        { wpx: 220 } // 第一列寬度設定單位px
      ]
      /**
       * 合併單元格元素(decode_range方法解析資料格式)
       {
          s: { //s start 開始
            c: 1,//cols 開始列
            r: 0 //rows 開始行
          },
          e: {//e end  結束
            c: 4,//cols 結束列
            r: 0 //rows 結束行
          }
        }
       */
      const wsMerge = [XLSX.utils.decode_range('A1:A2')]
      /** 頭部-行列資訊*/
      const header1 = this.colData.map(res => res.dataName).concat('合計')

      header1.map((res, idx, array) => {
        const hdMergeObj = {
          s: { r: 0 },
          e: { r: 0 }
        }
        if ((idx + 2) % 1 === 0) {
          array.splice(3 * idx + 1, 0, '', '')
          hdMergeObj['s']['c'] = 3 * idx + 1
          hdMergeObj['e']['c'] = hdMergeObj['s']['c'] + 2
          wsMerge.push(hdMergeObj)
        }
        return res
      })
      const header2 = this.colData.map(() => '庫存數量').concat('庫存數量')
      header2.map((res, idx, array) => {
        if ((idx + 2) % 1 === 0) {
          array.splice(3 * idx + 1, 0, '鎖定數量', '可用數量')
        }
        return res
      })
      const ws = XLSX.utils.aoa_to_sheet([
        ['商品資訊'].concat(header1),
        [''].concat(header2)
      ])
      // console.log('header1', ['商品資訊'].concat(header1))
      // console.log(header2)
      /** 商品資訊-行列資訊*/
      const skuInfo = this.tableData.map(res => res.skuId + '\r\n' + res.skuName)
      XLSX.utils.sheet_add_aoa(ws, skuInfo.map(res => [res]), { origin: 'A3' })
      /** 倉庫-行列資訊(庫存數量,鎖定數量,可用數量)*/
      const unAllowed = ['skuId', 'skuName', 'warehouseItem']
      const sheetData = this.tableData.map((data) => {
        const filterItem = Object.assign({}, data)
        Object.keys(filterItem)
          .filter(key => unAllowed.includes(key))
          .forEach(key => delete filterItem[key])
        // 重構完資料
        let warehouseDatas = []
        Object.values(filterItem).forEach(res => {
          warehouseDatas = warehouseDatas.concat([res.quantity]).concat([res.lockQuantity]).concat([res.availableQuantity])
          return warehouseDatas
        })
        return warehouseDatas
      })
      // console.log('sheetData', sheetData)
      XLSX.utils.sheet_add_aoa(ws, sheetData, { origin: { r: 2, c: 1 }})
      /** 合計-行列資訊*/
      const totalData = this.tableData.map(row => {
        const totlal_quantity = Object.values(row.warehouseItem).map(res => res.quantity).reduce((accumulator, currentValue) => accumulator + currentValue)
        const totlal_lockQuantity = Object.values(row.warehouseItem).map(res => res.lockQuantity).reduce((accumulator, currentValue) => accumulator + currentValue)
        const totlal_availableQuantity = Object.values(row.warehouseItem).map(res => res.availableQuantity).reduce((accumulator, currentValue) => accumulator + currentValue)
        return [totlal_quantity, totlal_lockQuantity, totlal_availableQuantity]
      })
      // console.log('total', totalData, this.colData.length * 3 + 1)
      XLSX.utils.sheet_add_aoa(ws, totalData, { origin: { r: 2, c: this.colData.length * 3 + 1 }})
      // 匯出
      const wb = XLSX.utils.book_new()
      XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
      ws['!cols'] = wscols
      // wsMerge.push(XLSX.utils.decode_range('B1:D1')) // 測試資料 倉庫1模擬資料
      ws['!merges'] = wsMerge
      console.log(wsMerge)
      XLSX.writeFile(wb, '庫存報表按SKU.xlsx')
    }
 }
}

匯出效果如下圖:

相關推薦

Excel 檔案匯出 js-xlsx合併單元實現 vue

頁面資料如下圖: export default { data() { return { tableData: [],

java將資料匯出,帶有合併單元excel--jxls技術

        jxls技術可以生成各種樣式的報表,非常好用,深深地喜歡上了這個。說起用這個還是比較有意思的,當時專案有個匯出表格的功能,但是沒能合併單元格,客戶不是很滿意,當時專案中大家都說弄不了,我想著自己網上查查吧,就查到了這個,試了一下午完成了,很有成就感哪,哈哈。

js控制合併單元-行/列

//函式說明:合併指定表格(表格id為_w_table_id)指定列(列數為_w_table_colnum)的相同文字的相鄰單元格 //引數說明:_w_table_id 為需要進行合併單元格的表格的id。如在HTMl中指定表格 id="data" ,此引數應為 #data

poi匯出資料(需要合併單元)

import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.Invocation

Excel應用技巧:不規則合併單元之批量填充序列

大家好!上一篇文章中,xyz給大家分享了合併單元格的排序方法。今天咱們再來說說合並單元格的另一個

C# Excel 行高,列寬,合併單元,單元邊框線,凍結

private _Workbook _workBook = null; private Worksheet _workSheet = null; private Excel.Application _excelApplicatin = null; _excelApplic

PHPexcel匯出_帶合併單元/邊框背景/_有效果圖_thinkphp

##供稿單位匯出 public function gonggao_excel(){ $color='0xCC000000'; //查詢所有供稿單位 $order='paixu asc,id desc';

Easyui datagrid 動態合併單元實現

最近在頁面開發商遇到了一個新需求,要求在datagrid中實現同名單元格縱向合併效果,類似這樣 官方demo中用的是死資料,不符合實際要求。通過對檢視API,確定datagrid的合併單元格通過提供起始位置(index),合併長度(rowspan)以及合併欄位名(field)。於是

table合併單元 colspan跨列和rowspan跨行

        </td>      </tr>      <tr>         <td   width= "25% ">   </td>           <td   width= "25% ">   </td>  

Spread for Windows Forms快速入門(4)---常用的單元型別

單元格型別定義了在單元格中呈現的資訊的型別,以及這種資訊如何顯示,使用者如何與其進行互動。單元格型別可以被賦給單個的單元格,整行或者整列。 使用者可以使用兩種不同的單元格型別對錶單中的單元格進行設定: 一種是可以簡單地關聯於單元格的文字格式,另一種就是顯示控制元件或者圖形化

python讀取excel檔案中所有sheet表格:openpyxl模組

通過openpyxl模組 迴圈遍歷excel檔案中所有sheet表格。 excel檔案 e:\\t.xlsx ,有2個sheet:   sales 客戶編碼 年月 銷售額(萬元) JLF0001 20

ProtoBuf.js – Protocol Buffers的Javascript實現

line 解決 進行 序列 blank read tar com json 原文鏈接:ProtoBuf.js – Protocol Buffers的Javascript實現 推薦前端網址:http://keenwon.com/ 在Javascript裏比較常見的數據格式就是

Node.js處理 Access-Control-Allow-Origin Vue

第一步:安裝cors庫 npm install koa2-cors   第二步:進入APP.JS檔案 const cors=require('koa2-cors')   //引入 第三步:USE app.use(cors()); &

Laravel Excel實現Excel/CSV檔案匯入匯出的功能詳解合併單元,設定單元樣式

Laravel Excel實現Excel/CSV檔案匯入匯出(合併單元格,設定單元格樣式) 這篇文章主要給大家介紹了關於在Laravel中如何使用Laravel Excel實現Excel/CSV檔案匯入匯出功能的相關資料,文中通過示例程式碼介紹的非常詳細,對大

HSSFWorkbook——匯出excel,動態合併單元

一 前言 開發中,對於匯出一個excel表格這樣的功能很常見,這裡談談我所知道的相關知識 二 需求  匯出某個套餐所關聯的所有專案的一個Excel表格 三 HSSFWorkbook //建立一個Excel檔案 HSSFWorkbook&

POI 匯出Excel實現合併單元以及列自適應寬度

目錄 參考推薦: POI 匯出Excel 1. 合併單元格 POI是apache提供的一個讀寫Excel文件的開源元件,在操作excel時常要合併單元格,合併單元格的方法是: public CellRang

JXL匯出EXCEL合併單元

圖片 import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.servlet.h

POI匯出Excel設定單元格式2--建立與設定Excel合併單元

POI建立與設定Excel合併單元格 話不多說上栗子 //準備工作 XSSFWorkbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet("sheet1"); XSSFCreationHelper creationHel

java poi 讀取有合併單元EXCEL檔案

資料的樣子是這樣的 public String addReportByExcel(Long userId,InputStream inputStream,String fileName) throws BusinessException{ String mes

java匯出Excel合併單元

網上java匯出excel表格併合並單元格的資料不完全,我整理了一份,並親測能用,附截圖。 ①java匯出excel用到POI所有jar包,大家可以直接到下面地址下載點選開啟連結 ②模擬資料類 package org; public class WorkSheetDet