前端导入解析excel数据,上传文件(图片,excel,zip,word等)
import XLSX from 'xlsx'
import ExcelJS from 'exceljs'
import { Trim } from '@/utils'
import { sheetColumn } from '@/utils/excelHeader.js'
import lodash from 'lodash'
export const createExcelFileExcelJS = async (arr, fileName = `下载文件.xlsx`) => {
let list = lodash.cloneDeep(arr || [])
let sheetData = []
for (let i = 0, len = list.length; i < len; i++) {
let v = list[i]
let obj = {
Id: 1,
BillNo: 2,
ServiceCode: 3,
CustomerGroupName: 4,
ForecastNumber: 5,
TrackingNumber: 6,
CustomerOrderNumber: 7,
SystemMoney: 8,
ErrataFeeItemName: '',
ErrataFee: '',
ErrataTotalFee: '',
ErrataNote: 9,
items: `111`
}
sheetData.push(obj)
}
const wb = new ExcelJS.Workbook()
const sheet = wb.addWorksheet('Sheet1')
sheet.columns = sheetColumn
sheet.addRows(sheetData)
for (let i = 0, len = sheetData.length; i < len; i++) {
sheet.getCell(i + 1, 9).dataValidation = {
type: 'list',
formulae: ['"One,Two,Three,Four"']
}
}
const buffer = await wb.xlsx.writeBuffer()
var blob = new Blob([buffer], {
type: 'application/octet-stream'
})
var url = blob
if (typeof url == 'object' && url instanceof Blob) {
url = URL.createObjectURL(url)
}
var aLink = document.createElement('a')
aLink.href = url
aLink.download = fileName || ''
var event
if (window.MouseEvent) event = new MouseEvent('click')
else {
event = document.createEvent('MouseEvents')
event.initMouseEvent(
'click',
true,
false,
window,
0,
0,
0,
0,
0,
false,
false,
false,
false,
0,
null
)
}
aLink.dispatchEvent(event)
return
}
export function importExcel(
file,
colnumData,
colnumData2 = undefined,
compareField = undefined
) {
let rABS = false
const types = file.name.split('.').pop()
let dataList = []
const fileType = ['xlsx', 'xls'].some(item => item === types)
if (!fileType) {
return
}
return new Promise(function (resolve, reject) {
file2Xce(file).then(tabJson => {
if (tabJson && tabJson.length > 0) {
let columnMapping = colnumData
const colnumName = Object.values(columnMapping)
let isArea = false
let dataArr = tabJson[0].sheet
let billWeight = 0
dataArr.forEach(item => {
let itemMap = new Map()
for (let key in item) {
if (colnumName.includes(Trim(key))) {
if (Trim(key) === '对比方式' && Trim(item[key]) === '区间') {
isArea = true
}
if (Trim(key) === '对账内容' && Trim(item[key]) === '计费重') {
billWeight++
}
itemMap.set(Trim(key), Trim(item[key]))
} else {
reject(key + ' 列名不存在,请核对!')
return
}
}
dataList.push(itemMap)
})
if (billWeight >= 2) {
reject('计费重最多显示一条,请核对!')
return
}
let list = map2json(dataList, colnumData)
let dataList2 = []
let list2 = []
if (isArea && colnumData2) {
let dataArr2 = tabJson[1].sheet
let columnMapping = colnumData2
const colnumName = Object.values(columnMapping)
dataArr2.forEach(item => {
let itemMap = new Map()
for (let key in item) {
if (colnumName.includes(Trim(key))) {
itemMap.set(Trim(key), Trim(item[key]))
} else {
reject(key + ' 列名不存在,请核对!')
return
}
}
dataList2.push(itemMap)
})
list2 = map2json2(dataList2, colnumData2)
}
if (isArea && list2.length === 0) {
reject('对比方式含有区间,区间值 不能为空哦')
return
}
let data = null
let arr = []
list.forEach(item => {
if (item.CompareType === 1) {
data = item
} else {
arr.push(item)
}
})
let arr2 = []
list2.forEach(item => {
if (
Object.prototype.toString.call(item.DifferStart) ===
'[object Undefined]' ||
Object.prototype.toString.call(item.DifferEnd) ===
'[object Undefined]'
) {
reject('对比方式含有区间,区间值 不能为空哦')
return
}
arr2.push({ ...data, ...item })
})
list = [...arr, ...arr2]
if (compareField) {
list.sort((a, b) => a[compareField].localeCompare(b[compareField]))
}
resolve(list)
} else {
reject('EXCEL文件没有数据!')
}
})
})
}
export function importExcelSingle(
file,
colnumData,
sheetIndex = 0,
compareField = undefined
) {
const types = file.name.split('.').pop()
let dataList = []
const fileType = ['xlsx', 'xls'].some(item => item === types)
if (!fileType) {
return
}
return new Promise(function (resolve, reject) {
file2XceSingle(file).then(tabJson => {
if (tabJson && tabJson.length > 0) {
let columnMapping = colnumData
const colnumName = Object.values(columnMapping)
let dataArr = tabJson[sheetIndex].sheet
dataArr.forEach(item => {
let itemMap = new Map()
for (let key in item) {
if (colnumName.includes(Trim(key))) {
itemMap.set(Trim(key), Trim(item[key]))
} else {
reject(key + ' 列名不存在,请核对!')
return
}
}
dataList.push(itemMap)
})
let list = map2json(dataList, colnumData)
if (compareField) {
list.sort(
(a, b) =>
a[compareField] && a[compareField].localeCompare(b[compareField])
)
}
resolve(list)
} else {
reject('EXCEL文件没有数据!')
}
})
})
}
function file2XceSingle(file) {
return new Promise(function (resolve, reject) {
const reader = new FileReader()
reader.onload = function (e) {
const data = e.target.result
this.wb = XLSX.read(data, {
type: 'binary'
})
const result = []
this.wb.SheetNames.forEach(sheetName => {
result.push({
sheetName: sheetName,
sheet: XLSX.utils.sheet_to_json(this.wb.Sheets[sheetName])
})
})
resolve(result)
}
reader.readAsBinaryString(file)
})
}
function map2json2(list, colnumData, list2, colnumData2) {
let datalist = []
let columnMapping = colnumData
const obj = Object.entries(columnMapping)
list.forEach(element => {
let json = {}
for (let [k, v] of element) {
for (let [j, z] of obj) {
if (z === k) {
if (j === 'FieldStauts') {
json[j] = v === '启用' ? 2 : 1
} else if (j === 'CompareType') {
json[j] = v === '差值' ? 2 : 1
} else {
json[Trim(j)] = Trim(v)
}
}
}
}
datalist.push(json)
})
return datalist
}
function file2Xce(file) {
return new Promise(function (resolve, reject) {
const reader = new FileReader()
reader.onload = function (e) {
const data = e.target.result
this.wb = XLSX.read(data, {
type: 'binary'
})
const result = []
this.wb.SheetNames.forEach(sheetName => {
result.push({
sheetName: sheetName,
sheet: XLSX.utils.sheet_to_json(this.wb.Sheets[sheetName])
})
})
resolve(result)
}
reader.readAsBinaryString(file)
})
}
function map2json(list, colnumData) {
let datalist = []
let columnMapping = colnumData
const obj = Object.entries(columnMapping)
list.forEach(element => {
let json = {}
for (let [k, v] of element) {
for (let [j, z] of obj) {
if (z === k) {
if (j === 'FieldStauts') {
json[j] = v === '启用' ? 2 : 1
} else if (j === 'CompareType') {
json[j] = v === '差值' ? 2 : 1
} else {
json[Trim(j)] = Trim(v)
}
}
}
}
datalist.push(json)
})
return datalist
}
第二种 可能是一样的
export function importExcel(
file,
colnumData,
colnumData2 = undefined,
compareField = undefined
) {
let rABS = false
const types = file.name.split('.').pop()
let dataList = []
const fileType = ['xlsx', 'xls'].some(item => item === types)
if (!fileType) {
return
}
return new Promise(function(resolve, reject) {
file2Xce(file).then(tabJson => {
if (tabJson && tabJson.length > 0) {
let columnMapping = colnumData
const colnumName = Object.values(columnMapping)
let isArea = false
let dataArr = tabJson[0].sheet
let billWeight = 0
dataArr.forEach(item => {
let itemMap = new Map()
for (let key in item) {
if (colnumName.includes(Trim(key))) {
if (Trim(key) === '对比方式' && Trim(item[key]) === '区间') {
isArea = true
}
if (Trim(key) === '对账内容' && Trim(item[key]) === '计费重') {
billWeight++
}
itemMap.set(Trim(key), Trim(item[key]))
} else {
reject(key + ' 列名不存在,请核对!')
return
}
}
dataList.push(itemMap)
})
if (billWeight >= 2) {
reject('计费重最多显示一条,请核对!')
return
}
let list = map2json(dataList, colnumData)
let dataList2 = []
let list2 = []
if (isArea && colnumData2) {
let dataArr2 = tabJson[1].sheet
let columnMapping = colnumData2
const colnumName = Object.values(columnMapping)
dataArr2.forEach(item => {
let itemMap = new Map()
for (let key in item) {
if (colnumName.includes(Trim(key))) {
itemMap.set(Trim(key), Trim(item[key]))
} else {
reject(key + ' 列名不存在,请核对!')
return
}
}
dataList2.push(itemMap)
})
list2 = map2json2(dataList2, colnumData2)
}
if (isArea && list2.length === 0) {
reject('对比方式含有区间,区间值 不能为空哦')
return
}
let data = null
let arr = []
list.forEach(item => {
if (item.CompareType === 1) {
data = item
} else {
arr.push(item)
}
})
let arr2 = []
list2.forEach(item => {
if (
Object.prototype.toString.call(item.DifferStart) ===
'[object Undefined]' ||
Object.prototype.toString.call(item.DifferEnd) ===
'[object Undefined]'
) {
reject('对比方式含有区间,区间值 不能为空哦')
return
}
arr2.push({...data, ...item })
})
list = [...arr, ...arr2]
resolve(list)
} else {
reject('EXCEL文件没有数据!')
}
})
})
}
export function importExcelSingle(
file,
colnumData,
sheetIndex = 0,
compareField = undefined,
isVer = true,
sortColnum = []
) {
const types = file.name.split('.').pop()
let dataList = []
const fileType = ['xlsx', 'xls'].some(item => item === types)
if (!fileType) {
return
}
return new Promise(function(resolve, reject) {
file2XceSingle(file).then(tabJson => {
if (tabJson && tabJson.length > 0) {
let columnMapping = colnumData
let colnum = Object.values(columnMapping)
let colnumName = []
for (let i = 0, len = colnum.length; i < len; i++) {
let item = colnum[i]
colnumName.push(item.replace(/\s*/g, ''))
}
let dataArr = tabJson[sheetIndex].sheet
dataArr.forEach((item, i) => {
let itemMap = new Map()
let colName = []
for (let key in item) {
if (isVer) {
if (colnumName.includes(Trim(key))) {
if (!colName.includes(Trim(key))) {
colName.push(Trim(key))
}
itemMap.set(Trim(key), Trim(item[key]))
} else {
if (key === '__EMPTY') {
reject('列名为空那列,存在多余数据,请核对!')
return
}
reject(key + ' 列名不存在,请核对!')
return
}
} else {
colnumName.forEach((v, i) => {
let str = `${v}`
let str2 = `${Trim(key)}`
if (str2 == str) {
itemMap.set(Trim(key), Trim(item[key]))
}
})
}
}
if (isVer && sortColnum.join('') !== colName.join('')) {
reject(
`${sortColnum.join(
''
)} 等列,导入失败,请检查模版字段或者字段顺序是否符合`
)
return
}
dataList.push(itemMap)
})
let list = map2json(dataList, colnumData)
resolve(list)
} else {
reject('EXCEL文件没有数据!')
}
})
})
}
function file2XceSingle(file) {
return new Promise(function(resolve, reject) {
const reader = new FileReader()
reader.onload = function(e) {
const data = e.target.result
this.wb = XLSX.read(data, {
type: 'binary'
})
const result = []
const sheet2JSONOpts = {
defval: ''
}
this.wb.SheetNames.forEach(sheetName => {
result.push({
sheetName: sheetName,
sheet: XLSX.utils.sheet_to_json(
this.wb.Sheets[sheetName],
sheet2JSONOpts
)
})
})
resolve(result)
}
reader.readAsBinaryString(file)
})
}
function map2json2(list, colnumData, list2, colnumData2) {
let datalist = []
let columnMapping = colnumData
const obj = Object.entries(columnMapping)
list.forEach(element => {
let json = {}
for (let [k, v] of element) {
for (let [j, z] of obj) {
if (z === k) {
if (j === 'FieldStauts') {
json[j] = v === '启用' ? 2 : 1
} else if (j === 'CompareType') {
json[j] = v === '差值' ? 2 : 1
} else {
json[Trim(j)] = Trim(v)
}
}
}
}
datalist.push(json)
})
return datalist
}
function file2Xce(file) {
return new Promise(function(resolve, reject) {
const reader = new FileReader()
reader.onload = function(e) {
const data = e.target.result
this.wb = XLSX.read(data, {
type: 'binary'
})
const result = []
const sheet2JSONOpts = {
defval: ''
}
this.wb.SheetNames.forEach(sheetName => {
result.push({
sheetName: sheetName,
sheet: XLSX.utils.sheet_to_json(
this.wb.Sheets[sheetName],
sheet2JSONOpts
)
})
})
resolve(result)
}
reader.readAsBinaryString(file)
})
}
function map2json(list, colnumData) {
let datalist = []
let columnMapping = colnumData
const obj = Object.entries(columnMapping)
list.forEach(element => {
let json = {}
for (let [k, v] of element) {
for (let [j, z] of obj) {
if (z === k) {
if (j === 'FieldStauts') {
json[j] = v === '启用' ? 2 : 1
} else if (j === 'CompareType') {
json[j] = v === '差值' ? 2 : 1
} else {
json[Trim(j)] = Trim(v)
}
}
}
}
datalist.push(json)
})
return datalist
}