Files
cmdb/cmdb-ui/src/utils/download.js
2023-07-10 20:07:20 +08:00

76 lines
2.4 KiB
JavaScript

import moment from 'moment'
import XLSX from 'xlsx'
import XLSXS from 'xlsx-js-style'
export const downloadTxt = ({ text, title }) => {
const dom = document.createElement('a')
dom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text))
dom.setAttribute('download', `${title}.txt`)
if (document.createEvent) {
var event = document.createEvent('MouseEvents')
event.initEvent('click', true, true)
dom.dispatchEvent(event)
} else {
dom.click()
}
}
export const downloadExcel = (data, fileName = `${moment().format('YYYY-MM-DD HH:mm:ss')}.xls`) => {
// STEP 1: Create a new workbook
const wb = XLSXS.utils.book_new()
// STEP 2: Create data rows and styles
const rowArray = data
// STEP 3: Create worksheet with rows; Add worksheet to workbook
const ws = XLSXS.utils.aoa_to_sheet(rowArray)
XLSXS.utils.book_append_sheet(wb, ws, fileName)
let maxColumnNumber = 1 // 默认最大列数
rowArray.forEach(item => { if (item.length > maxColumnNumber) { maxColumnNumber = item.length } })
// 合并 #将第一行标题列合并
// const merges = ['A1:' + String.fromCharCode(64 + parseInt(maxColumnNumber)) + '1']
const merges = ['A1:' + createCellPos(maxColumnNumber - 1) + '1']
const wsMerge = []
merges.map((item) => {
wsMerge.push(
XLSXS.utils.decode_range(item)
)
})
ws['!merges'] = wsMerge
// 添加列宽
ws['!cols'] = (rowArray[1].map(item => {
return { width: 22 }
}))
// 添加行高
ws['!rows'] = [{ 'hpt': 80 }]
// STEP 4: Write Excel file to browser #导出
XLSXS.writeFile(wb, fileName + '.xlsx')
}
export const excel2Array = (fileObj) => {
return new Promise(function (resolve) {
const reader = new FileReader()
reader.readAsBinaryString(fileObj)
reader.onload = function (e) {
const data = e.target.result
const workbook = XLSX.read(data, { type: 'binary' })
const sheet = workbook.Sheets[workbook.SheetNames[0]]
const lt = XLSX.utils.sheet_to_json(sheet, { header: 1 })
resolve(lt)
}
})
}
export const createCellPos = (n) => {
const ordA = 'A'.charCodeAt(0)
const ordZ = 'Z'.charCodeAt(0)
const len = ordZ - ordA + 1
let s = ''
while (n >= 0) {
s = String.fromCharCode(n % len + ordA) + s
n = Math.floor(n / len) - 1
}
return s
}