|
|
@@ -1,243 +0,0 @@
|
|
|
-import X2js from 'x2js'
|
|
|
-import XLSX from 'xlsx'
|
|
|
-import axios from 'axios'
|
|
|
-/**
|
|
|
- * 围岩表格解析服务
|
|
|
- * 来源以模板为准
|
|
|
- */
|
|
|
-class FormAnalyticalServer {
|
|
|
- constructor() {
|
|
|
- console.warn('该服务需要特定数据模板')
|
|
|
- this.XLSX = XLSX
|
|
|
- this.X2js = new X2js()
|
|
|
- this.Axios = axios
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 钻进参数xml解析
|
|
|
- * @param {File} file file
|
|
|
- * @return srcData
|
|
|
- */
|
|
|
- async CountdrillingParameterObj(file) {
|
|
|
- const url = window.URL.createObjectURL(file)
|
|
|
- const res = await this.Axios.get(url)
|
|
|
- const jsonObj = this.X2js.xml2js(res)
|
|
|
- const xmlData = jsonObj.Workbook.Worksheet.Table.Row
|
|
|
- const srcData = []
|
|
|
- for (const i in xmlData) {
|
|
|
- const rowData = xmlData[i].Cell
|
|
|
- const arr = []
|
|
|
- for (const j in rowData) {
|
|
|
- if (rowData[j].Data && rowData[j].Data.__text) {
|
|
|
- arr.push(rowData[j].Data.__text)
|
|
|
- }
|
|
|
- }
|
|
|
- srcData.push(arr)
|
|
|
- }
|
|
|
- return srcData
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 地质素描EXCEL解析
|
|
|
- * @param {File} file file
|
|
|
- * @return geologicalSketchObj
|
|
|
- */
|
|
|
- async CountGeologicalSketchObj(file) {
|
|
|
- const data = await this.XLSX2JSON(file)
|
|
|
- const mileageTime = new Date(data[0].__EMPTY_9).getTime() / 1000
|
|
|
- const date = new Date(data[23].__EMPTY_5).getTime() / 1000
|
|
|
- const geologicalSketchObj = {
|
|
|
- tunnelName: data[0].__EMPTY, // 隧道
|
|
|
- workArea: data[0].__EMPTY_2, // 工区
|
|
|
- workFace: data[0].__EMPTY_4, // 工作面
|
|
|
- mileage: data[0].__EMPTY_6, // 断面里程
|
|
|
- mileageTime: mileageTime || '', // 时间
|
|
|
- tunnelNumber: data[1].__EMPTY, // 项目编号
|
|
|
- faceSize: {
|
|
|
- width: data[2].__EMPTY_2, // 开挖宽度
|
|
|
- height: data[2].__EMPTY_4, // 开挖高度
|
|
|
- faceNum: data[2].__EMPTY_6, // 开挖面积
|
|
|
- methods: data[2].__EMPTY_8, // 开挖方法
|
|
|
- support: data[2].__EMPTY_10 // 超前支护类型
|
|
|
- },
|
|
|
- lithology: data[3].__EMPTY_1, // 地层岩性
|
|
|
- choose1: data[4].__EMPTY_1, // 风化程度
|
|
|
- choose2: data[5].__EMPTY_1, // 岩石强度(MPa)
|
|
|
- choose12: data[6].__EMPTY_1, // 岩体结构类型
|
|
|
- choose3: data[7].__EMPTY_1, // 主要结构面组数
|
|
|
- choose4: data[8].__EMPTY_1, // 结构面平均间距(m)
|
|
|
- choose5: data[9].__EMPTY_1, // 结构面发育程度
|
|
|
- choose6: data[10].__EMPTY_1, // 裂隙宽度(mm)
|
|
|
- choose7: data[11].__EMPTY_1, // 裂隙充填物
|
|
|
- choose13: data[12].__EMPTY_1, // 结构面粗糙程度
|
|
|
- choose8: data[13].__EMPTY_1, // 结合程度
|
|
|
- choose9: data[14].__EMPTY_1, // 完整程度
|
|
|
- choose10: data[15].__EMPTY_1, // 地下水状态
|
|
|
- choose11: data[17].__EMPTY_1, // 地应力状态
|
|
|
- mainStructural: {
|
|
|
- text1: data[16].__EMPTY_2, // 主要结构面走向
|
|
|
- text2: data[16].__EMPTY_4, // 主要结构面倾角
|
|
|
- text3: data[16].__EMPTY_6, // 与洞轴线夹角
|
|
|
- text4: data[16].__EMPTY_8 // 备注
|
|
|
- }, // 主要结构面产状及与洞轴线夹角
|
|
|
- grade: data[18].__EMPTY_1, // 围岩亚级划分
|
|
|
- stability: data[19].__EMPTY_1, // 掌子面稳定性划分
|
|
|
- describeText: data[20].__EMPTY_1, // 描述
|
|
|
- personCompany: {
|
|
|
- tabulation: data[22].__EMPTY_1, // 制表
|
|
|
- review: data[22].__EMPTY_5, // 复核
|
|
|
- supervisor: data[22].__EMPTY_9, // 监理工程师
|
|
|
- company: data[23].__EMPTY_1, // 施工单位
|
|
|
- date: date || '' // 日期
|
|
|
- }
|
|
|
- }
|
|
|
- return geologicalSketchObj
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 围岩设计等级excel解析
|
|
|
- * @param {File} file file
|
|
|
- * @return DesignDb
|
|
|
- */
|
|
|
- async CountDesign(file) {
|
|
|
- const data = await this.XLSX2JSON(file)
|
|
|
- const DesignDb = []
|
|
|
- for (let j = 0; j < data.length; j++) {
|
|
|
- const el = data[j]
|
|
|
- DesignDb.push({
|
|
|
- workFace: el['工作面'],
|
|
|
- workArea: el['工区'],
|
|
|
- startMileage: el['开始里程'],
|
|
|
- endMileage: el['结束里程'],
|
|
|
- supportingDesign: el['洞身支护设计级别'],
|
|
|
- type: el['类型'],
|
|
|
- designRock: el['设计围岩级别'],
|
|
|
- forepolingDesign: el['超前支护设计级别'],
|
|
|
- tunnel: el['隧道']
|
|
|
- })
|
|
|
- }
|
|
|
- return DesignDb
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * EXCEL2JSON
|
|
|
- * @param {FILE} FILE
|
|
|
- * @return JSON
|
|
|
- */
|
|
|
- async XLSX2JSON(FILE) {
|
|
|
- const reader = new FileReader()
|
|
|
- reader.readAsBinaryString(FILE)
|
|
|
- const JSON = await new Promise((resolve, reject) => {
|
|
|
- reader.onload = (e) => {
|
|
|
- const wb = this.XLSX.read(e.target.result, {
|
|
|
- type: 'binary'
|
|
|
- }) // 读取完成的数据
|
|
|
- // 转成json header解析第一行标题,只解析最后一个标签
|
|
|
- const lastexcel = wb.SheetNames[wb.SheetNames.length - 1]
|
|
|
- const data = this.XLSX.utils.sheet_to_json(wb.Sheets[lastexcel], { dateNF: 'yyyy/mm/dd', raw: false })
|
|
|
- resolve(data)
|
|
|
- }
|
|
|
- })
|
|
|
- return JSON
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 导出excel
|
|
|
- * @param fileName 保存文件名
|
|
|
- * @param table table表格DOM
|
|
|
- */
|
|
|
- outfile(fileName, table) {
|
|
|
- try {
|
|
|
- const sheet1 = XLSX.utils.table_to_sheet(table, { raw: true })
|
|
|
- const blob2 = this.sheets2book2blob([ sheet1 ])
|
|
|
- this.openDownloadDialog(blob2, `${fileName}.xlsx`)
|
|
|
- } catch (error) {
|
|
|
- console.error('导出错误')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * sheet转blob
|
|
|
- * @param params sheet参数arr|obj
|
|
|
- * @returns
|
|
|
- */
|
|
|
- sheets2book2blob(params) {
|
|
|
- let blob = null
|
|
|
- if (params && params.length > 0) {
|
|
|
- const workbook = {
|
|
|
- SheetNames: [],
|
|
|
- Sheets: {}
|
|
|
- }
|
|
|
- // 参数两种模式纯arr || arrobj
|
|
|
- for (let k = 0; k < params.length; k++) {
|
|
|
- const el = params[k]
|
|
|
- if (el.db && el.name) {
|
|
|
- workbook.SheetNames.push(el.name)
|
|
|
- workbook.Sheets[el.name] = el.db
|
|
|
- } else {
|
|
|
- workbook.SheetNames.push(`sheet${k}`)
|
|
|
- workbook.Sheets[`sheet${k}`] = el
|
|
|
- }
|
|
|
- }
|
|
|
- // 生成excel的配置项
|
|
|
- const wopts = {
|
|
|
- bookType: 'xlsx', // 要生成的文件类型
|
|
|
- bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
|
|
|
- type: 'binary'
|
|
|
- }
|
|
|
- const wbout = XLSX.write(workbook, wopts)
|
|
|
- blob = new Blob([ this.s2ab(wbout) ], { type: 'application/octet-stream' })
|
|
|
- }
|
|
|
- return blob
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 字符串转ArrayBuffer
|
|
|
- * @param s 字符串
|
|
|
- */
|
|
|
- s2ab(s) {
|
|
|
- const buf = new ArrayBuffer(s.length)
|
|
|
- const view = new Uint8Array(buf)
|
|
|
- for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
|
|
|
- return buf
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 下载
|
|
|
- * @param url 文件blob
|
|
|
- * @param fileName 文件名
|
|
|
- */
|
|
|
- openDownloadDialog(url, fileName) {
|
|
|
- if (typeof url === 'object' && url instanceof Blob) {
|
|
|
- url = URL.createObjectURL(url) // 创建blob地址
|
|
|
- }
|
|
|
- const aLink = document.createElement('a')
|
|
|
- aLink.href = url
|
|
|
- aLink.download = fileName || '' // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
|
|
|
- let 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)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-export default new FormAnalyticalServer()
|