From 583347ba70d18fc5685f87bbf557e5c91a154576 Mon Sep 17 00:00:00 2001 From: fks-yangshouda Date: Thu, 29 Aug 2024 15:26:37 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9B=91=E6=8E=A7=E4=B8=AD=E5=BF=83=E5=90=84?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=AF=BC=E5=87=BA=E8=A1=A8=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hx-ai-intelligent/src/util/ExcelUtil.js | 164 ++++++++++-------- .../src/view/monitor/deviceMonitor/page.vue | 4 + .../monitor/deviceMonitor/table/index.vue | 5 + .../view/monitor/deviceMonitor/tree/index.vue | 22 +-- .../energyMonitor/analysisTable/index.vue | 150 ++++++++++++++++ .../energyMonitor/graphTable/index.vue | 5 + .../src/view/monitor/energyMonitor/page.vue | 26 ++- .../view/monitor/energyMonitor/tree/index.vue | 26 +-- .../environmentMonitor/averageData/index.vue | 5 +- .../environmentMonitor/historyData/index.vue | 6 +- 10 files changed, 304 insertions(+), 109 deletions(-) diff --git a/hx-ai-intelligent/src/util/ExcelUtil.js b/hx-ai-intelligent/src/util/ExcelUtil.js index 85296e2..db76c78 100644 --- a/hx-ai-intelligent/src/util/ExcelUtil.js +++ b/hx-ai-intelligent/src/util/ExcelUtil.js @@ -10,10 +10,43 @@ import FileSaver from 'file-saver'; // export default exportExcel; // 导出excel文件 -export function exportExcel (tableColumns,data,fillName,isMerge,start,end) { +/** + * + * @param {*} tableColumns 表头 + * @param {*} data 数据 + * @param {*} fillName 文件名 + * @param {*} isMerge 是否合并单元格 + * @param {*} firstKey 第一个字段的key,用来判断序号列是否合并 + * @param {*} start 合并单元格开始列 + * @param {*} end 合并单元格结束列 + * @returns + */ +export function exportExcel (tableColumns,data,fillName,isMerge = false, firstKey = '',start = 0, end = 0) { + debugger if (!data || data.length == 0) { return; } + if (isMerge) { + // 需要合并序号 + for (let i = 0; i < data.length; i++) { + // 自定义单元格内容,这里返回序号 + if (i == 0) { + data[i].index = 1; + // return 1; + } else if (data[i - 1][firstKey] == data[i][firstKey]) { + data[i].index = data[i - 1].index; + // return data.value[index].index; + } else { + data[i].index = data[i - 1].index + 1; + } + } + } else { + // 不需要合并序号 + for (let i = 0; i < data.length; i++) { + data[i].index = i + 1; + } + } + // 创建工作簿 const workbook = new ExcelJS.Workbook(); // 添加工作表,名为sheet1 @@ -33,27 +66,22 @@ export function exportExcel (tableColumns,data,fillName,isMerge,start,end) { columns.push({ header: tableColumns[i].title, key: tableColumns[i].dataIndex, - width: tableColumns[i].width / 5, + width: tableColumns[i].width ? tableColumns[i].width / 5 : 20, }); } } //传入的数据 const list = data; + //格式化数据 const datas = formatJson(filterVal, list); - // // 导出数据列表 - // const data = [ - // { 姓名: '张三', 年龄: 18, 身高: 175, 体重: 74 }, - // { 姓名: '李四', 年龄: 22, 身高: 177, 体重: 84 }, - // { 姓名: '王五', 年龄: 53, 身高: 155, 体重: 64 }, - // ]; // 获取表头所有键 // const headers = Object.keys(data[0]); + // 获取表头 sheet1.columns = columns; - // // 将标题写入第一行 - // sheet1.addRow(tHeader); + // 将数据写入工作表 datas.forEach((row) => { // const values = Object.values(row); @@ -62,80 +90,30 @@ export function exportExcel (tableColumns,data,fillName,isMerge,start,end) { // 判断是否合并单元格 if (isMerge) { - debugger - // 遍历列,从第一列到 end 列 + // 遍历列,从 start 列到 end 列 for (let col = start; col <= end; col++) { - // let mergeStartRow = 2; // 每次新列开始时,重置起始行 for (let row = 3; row <= datas.length + 1; row++) { const currentCellValue = sheet1.getCell(row, col).value; const previousCellValue = sheet1.getCell(row - 1, col).value; - let currentCellValue_1 = '' - let previousCellValue_1 = '' + // 从第二列开始就要看前一列是否已经合并 + let isMerged = true if (col > 1) { - currentCellValue_1 = sheet1.getCell(row, col-1).value; - previousCellValue_1 = sheet1.getCell(row - 1, col-1).value; + isMerged = ifMerged(sheet1,row - 1, col-1,row, col-1) } - if (currentCellValue === previousCellValue && currentCellValue_1 === previousCellValue_1) { - // 当前列有变化,检查是否需要合并前面的单元格 - // if (mergeStartRow < row - 1) { - // 只有在前面的行有超过1个时才合并 - sheet1.mergeCells(row, col, row - 1, col); - // } - // 更新起始行 - // mergeStartRow = row; + if (currentCellValue === previousCellValue && isMerged) { + // 检查是上边需要合并的单元格是否已经合并 + const mergeInfo = getMergeInfo(sheet1, row - 1, col) + if ( mergeInfo.isMerged ) { + sheet1.unMergeCells( mergeInfo.startRow, col, row - 1, col); + sheet1.mergeCells(mergeInfo.startRow, col, row, col); + } else { + sheet1.mergeCells(row, col, row - 1, col); + } } - - // // 如果是最后一行,检查是否需要合并 - // if (row === datas.length + 1 && mergeStartRow < row) { - // sheet1.mergeCells(mergeStartRow, col, row, col); - // } } } - // 从第一列开始逐列检查,前提是前面的列已合并 - // for (let col = start; col <= end; col++) { - // let startRow = 2; // 从数据开始的第二行开始检查 - // let endRow = 2; - - // while (endRow <= sheet1.rowCount) { - // let currentValue = sheet1.getCell(endRow, col).value; - // let prevValue = sheet1.getCell(endRow - 1, col).value; - - // // 如果当前值等于前一个值,且前面的列是合并的,则继续合并 - // if (currentValue === prevValue) { - // let mergeAllowed = true; - // for (let prevCol = 1; prevCol < col; prevCol++) { - // let range = sheet1.getCell(endRow - 1, prevCol).master; - // if (range && range.row !== startRow) { - // mergeAllowed = false; - // break; - // } - // } - - // if (mergeAllowed) { - // endRow++; - // } else { - // // 不允许合并,直接移动起始行到当前行 - // startRow = endRow; - // endRow++; - // } - // } else { - // // 当前值不等于前一个值或合并不允许,进行合并操作 - // if (startRow < endRow - 1) { - // sheet1.mergeCells(startRow, col, endRow - 1, col); - // } - // startRow = endRow; - // endRow++; - // } - // } - - // // 处理最后一段相同的单元格 - // if (startRow < endRow - 1) { - // sheet1.mergeCells(startRow, col, endRow - 1, col); - // } - // } - } @@ -208,3 +186,43 @@ function formatJson (filterVal, jsonData) { return jsonData.map((v) => filterVal.map((j) => v[j])); }; +/** + * 获取给定行和列的单元格是否为合并单元格,并返回合并起始行 + * @param {Worksheet} worksheet - ExcelJS 工作表对象 + * @param {number} row - 单元格的行号 (从 1 开始) + * @param {number} col - 单元格的列号 (从 1 开始) + * @returns {Object} - 返回一个对象,包含 isMerged 和 startRow 属性 + */ +function getMergeInfo(worksheet, row, col) { + // 遍历所有的合并范围 + for (const mergeRange in worksheet._merges) { + if (worksheet._merges.hasOwnProperty(mergeRange)) { + const { top, left, bottom, right } = worksheet._merges[mergeRange]; + + // 检查行列是否在当前合并范围内 + if (row >= top && row <= bottom && col >= left && col <= right) { + return { isMerged: true, startRow: top }; // 找到合并范围,返回合并信息 + } + } + } + return { isMerged: false, startRow: null }; // 单元格不在任何合并范围内 +} + + +// 函数:检查两个单元格是否属于同一个合并区域 +function ifMerged(worksheet, row1, col1, row2, col2) { + const merges = worksheet._merges; // 获取所有的合并区域 + for (let mergeAddress in merges) { + const mergeRange = merges[mergeAddress]; + const { top, left, bottom, right } = mergeRange; + + const isCell1InRange = (row1 >= top && row1 <= bottom && col1 >= left && col1 <= right); + const isCell2InRange = (row2 >= top && row2 <= bottom && col2 >= left && col2 <= right); + + if (isCell1InRange && isCell2InRange) { + return true; + } + } + return false; +} + diff --git a/hx-ai-intelligent/src/view/monitor/deviceMonitor/page.vue b/hx-ai-intelligent/src/view/monitor/deviceMonitor/page.vue index 73f7abc..7b8759b 100644 --- a/hx-ai-intelligent/src/view/monitor/deviceMonitor/page.vue +++ b/hx-ai-intelligent/src/view/monitor/deviceMonitor/page.vue @@ -52,6 +52,10 @@ if (graphRef.value) { graphRef.value.downloadChart(); } + } else { + if (tableRef.value) { + tableRef.value.export1(); + } } }; diff --git a/hx-ai-intelligent/src/view/monitor/deviceMonitor/table/index.vue b/hx-ai-intelligent/src/view/monitor/deviceMonitor/table/index.vue index be0f37f..eb18c17 100644 --- a/hx-ai-intelligent/src/view/monitor/deviceMonitor/table/index.vue +++ b/hx-ai-intelligent/src/view/monitor/deviceMonitor/table/index.vue @@ -16,6 +16,7 @@