rapid-spreadjs 1.0.28 → 1.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.min.js","sources":["../src/utils/sheet.ts","../src/utils/business.ts","../node_modules/.pnpm/@rollup+plugin-typescript@1_ccba8aa16c5fc04bbd7ba036697931a3/node_modules/tslib/tslib.es6.js","../src/utils/common.ts","../src/utils/echarts-all.ts","../src/utils/echarts.ts","../src/utils/wookbook.ts"],"sourcesContent":["// 导入rapid-utils中的函数(注意:需要在tsconfig.json文件中设置moduleResolution为node,否则会提示:找不到模块“rapid-utils”。你的意思是要将 \"moduleResolution\" 选项设置为 \"nodenext\",还是要将别名添加到 \"paths\" 选项中?ts(2792))\r\nimport { forEachJson, orderByJson, groupByJson } from 'rapid-utils';\r\n// 导入单元格实体\r\nimport { CellModel, CellWatermarkModel, CellDateModel } from '../types/sheet';\r\n\r\n/**\r\n * SpreadJS工作表工具函数属性\r\n */\r\nexport const SheetUtils = {\r\n /**\r\n * 获取当前活动工作表选中的单元格集合\r\n * @param spread 工作簿对象\r\n * @returns 返回选中单元格的集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n */\r\n getActiveSheetSelectCells: (spread: any): CellModel[] => {\r\n const sheet = spread.getActiveSheet();\r\n\r\n const allCellObjs: CellModel[] = sheet.getSelections();\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 设置当前活动工作表某个或某些单元格范围为选中状态\r\n * @param spread 工作簿对象\r\n * @param cellObj 设置选中的单元格,格式如:{row:0,col:0,rowCount:1,colCount:1}\r\n */\r\n setActiveSheetSelectCells: (spread: any, cellObj: CellModel) => {\r\n const sheet = spread.getActiveSheet();\r\n\r\n sheet.setSelection(cellObj.row, cellObj.col, cellObj.rowCount, cellObj.colCount);\r\n },\r\n\r\n /**\r\n * 获取某工作表中某个范围中所有的单元格坐标对象集合\r\n * 该方法适用的场景如:手动选择了某个单元格范围,在这个范围中可能包含独立的单元格,也可能包含合并的单元格,这时候就需要用到如下方法获取到所有单元格对象\r\n * @param sheet 工作表实例\r\n * @param selectRange 单元格范围,格式如:{ row: 0, col: 0, rowCount: 2, colCount: 2 }\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @returns 返回数组集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n */\r\n getAllCellObjsByRange: (sheet: any, selectRange: CellModel, isMulColOrder: boolean = false): CellModel[] => {\r\n return SheetUtils.getAllCellObjsByRanges(sheet, [selectRange], isMulColOrder);\r\n },\r\n\r\n /**\r\n * 获取某工作表中多个范围集合中所有的单元格坐标对象集合\r\n * 该方法适用的场景如:手动选择了很多个单元格范围,在这些范围中可能包含独立的单元格,也可能包含合并的单元格,这时候就需要用到如下方法获取到所有单元格对象\r\n * @param sheet 工作表实例\r\n * @param selectRanges 单元格范围集合,格式如:[{ row: 0, col: 0, rowCount: 2, colCount: 2 }]\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @returns 返回数组集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n */\r\n getAllCellObjsByRanges: (sheet: any, selectRanges: CellModel[], isMulColOrder: boolean = false): CellModel[] => {\r\n // 得到所有的单元格坐标对象集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n let allCellObjs: CellModel[] = [];\r\n\r\n selectRanges.forEach((item, index) => {\r\n // 得到当前item中所有合并的单元格对象集合\r\n const itemSpanCells = sheet.getSpans(item);\r\n itemSpanCells.forEach((itemSpanCell: CellModel) => {\r\n allCellObjs.push({\r\n row: itemSpanCell.row,\r\n col: itemSpanCell.col,\r\n rowCount: itemSpanCell.rowCount,\r\n colCount: itemSpanCell.colCount,\r\n });\r\n });\r\n\r\n if (item.row === undefined || item.col === undefined || item.rowCount === undefined || item.colCount === undefined) {\r\n throw new Error('row、col、rowCount、colCount is required.');\r\n }\r\n\r\n // 遍历item中涉及到的所有单元格\r\n for (let i = item.row; i < +item.row + item.rowCount; i++) {\r\n for (let j = item.col; j < item.col + item.colCount; j++) {\r\n const curSpanCellObj = sheet.getSpan(i, j);\r\n\r\n // 检查当前单元格是否为合并单元格\r\n if (curSpanCellObj == null) {\r\n allCellObjs.push({\r\n row: i,\r\n col: j,\r\n rowCount: 1,\r\n colCount: 1,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n // 对所有单元格坐标对象集合进行排序\r\n allCellObjs = orderByJson(allCellObjs, !isMulColOrder ? ['row', 'col'] : ['col', 'row'], ['asc', 'asc']);\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 获取某工作表中所有的单元格坐标对象集合\r\n * @param sheet 工作表实例\r\n * @returns 返回数组集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]\r\n */\r\n getSheetAllCellObjs: (sheet: any): CellModel[] => {\r\n // 得到当前Sheet单元格范围\r\n const curSheetCellRange = [\r\n {\r\n row: 0,\r\n col: 0,\r\n rowCount: sheet.getRowCount(),\r\n colCount: sheet.getColumnCount(),\r\n },\r\n ];\r\n\r\n // 得到所有的单元格坐标对象集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]\r\n const allCellObjs = SheetUtils.getAllCellObjsByRanges(sheet, curSheetCellRange);\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 获取某工作表中选中的所有单元格坐标对象集合\r\n * @param sheet 工作表实例\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @returns 返回数组集合,格式如:[{ col: 0, row: 0, \"rowCount\": 1, \"colCount\": 1 }]\r\n */\r\n getSheetSelectCellObjs: (sheet: any, isMulColOrder: boolean = false): CellModel[] => {\r\n // 得到当前Sheet中选择的单元格范围集合\r\n const curSheetCellRange = sheet.getSelections();\r\n\r\n // 得到所有的单元格坐标对象集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]\r\n const allCellObjs = SheetUtils.getAllCellObjsByRanges(sheet, curSheetCellRange, isMulColOrder);\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 获取活动工作表中选中的所有单元格坐标对象集合\r\n * @param spread 工作簿实例\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @returns 返回数组集合,格式如:[{ col: 0, row: 0, \"rowCount\": 1, \"colCount\": 1 }]\r\n */\r\n getActiveSheetSelectCellObjs: (spread: any, isMulColOrder: boolean = false): CellModel[] => {\r\n // 当前活动的Sheet\r\n const sheet = spread.getActiveSheet();\r\n\r\n return SheetUtils.getSheetSelectCellObjs(sheet, isMulColOrder);\r\n },\r\n\r\n /**\r\n * 获取某工作表指定范围单元格的坐标对象集合(二维数组,格式如:[[{row:0……}],[{row:0……}]])\r\n * @param sheet 工作表实例\r\n * @param cellRange 单元格范围\r\n * @param groupType 分组字段属性(row或col),默认为:row\r\n * @returns 返回某工作表指定范围单元格的坐标对象集合(二维数组,格式如:[[{row:0……}],[{row:0……}]])\r\n */\r\n getSheetCellObjsByGroup: (sheet: any, cellRange: CellModel, groupType: 'row' | 'col' = 'row'): Array<Array<CellModel>> => {\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n const valCells = SheetUtils.getAllCellObjsByRange(sheet, cellRange);\r\n\r\n // 按照JSON数组中某个字段进行分组(groupType为row或col)\r\n const groupByCells = groupByJson(valCells, groupType);\r\n\r\n // 最终返回结果(二维数组)\r\n const retCells: Array<Array<any>> = [];\r\n\r\n // 遍历分组JSON对象(groupByCells的格式为:{key1: [cell1, cell2, ...], key2: [cell1, cell2, ...], ...})\r\n forEachJson(groupByCells, (curGroupCells: CellModel[], key, source) => {\r\n retCells.push(curGroupCells);\r\n });\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n\r\n return retCells;\r\n },\r\n\r\n /**\r\n * 获取某工作表选中单元格的值集合\r\n * @param sheet 工作表实例\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @param nullUndefinedReplaceVal 如果单元格的值为null或undefined,则将其替换为该值(如果不传入该参数,则不替换)\r\n * @returns 返回选中单元格的值集合\r\n */\r\n getSheetSelectVals: (\r\n sheet: any,\r\n isMulColOrder: boolean = false,\r\n nullUndefinedReplaceVal?: number | string\r\n ): (number | string | null | undefined)[] => {\r\n // 获取活动工作表选中单元格对象集合\r\n const selectCells = SheetUtils.getSheetSelectCellObjs(sheet, isMulColOrder);\r\n\r\n // 获取选中单元格的值集合\r\n let selectCellVals: (number | string | null | undefined)[] = [];\r\n selectCells.forEach((cell) => {\r\n let cellVal = sheet.getValue(cell.row, cell.col);\r\n\r\n // 如果cellVal为null或undefined,并且nullUndefinedReplaceVal不为null或undefined,则将cellVal替换为nullUndefinedReplaceVal\r\n if (nullUndefinedReplaceVal != null && nullUndefinedReplaceVal != undefined && (cellVal === null || cellVal === undefined)) {\r\n cellVal = nullUndefinedReplaceVal;\r\n }\r\n\r\n selectCellVals.push(cellVal);\r\n });\r\n\r\n return selectCellVals;\r\n },\r\n\r\n /**\r\n * 获取活动工作表选中单元格的值集合\r\n * @param spread 工作簿实例\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @param nullUndefinedReplaceVal 如果单元格的值为null或undefined,则将其替换为该值(如果不传入该参数,则不替换)\r\n * @returns 返回选中单元格的值集合\r\n */\r\n getActiveSheetSelectVals: (\r\n spread: any,\r\n isMulColOrder: boolean = false,\r\n nullUndefinedReplaceVal?: number | string\r\n ): (number | string | null | undefined)[] => {\r\n // 获取当前活动工作表\r\n const sheet = spread.getActiveSheet();\r\n\r\n return SheetUtils.getSheetSelectVals(sheet, isMulColOrder, nullUndefinedReplaceVal);\r\n },\r\n\r\n /**\r\n * 获取某工作表指定范围单元格的值集合(二维数组,格式如:[[1,2,3],[4,5,6]])\r\n * @param sheet 工作表实例\r\n * @param cellRange 单元格范围\r\n * @param groupType 分组字段属性(row或col),默认为:row\r\n * @param nullUndefinedReplaceVal 如果单元格的值为null或undefined,则将其替换为该值(如果不传入该参数,则不替换)\r\n * @returns 返回某工作表指定范围单元格的值集合(二维数组,格式如:[[1,2,3],[4,5,6]])\r\n */\r\n getSheetRangeValsByGroup: (\r\n sheet: any,\r\n cellRange: CellModel,\r\n groupType: 'row' | 'col' = 'row',\r\n nullUndefinedReplaceVal?: number | string | boolean\r\n ): Array<Array<any>> => {\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n const valCells = SheetUtils.getAllCellObjsByRange(sheet, cellRange);\r\n\r\n // 按照JSON数组中某个字段进行分组(groupType为row或col)\r\n const groupByCells = groupByJson(valCells, groupType);\r\n\r\n // 最终返回结果(二维数组)\r\n const retVals: Array<Array<any>> = [];\r\n\r\n // 遍历分组JSON对象(groupByCells的格式为:{key1: [cell1, cell2, ...], key2: [cell1, cell2, ...], ...})\r\n forEachJson(groupByCells, (curGroupCells: CellModel[], key, source) => {\r\n // 当前按照row或col分组的单元格的值集合\r\n const curVals: Array<any> = [];\r\n\r\n // 遍历当前分组的所有单元格\r\n forEachJson(curGroupCells, (item, index, source) => {\r\n let cellVal = sheet.getValue(item.row, item.col);\r\n\r\n // 如果cellVal为null或undefined,并且nullUndefinedReplaceVal不为null或undefined,则将cellVal替换为nullUndefinedReplaceVal\r\n if (nullUndefinedReplaceVal != null && nullUndefinedReplaceVal != undefined && (cellVal === null || cellVal === undefined)) {\r\n cellVal = nullUndefinedReplaceVal;\r\n }\r\n\r\n curVals.push(cellVal);\r\n });\r\n\r\n retVals.push(curVals);\r\n });\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n\r\n return retVals;\r\n },\r\n\r\n /**\r\n * 获取单元格类型名称\r\n * @param GC GC对象\r\n * @param sheet 工作表实例\r\n * @param row 单元格行索引\r\n * @param col 单元格列索引\r\n * @returns 返回单元格类型名称,如:button、radio、checkbox、checkboxList、hyperLink、comboBox、date、dateRange、calc\r\n */\r\n getCellType: (GC: any, sheet: any, row: number, col: number): string | undefined => {\r\n let cellTypeName;\r\n\r\n // 先根据getCellType来获取\r\n const cellType = sheet.getCellType(row, col);\r\n\r\n if (cellType instanceof GC.Spread.Sheets.CellTypes.Button) {\r\n cellTypeName = 'button';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.RadioButtonList) {\r\n cellTypeName = 'radio';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBox) {\r\n cellTypeName = 'checkbox';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBoxList) {\r\n cellTypeName = 'checkboxList';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.HyperLink) {\r\n cellTypeName = 'hyperLink';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.ComboBox) {\r\n cellTypeName = 'comboBox';\r\n }\r\n\r\n // 根据getStyle来获取\r\n if (cellTypeName == undefined || cellTypeName == null) {\r\n const cellStyle = sheet.getStyle(row, col);\r\n\r\n if (cellStyle && cellStyle.cellButtons && cellStyle.cellButtons.length > 0) {\r\n if (cellStyle.cellButtons[0].command == 'openDateTimePicker') {\r\n if (cellStyle.dropDowns && cellStyle.dropDowns.length > 0) {\r\n if (cellStyle.dropDowns[0].option.showDateRange) {\r\n cellTypeName = 'dateRange';\r\n } else {\r\n cellTypeName = 'date';\r\n }\r\n }\r\n } else if (cellStyle.cellButtons[0].command == 'openCalculator') {\r\n cellTypeName = 'calc';\r\n }\r\n }\r\n }\r\n\r\n return cellTypeName;\r\n },\r\n\r\n /**\r\n * 设置工作簿中所有工作表的缩放比例\r\n * @param spread 工作簿实例\r\n * @param scale 缩放比例,默认为:1(100%)\r\n */\r\n setSheetZoom: (spread: any, scale: number) => {\r\n // 暂停绘制\r\n spread.suspendPaint();\r\n\r\n const sheetCount = spread.getSheetCount();\r\n for (let i = 0; i < sheetCount; i++) {\r\n const sheet = spread.getSheet(i);\r\n\r\n sheet.zoom(scale);\r\n }\r\n\r\n // 恢复绘制\r\n spread.resumePaint();\r\n },\r\n\r\n /**\r\n * 设置当前活动工作表中选中的单元格背景颜色\r\n * @param spread 工作簿实例\r\n * @param color 背景颜色\r\n */\r\n setActiveSheetSelectBgColor: (spread: any, color: string) => {\r\n const sheet = spread.getActiveSheet();\r\n\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n //#region 方式1:通过getRange进行批量设置,推荐使用该方法来实现\r\n\r\n // 获取选择的多个单元格范围集合\r\n const selections = SheetUtils.getActiveSheetSelectCells(spread);\r\n\r\n // 循环每个选中的单元格范围\r\n selections.forEach((sel: CellModel) => {\r\n // 批量设置每个选中的单元格范围的背景颜色\r\n sheet.getRange(sel.row, sel.col, sel.rowCount, sel.colCount).backColor(color);\r\n });\r\n\r\n //#endregion\r\n\r\n //#region 方式2:通过getCell获取单元格样式对每个单元格进行设置,此方式效率相对较低,不推荐\r\n\r\n // // 当前活动的工作表中所有选择的单元格\r\n // const selectCells = SheetUtils.getActiveSheetSelectCellObjs(spread);\r\n\r\n // selectCells.forEach(item => {\r\n // // 获取单元格对象\r\n // const cellObj = sheet.getCell(item.row, item.col);\r\n\r\n // // 获取单元格样式\r\n // let cellStyle = sheet.getStyle(item.row, item.col);\r\n // if (!cellStyle) {\r\n // // 不存在样式则new一个\r\n // cellStyle = new GC.Spread.Sheets.Style();\r\n // }\r\n\r\n // // 设置单元格背景颜色\r\n // cellStyle.backColor = color;\r\n\r\n // // 重新设置单元格样式\r\n // cellObj.setStyle(cellStyle);\r\n // });\r\n\r\n //#endregion\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n },\r\n\r\n /**\r\n * 设置某工作表中指定单元格背景颜色\r\n * @param sheet 工作表实例\r\n * @param cells 单元格集合\r\n * @param color 背景颜色\r\n */\r\n setSheetBgColor: (sheet: any, cells: CellModel[], color: string) => {\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n // 循环每个选中的单元格范围\r\n cells.forEach((sel: CellModel) => {\r\n // 批量设置每个选中的单元格范围的背景颜色\r\n sheet.getRange(sel.row, sel.col, sel.rowCount, sel.colCount).backColor(color);\r\n });\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n },\r\n\r\n /**\r\n * 设置工作簿中所有工作表是否显示分页线\r\n * @param spread 工作簿实例\r\n * @param isShow 是否显示分页线(true:显示、false:不显示)\r\n */\r\n setSheetShowPrintPageLine: (spread: any, isShow: boolean) => {\r\n // 暂停绘制\r\n spread.suspendPaint();\r\n\r\n const sheetCount = spread.getSheetCount();\r\n for (let i = 0; i < sheetCount; i++) {\r\n const sheet = spread.getSheet(i);\r\n\r\n // 获取当前工作表是否显示分页线\r\n // var isVisible = sheet.isPrintLineVisible();\r\n\r\n sheet.isPrintLineVisible(isShow);\r\n }\r\n\r\n // 恢复绘制\r\n spread.resumePaint();\r\n },\r\n\r\n /**\r\n * 忽略工作工作表元格中指定字符串不显示,如:#DIV/0!、#VALUE!等\r\n * @param GC GC对象\r\n */\r\n ignoreSheetShowStrs: (GC: any) => {\r\n // 忽略的字符串集合\r\n const ignoreStrs: string[] = ['#DIV/0!', '#VALUE!', '#NAME?', '#N/A', '#NULL!', '#NUM!', '#REF!'];\r\n\r\n // paint对象\r\n const ignorePaint = GC.Spread.Sheets.CellTypes.Text.prototype.paint;\r\n\r\n // 重写paint函数\r\n GC.Spread.Sheets.CellTypes.Text.prototype.paint = function (ctx: any, value: any, x: any, y: any, w: any, h: any, style: any, options: any) {\r\n // 如果在忽略的字符串集合中有匹配的结果,则将其显示为空字符串\r\n if (ignoreStrs.some((item) => item == value)) {\r\n ignorePaint.call(this, ctx, '/', x, y, w, h, style, options);\r\n } else {\r\n ignorePaint.apply(this, arguments);\r\n }\r\n\r\n // // 或使用如下代码\r\n // if (ignoreStrs.some((item) => item == value)) {\r\n // \tvalue = '';\r\n // }\r\n // ignorePaint.apply(this, [ctx, value, x, y, w, h, style, options]);\r\n };\r\n },\r\n\r\n /**\r\n * 设置工作表显示辅助线(底部和右侧的辅助线)\r\n * @param sheet 工作表实例\r\n * @param width 宽度(像素)\r\n * @param height 高度(像素)\r\n * @param lineWidth 辅助线宽度(默认为:1像素)\r\n * @param colorStr 辅助线颜色(默认为:#409eff)\r\n * @param isHb 是否为横表(默认为:false)\r\n */\r\n setSheetAuxiliaryLine: (\r\n GC: any,\r\n sheet: any,\r\n width: number,\r\n height: number,\r\n lineWidth: number = 1,\r\n colorStr: string = '#409eff',\r\n isHb: boolean = false\r\n ) => {\r\n // 创建底部和右侧的浮动对象\r\n let floatBottom = new GC.Spread.Sheets.FloatingObjects.FloatingObject(`floatLineBottom${isHb ? 'Hb' : ''}`, 0, height, width, lineWidth),\r\n floatRight = new GC.Spread.Sheets.FloatingObjects.FloatingObject(`floatLineRight${isHb ? 'Hb' : ''}`, width, 0, lineWidth, height);\r\n\r\n // 创建底部和右侧的div对象\r\n let divBottom = document.createElement('div'),\r\n divRight = document.createElement('div');\r\n\r\n // 设置底部div对象样式\r\n divBottom.style.width = `${width}px`;\r\n divBottom.style.height = '1px';\r\n divBottom.style.borderBottom = `${lineWidth}px dashed ${colorStr}`;\r\n\r\n // 设置右侧div对象样式\r\n divRight.style.width = '1px';\r\n divRight.style.height = `${height}px`;\r\n divRight.style.borderLeft = `${lineWidth}px dashed ${colorStr}`;\r\n\r\n // floatBottom.fixedPosition(true);\r\n // floatRight.fixedPosition(true);\r\n\r\n // 设置底部和右侧浮动对象不允许改变大小、不允许拖动和设置浮动对象的内容\r\n floatBottom.allowResize(false);\r\n floatBottom.allowMove(false);\r\n floatBottom.content(divBottom);\r\n floatRight.allowResize(false);\r\n floatRight.allowMove(false);\r\n floatRight.content(divRight);\r\n\r\n // 将浮动元素添加到工作表中\r\n sheet.floatingObjects.add(floatBottom);\r\n sheet.floatingObjects.add(floatRight);\r\n },\r\n\r\n /**\r\n * 设置当前活动工作表的水印和数据绑定是否显示\r\n * @param spread 工作簿实例\r\n * @param cells 数据绑定单元格配置集合([{ row: number; col: number; title: string; pathPrev: string; pathField: string }])\r\n * @param isShow 是否显示\r\n */\r\n setActiveSheetWatermark: (spread: any, cells: CellWatermarkModel[], isShow: boolean) => {\r\n if (cells == null || cells == undefined) {\r\n return;\r\n }\r\n\r\n const sheet = spread.getActiveSheet();\r\n\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n cells.forEach((cell: CellWatermarkModel) => {\r\n // 设置或移除水印标签\r\n sheet.getCell(cell.row, cell.col).watermark(isShow ? `{${cell.title}}` : undefined);\r\n\r\n // 设置或移除绑定路径\r\n sheet.setBindingPath(cell.row, cell.col, isShow ? `${cell.pathPrev}.${cell.pathField}` : undefined);\r\n });\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n },\r\n\r\n /**\r\n\t * 设置某工作表中单元格为日期选择控件\r\n\t * @param GC GC对象\r\n\t * @param sheet 工作表实例\r\n\t * @param cells 单元格集合,格式如:[{\r\n\t\t\tdateFormat: 'yyyy-MM-dd',\r\n\t\t\trow: 0,\r\n\t\t\tcol: 0\r\n\t\t}]\r\n\t * @param isAutoSize 是否自适应单元格大小(默认为:true)\r\n\t */\r\n setSheetCellDate: (GC: any, sheet: any, cells: CellDateModel[], isAutoSize: boolean = true) => {\r\n cells.forEach((item, index) => {\r\n // 先获取单元格样式,否则设置控件后样式会丢失\r\n let cellStyle = sheet.getStyle(item.row, item.col);\r\n if (!cellStyle) {\r\n cellStyle = new GC.Spread.Sheets.Style();\r\n }\r\n\r\n cellStyle.cellButtons = [\r\n {\r\n imageType: GC.Spread.Sheets.ButtonImageType.dropdown,\r\n command: 'openDateTimePicker',\r\n // 按钮宽度\r\n // width: 10,\r\n },\r\n ];\r\n cellStyle.dropDowns = [\r\n {\r\n type: GC.Spread.Sheets.DropDownType.dateTimePicker,\r\n option: {\r\n showTime: false,\r\n showDateRange: false,\r\n },\r\n },\r\n ];\r\n cellStyle.formatter = item.dateFormat;\r\n\r\n // 是否缩小以适应\r\n cellStyle.shrinkToFit = isAutoSize;\r\n\r\n // 设置单元格样式\r\n sheet.setStyle(item.row, item.col, cellStyle);\r\n });\r\n },\r\n};\r\n","import { chunkJson } from 'rapid-utils';\r\nimport { TestObjectAttrModel } from '../types/business';\r\nimport { SheetUtils } from '../utils/sheet';\r\n\r\n/**\r\n * SpreadJS业务相关工具函数属性\r\n */\r\nexport const BusinessUtils = {\r\n /**\r\n * 创建检测对象属性单元格\r\n * @param gc GC对象\r\n * @param sheet 工作表实例\r\n * @param testObjectAttrs 检测对象属性配置集合\r\n * @param isVertical 是否为纵表,默认为:true\r\n * @param contentColStartIndex 表格内容列起始索引,默认为:1\r\n * @param contentTotalColCount 表格内容列总数,默认为:77\r\n * @param addRowHeight 添加的表格行高,默认为:24\r\n */\r\n createTestObjectAttrsCells: (\r\n gc: any,\r\n sheet: any,\r\n testObjectAttrs: TestObjectAttrModel[],\r\n isVertical: boolean = true,\r\n contentColStartIndex: number = 1,\r\n contentTotalColCount: number = 77,\r\n addRowHeight: number = 24\r\n ) => {\r\n if (!testObjectAttrs || testObjectAttrs.length === 0) {\r\n return;\r\n }\r\n\r\n // 标题单元格列数量(纵表为12列,横表待定)\r\n const titleCellColumnCount = isVertical ? 12 : 10;\r\n // 标题对应的值单元格列数量(纵表:第一个值单元格为26、第二个值单元格为27,纵表待定)\r\n const titleCellValColumnCount = isVertical ? 26 : 15;\r\n\r\n // 一行中检测对象属性的个数(纵表为2个,横表为3个)\r\n const rowTestObjectCount = isVertical ? 2 : 3;\r\n\r\n // 将测试对象属性数据进行分块\r\n const testObjectAttrsChunk = chunkJson(testObjectAttrs, rowTestObjectCount);\r\n\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n // 设置工作表行数为0\r\n sheet.setRowCount(0);\r\n\r\n for (let i = 0; i < testObjectAttrsChunk.length; i++) {\r\n const rowAttrArr = testObjectAttrsChunk[i] as TestObjectAttrModel[];\r\n\r\n // 获取总行数\r\n const totalRowCount: number = sheet.getRowCount();\r\n\r\n // 添加一行\r\n sheet.addRows(totalRowCount, 1);\r\n\r\n // 设置添加这一行的行高\r\n sheet.setRowHeight(totalRowCount, addRowHeight, gc.Spread.Sheets.SheetArea.viewport);\r\n\r\n // 获取添加这一行的区域范围\r\n const addRowRange = sheet.getRange(totalRowCount, 1, contentColStartIndex, contentTotalColCount, gc.Spread.Sheets.SheetArea.viewport);\r\n // 设置添加这一行区域中的边框样式(最左边和最后边边框样式为粗线、中间的为细边框样式)\r\n addRowRange.setBorder(new gc.Spread.Sheets.LineBorder('#000', gc.Spread.Sheets.LineStyle.thin), { all: true });\r\n addRowRange.setBorder(new gc.Spread.Sheets.LineBorder('#000', gc.Spread.Sheets.LineStyle.medium), { left: true });\r\n addRowRange.setBorder(new gc.Spread.Sheets.LineBorder('#000', gc.Spread.Sheets.LineStyle.medium), { right: true });\r\n // 设置单元格水平和垂直居中\r\n addRowRange.hAlign(gc.Spread.Sheets.HorizontalAlign.center);\r\n addRowRange.vAlign(gc.Spread.Sheets.HorizontalAlign.center);\r\n\r\n // 合并第一个属性的标题列和值列,同时设置对应单元格的内容\r\n sheet.addSpan(totalRowCount, contentColStartIndex, 1, titleCellColumnCount, gc.Spread.Sheets.SheetArea.viewport);\r\n sheet.addSpan(\r\n totalRowCount,\r\n contentColStartIndex + titleCellColumnCount,\r\n 1,\r\n rowAttrArr.length > 1 ? titleCellValColumnCount : contentTotalColCount - titleCellColumnCount,\r\n gc.Spread.Sheets.SheetArea.viewport\r\n );\r\n sheet.setValue(totalRowCount, contentColStartIndex, rowAttrArr[0].title);\r\n sheet.setValue(totalRowCount, contentColStartIndex + titleCellColumnCount, rowAttrArr[0].value);\r\n\r\n // 合并第二个属性的标题列和值列,同时设置对应单元格的内容\r\n if (rowAttrArr.length > 1) {\r\n const colIndexTitle = contentColStartIndex + titleCellColumnCount + titleCellValColumnCount;\r\n const colIndexValue = colIndexTitle + titleCellColumnCount;\r\n\r\n sheet.addSpan(totalRowCount, colIndexTitle, 1, titleCellColumnCount, gc.Spread.Sheets.SheetArea.viewport);\r\n sheet.addSpan(\r\n totalRowCount,\r\n colIndexValue,\r\n 1,\r\n titleCellValColumnCount + 1 + (!isVertical && rowAttrArr.length == 2 ? titleCellColumnCount + titleCellValColumnCount + 1 : 0),\r\n gc.Spread.Sheets.SheetArea.viewport\r\n );\r\n sheet.setValue(totalRowCount, colIndexTitle, rowAttrArr[1].title);\r\n sheet.setValue(totalRowCount, colIndexValue, rowAttrArr[1].value);\r\n }\r\n // 合并第三个属性的标题列和值列,同时设置对应单元格的内容\r\n if (rowAttrArr.length > 2) {\r\n const colIndexTitle =\r\n contentColStartIndex + titleCellColumnCount + titleCellValColumnCount + titleCellColumnCount + titleCellValColumnCount + 1;\r\n const colIndexValue = colIndexTitle + titleCellColumnCount;\r\n\r\n sheet.addSpan(totalRowCount, colIndexTitle, 1, titleCellColumnCount, gc.Spread.Sheets.SheetArea.viewport);\r\n sheet.addSpan(totalRowCount, colIndexValue, 1, titleCellValColumnCount + 1, gc.Spread.Sheets.SheetArea.viewport);\r\n sheet.setValue(totalRowCount, colIndexTitle, rowAttrArr[2].title);\r\n sheet.setValue(totalRowCount, colIndexValue, rowAttrArr[2].value);\r\n }\r\n }\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n },\r\n /**\r\n * 获取检测对象属性值集合\r\n * @param sheet 工作表实例\r\n * @param testObjectAttrs 检测对象属性配置集合\r\n * @param isVertical 是否为纵表,默认为:true\r\n * @param contentColStartIndex 表格内容列起始索引,默认为:1\r\n * @param contentTotalColCount 表格内容列总数,默认为:77\r\n */\r\n getTestObjectAttrsVals: (\r\n sheet: any,\r\n testObjectAttrs: TestObjectAttrModel[],\r\n isVertical: boolean = true,\r\n contentColStartIndex: number = 1,\r\n contentTotalColCount: number = 77\r\n ): TestObjectAttrModel[] => {\r\n // 一行中检测对象属性的个数(纵表为2个,横表为3个)\r\n const rowTestObjectCount = isVertical ? 2 : 3;\r\n\r\n // 将测试对象属性数据进行分块\r\n const testObjectAttrsChunk = chunkJson(testObjectAttrs, rowTestObjectCount);\r\n\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n // 所有单元格对象\r\n const allCells = SheetUtils.getAllCellObjsByRange(sheet, {\r\n row: 0,\r\n col: contentColStartIndex,\r\n rowCount: sheet.getRowCount(),\r\n colCount: contentTotalColCount,\r\n });\r\n // 将所有单元格对象进行分块\r\n const allCellsChunk = chunkJson(allCells, rowTestObjectCount * 2);\r\n\r\n // 将所有单元格对象按照testObjectAttrsChunk的结构进行组合\r\n const newAllCellsChunk = [];\r\n for (let i = 0; i < allCellsChunk.length; i++) {\r\n newAllCellsChunk.push(chunkJson(allCellsChunk[i], 2));\r\n }\r\n\r\n let retData: TestObjectAttrModel[] = [];\r\n\r\n for (let i = 0; i < testObjectAttrsChunk.length; i++) {\r\n const attrObjs = testObjectAttrsChunk[i] as TestObjectAttrModel[];\r\n\r\n for (let j = 0; j < attrObjs.length; j++) {\r\n const attrObj = attrObjs[j];\r\n\r\n retData.push({\r\n title: sheet.getValue(newAllCellsChunk[i][j][0].row, newAllCellsChunk[i][j][0].col), //attrObj.title,\r\n fieldName: attrObj.fieldName,\r\n value: sheet.getValue(newAllCellsChunk[i][j][1].row, newAllCellsChunk[i][j][1].col),\r\n });\r\n }\r\n }\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n\r\n return retData;\r\n },\r\n};\r\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\r\n * 公用工具函数属性\r\n */\r\nexport const CommonUtils = {\r\n /**\r\n * 获取文件的字节流对象\r\n * @param fileUrl 在线文件地址\r\n * @returns 文件的字节流对象\r\n */\r\n getFileBlob: async (fileUrl: string): Promise<Blob> | null => {\r\n // 获取文件响应结果\r\n const response = await fetch(fileUrl, { method: 'GET' });\r\n\r\n // 获取成功\r\n if (response.ok) {\r\n // 文件的字节流对象\r\n const blob = await response.blob();\r\n\r\n return blob;\r\n } else {\r\n return null;\r\n }\r\n },\r\n\r\n /**\r\n * 获取列的英文字母\r\n * @param colIndex 列的索引\r\n * @returns 返回英文字母\r\n */\r\n getColLetterName: (colIndex: number): string => {\r\n colIndex += 1;\r\n\r\n let letter = '';\r\n while (colIndex > 0) {\r\n const remainder = (colIndex - 1) % 26;\r\n letter = String.fromCharCode(remainder + 65) + letter;\r\n colIndex = Math.floor((colIndex - 1) / 26);\r\n }\r\n\r\n return letter.toUpperCase();\r\n },\r\n};\r\n","import * as math from 'mathjs';\r\nimport { type EChartsUtilsConfigModel } from '../types/echarts';\r\n\r\n/**\r\n * 公用方法,如:修约计算等\r\n */\r\nconst EChartsUtilsComm = {\r\n /**\r\n * 计算常规修约\r\n * @param roundingVal 修约值\r\n * @param accuracy 修约精度\r\n * @return 返回修约结果\r\n */\r\n getRound: (roundingVal, accuracy) => {\r\n // 验证修约的值是否为负数,为负数的话,取绝对值进行修约\r\n const valIsNegative = roundingVal < 0;\r\n if (valIsNegative) {\r\n roundingVal = Math.abs(roundingVal);\r\n }\r\n\r\n // 修约精度为0的时候\r\n if (accuracy == 0) {\r\n // 得到字符串形式\r\n let inputValStr = roundingVal.toString();\r\n\r\n // 判断是否有小数点,没有则直接返回换算后的修约值\r\n if (inputValStr.indexOf('.') == -1) {\r\n return valIsNegative ? -roundingVal : roundingVal;\r\n }\r\n\r\n // 获取整数数字部分和小数部分字符串\r\n let intVal = parseInt(inputValStr.split('.')[0]);\r\n let decimalStr = inputValStr.split('.')[1];\r\n\r\n // 小数部分大于或等于0.5的话,就给整数部分加1后返回,否则返回整数部分\r\n if (parseFloat(`0.${decimalStr}`) >= 0.5) {\r\n return valIsNegative ? -(intVal + 1) : intVal + 1;\r\n } else {\r\n return valIsNegative ? -intVal : intVal;\r\n }\r\n }\r\n\r\n // 系数\r\n let coefficient = 1 / accuracy;\r\n\r\n // 换算后的修约值(=修约值*系数)\r\n // 注意:此处使用到了toFixed,目的是可能会存在精度的问题\r\n let roundingValCal = Number((roundingVal * coefficient).toFixed(8));\r\n\r\n /**\r\n * 计算修约结果函数\r\n * @param inputVal 换算后的修约值\r\n * @returns 返回修约结果\r\n */\r\n const calcRoundingRet = (inputVal: number): number => {\r\n // 得到字符串形式\r\n let inputValStr = inputVal.toString();\r\n\r\n // 判断是否有小数点,没有则直接返回换算后的修约值\r\n if (inputValStr.indexOf('.') == -1) {\r\n return inputVal;\r\n }\r\n\r\n // 获取整数数字部分和小数部分字符串\r\n let intVal = parseInt(inputValStr.split('.')[0]);\r\n let decimalStr = inputValStr.split('.')[1];\r\n\r\n // 获取小数部分的第一位数字\r\n let decimalStrFirst = parseInt(decimalStr.substring(0, 1));\r\n\r\n // 大于等于6的时候,入\r\n if (decimalStrFirst >= 6) {\r\n return intVal + 1;\r\n }\r\n // 小于等于4的时候,舍\r\n else if (decimalStrFirst <= 4) {\r\n return intVal;\r\n }\r\n\r\n // 小数部分为5,并且只有一位小数的时候,前面的整数部分如果是奇数则入,反之则舍\r\n else if (decimalStrFirst == 5 && decimalStr.length == 1) {\r\n return intVal % 2 != 0 ? intVal + 1 : intVal;\r\n }\r\n\r\n // 小数部分为5,并且小数位数大于一位的时候,则入\r\n else if (decimalStrFirst == 5 && decimalStr.length > 1) {\r\n return intVal + 1;\r\n }\r\n\r\n return inputVal;\r\n };\r\n\r\n // 返回最终修约结果(=修约结果/系数)\r\n const retNum = calcRoundingRet(roundingValCal) / coefficient;\r\n\r\n //获取修约精度中的小数位数\r\n let accuracyStr = accuracy + '';\r\n\r\n // 如果修约精度中没有小数,则直接返回\r\n if (accuracyStr.indexOf('.') == -1) {\r\n return valIsNegative ? -retNum : retNum;\r\n } else {\r\n const retNumStr = retNum + '';\r\n\r\n // 补位的0的字符串\r\n let zeroStr = '';\r\n\r\n // 结果为整数的时候,需要补充小数点后面的小数位数为0,如:34→34.0\r\n if (retNumStr.indexOf('.') == -1) {\r\n let zeroStr = '';\r\n for (let index = 0; index < accuracyStr.split('.')[1].length; index++) {\r\n zeroStr += '0';\r\n }\r\n\r\n return (valIsNegative ? '-' : '') + `${retNum}.${zeroStr}`;\r\n }\r\n // 结果为小数的时候,需要补充修约精度的位数,如:0.3修约精度为0.01,则最终应该返回0.30\r\n else {\r\n const xsPart = retNumStr.split('.')[1];\r\n\r\n if (accuracyStr.split('.')[1].length > xsPart.length) {\r\n for (let index = 0; index < accuracyStr.split('.')[1].length - xsPart.length; index++) {\r\n zeroStr += '0';\r\n }\r\n }\r\n\r\n return (valIsNegative ? '-' : '') + `${retNum}${zeroStr}`;\r\n }\r\n }\r\n },\r\n /**\r\n * 实现Excel中TREND(返回线性回归拟合线的一组纵坐标值[y值])公式的计算\r\n * @param x x轴数据集合\r\n * @param y y轴数据集合\r\n * @param xVal x轴的值\r\n * @returns\r\n */\r\n calcTrend: (x: Array<number>, y: Array<number>, xVal: number) => {\r\n let n = x.length;\r\n let sumX = 0,\r\n sumY = 0,\r\n sumXY = 0,\r\n sumXX = 0;\r\n for (let i = 0; i < n; i++) {\r\n sumX += x[i];\r\n sumY += y[i];\r\n sumXY += x[i] * y[i];\r\n sumXX += x[i] * x[i];\r\n }\r\n let slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\r\n let intercept = (sumY - slope * sumX) / n;\r\n\r\n let predictedY = slope * xVal + intercept;\r\n\r\n if (slope + '' == 'NaN') {\r\n return { y: '', gs: '', xl: '', jj: '' };\r\n }\r\n\r\n //返回y轴趋势数据,以及公式\r\n return { y: predictedY, gs: `${slope}*x+${intercept}`, xl: slope, jj: intercept };\r\n },\r\n /**\r\n * 过滤掉数组中的null、空字符串或/符号等,并返回新的数组\r\n * @param dataSource 原始数组\r\n */\r\n filterNullEmptyErrArray: (dataSource: Array<any>) => {\r\n let retArr = dataSource.filter((item) => item != null && item != undefined && (item._error == null || item._error == undefined) && item != '/');\r\n\r\n return retArr;\r\n },\r\n};\r\n\r\n/**\r\n * 所有统计图表的ECharts配置\r\n */\r\nexport const EChartsUtilsAll = {\r\n /**\r\n * 沥青混合料-目标配合比设计-毛体积密度\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart10: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0],\r\n yDataSource = yDataArr[0];\r\n\r\n // 原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData: any[] = [],\r\n yData: any[] = [];\r\n\r\n // 处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n // y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n // 检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*xAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 2.35,\r\n yAxisMin = 2.25,\r\n */\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Number(EChartsUtilsComm.getRound(yMax + 0.05, 0.01)),\r\n yAxisMin = Number(EChartsUtilsComm.getRound(yMin - 0.05, 0.01)),\r\n seriesData = [],\r\n upperLimit = null, // 上限\r\n lowerLimit = null,\r\n showLine = true; // 是否显示辅助线\r\n\r\n let points: any = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n // 计算峰值\r\n const peakvalue = [arrX[maxIndex], Number(EChartsUtilsComm.getRound(max, 0.001))],\r\n coordX = [peakvalue[0], yAxisMin];\r\n\r\n // console.log('x范围:', xMin, xMax);\r\n // 输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, xMin);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, xMax);\r\n }\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, arrX[maxIndex]);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n lineData = [\r\n [\r\n {\r\n coord: coordX,\r\n lineStyle: {\r\n color: '#333', // X轴\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: peakvalue,\r\n },\r\n ],\r\n ];\r\n pointData = [\r\n {\r\n xAxis: peakvalue[0],\r\n yAxis: peakvalue[1],\r\n symbolOffset: [0, 15],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n if (Number(data.data.xAxis) == 0 && Number(data.data.yAxis) == 0) {\r\n return '';\r\n } else {\r\n return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n }\r\n //return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n {\r\n xAxis: peakvalue[0],\r\n yAxis: yAxisMin,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'a1';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ];\r\n }\r\n\r\n // 判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,// 是否显示外边框线\r\n // borderColor: '#f00',// 外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n // 提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n // 顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n // 图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, // 显示\r\n },\r\n selectedMode: 'multiple', // 用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, // 使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 40 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', // '#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n // splitNumber: 10, // 设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n // 设置y轴箭头效果\r\n show: true, // y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, // 平滑的线条\r\n // 设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', // 符号类型\r\n symbolSize: 6, // 符号大小 lineJson.lineColor\r\n // 线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n // 线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n // 线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], // 去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-稳定度\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart11: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0],\r\n yDataSource = yDataArr[0];\r\n\r\n // 原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n // 处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n // y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n // 检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 2),\r\n yAxisMin = Math.floor(yMin - 2),\r\n seriesData = [],\r\n upperLimit = null, // 上限\r\n lowerLimit = 7.5, // 下限\r\n showLine = true; // 是否显示辅助线\r\n\r\n // 获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 2;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 2;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n // arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n\r\n // 计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n // 获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; // 上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; // 下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (index > 0) {\r\n // 上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n // 向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n // 下限交点\r\n if (lowerLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n // 向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n // 上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n // 下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n // 下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n // 只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n // 上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n // 上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n // 只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n // 上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n // 上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n // 上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n // 上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n // 输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, arrX[maxIndex]);\r\n }\r\n }\r\n\r\n // 峰值\r\n const peakvalue = [arrX[maxIndex], Number(EChartsUtilsComm.getRound(max, 0.001))];\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n lineData = [\r\n [\r\n {\r\n coord: [peakvalue[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', // X轴\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: peakvalue,\r\n },\r\n ],\r\n ];\r\n pointData = [\r\n {\r\n xAxis: peakvalue[0],\r\n yAxis: peakvalue[1],\r\n symbolOffset: [0, 15],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n if (Number(data.data.xAxis) == 0 && Number(data.data.yAxis) == 0) {\r\n return '';\r\n } else {\r\n return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n }\r\n //return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n {\r\n xAxis: peakvalue[0],\r\n yAxis: yAxisMin,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'a2';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ];\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-空隙率\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart12: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n yDataSource = yDataArr[0]; // [8.8, 5.9, 4.1, 3.3, 2.6];\r\n\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n //检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*\r\n\t\t\txAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 10,\r\n yAxisMin = 0,\r\n\t\t\t*/\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 2),\r\n yAxisMin = Math.floor(yMin - 2),\r\n seriesData = [],\r\n upperLimit = 5, //上限\r\n lowerLimit = 3, //下限\r\n showLine = true; //是否显示辅助线\r\n\r\n //获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 2;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 2;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n //获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; //上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; //下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n if (index > 0) {\r\n //上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n //下限交点\r\n if (lowerLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n //上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n //下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n //上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n //上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n //上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n //输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n if (upperIntersectionPoint.length > 0) {\r\n upperIntersectionPoint.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [item[0], upperLimit],\r\n },\r\n ]);\r\n });\r\n }\r\n if (lowerIntersectionPoint.length > 0) {\r\n lowerIntersectionPoint.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [item[0], lowerLimit],\r\n },\r\n ]);\r\n });\r\n }\r\n\r\n //上下线交点分别只有一个才求平均值\r\n if (upperIntersectionPoint.length == 1 && lowerIntersectionPoint.length == 1) {\r\n const avg = ((upperIntersectionPoint[0][0] + lowerIntersectionPoint[0][0]) / 2).toFixed(2);\r\n const avgXIndex = arrX.findIndex((n) => n == avg);\r\n // console.log('输出:', avg, avgXIndex);\r\n //输出\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, avg);\r\n }\r\n }\r\n lineData.push([\r\n {\r\n coord: [avg, yAxisMin],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [avg, arrY[avgXIndex]],\r\n },\r\n ]);\r\n pointData.push({\r\n xAxis: avg,\r\n yAxis: yAxisMin,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'a3';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n });\r\n }\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-流值\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart13: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n yDataSource = yDataArr[0]; // [2.2, 2.5, 2.9, 3.4, 4.2];\r\n\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n //检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*\r\n xAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 5,\r\n yAxisMin = 1,\r\n\t\t\t*/\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 1),\r\n yAxisMin = Math.floor(yMin - 1),\r\n seriesData = [],\r\n upperLimit = null, //上限\r\n lowerLimit = 2, //下限\r\n showLine = true; //是否显示辅助线\r\n\r\n //获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 1;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 1;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n\r\n //计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n //获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; //上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; //下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (index > 0) {\r\n //上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n //下限交点\r\n if (lowerLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n //上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n //下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n //上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n //上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n //上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n //输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n lineData = [];\r\n pointData = [];\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 25 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-矿料间隙率\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart14: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n yDataSource = yDataArr[0]; // [16.1, 15.2, 14.6, 14.8, 16];\r\n\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n //检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*\r\n\t\t\txAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 19.0,\r\n yAxisMin = 13.0,\r\n\t\t\t*/\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 1),\r\n yAxisMin = Math.floor(yMin - 1),\r\n seriesData = [],\r\n upperLimit = null, //上限\r\n lowerLimit = 13.5, //下限\r\n showLine = true; //是否显示辅助线\r\n\r\n //获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 1;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 1;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n\r\n //计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n //获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; //上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; //下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (index > 0) {\r\n //上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n //下限交点\r\n if (lowerLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n //上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n //下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n //上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n //上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n //上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n //输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n lineData = [];\r\n pointData = [];\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-有效沥青饱和度\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart15: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n yDataSource = yDataArr[0]; // [40.1, 59.8, 66.8, 74.5, 78.2];\r\n\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n //检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*\r\n\t\t\txAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 80,\r\n yAxisMin = 30,\r\n\t\t\t*/\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 10),\r\n yAxisMin = Math.floor(yMin - 10),\r\n seriesData = [],\r\n upperLimit = 75, //上限\r\n lowerLimit = 60, //下限\r\n showLine = true; //是否显示辅助线\r\n\r\n //获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 10;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 10;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n //获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; //上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; //下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n if (index > 0) {\r\n //上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n //下限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n //上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n //下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n //上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n //上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n //上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n //输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n if (upperIntersectionPoint.length > 0) {\r\n upperIntersectionPoint.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [item[0], upperLimit],\r\n },\r\n ]);\r\n });\r\n }\r\n if (lowerIntersectionPoint.length > 0) {\r\n lowerIntersectionPoint.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [item[0], lowerLimit],\r\n },\r\n ]);\r\n });\r\n }\r\n //上下线交点分别只有一个才求平均值\r\n if (upperIntersectionPoint.length == 1 && lowerIntersectionPoint.length == 1) {\r\n const avg = ((upperIntersectionPoint[0][0] + lowerIntersectionPoint[0][0]) / 2).toFixed(2);\r\n const avgXIndex = arrX.findIndex((n) => n == avg);\r\n // console.log('输出:', avg, avgXIndex);\r\n //输出\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, avg);\r\n }\r\n }\r\n lineData.push([\r\n {\r\n coord: [avg, yAxisMin],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [avg, arrY[avgXIndex]],\r\n },\r\n ]);\r\n pointData.push({\r\n xAxis: avg,\r\n yAxis: yAxisMin,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'a4';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n });\r\n }\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-汇总\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart16: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n // let lines = [\r\n // \t[3.5, 5.5],\r\n // \t[3.5, 5.5],\r\n // \t[4.21, 5.27],\r\n // \t[3.5, 5.5],\r\n // \t[3.5, 5.5],\r\n // \t[4.01, 5.03],\r\n // ],\r\n\r\n //原始数据\r\n let lines = [\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[0].row, chartExtJson.lqhhlHz[0].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[1].row, chartExtJson.lqhhlHz[1].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[2].row, chartExtJson.lqhhlHz[2].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[3].row, chartExtJson.lqhhlHz[3].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[4].row, chartExtJson.lqhhlHz[4].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[5].row, chartExtJson.lqhhlHz[5].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[6].row, chartExtJson.lqhhlHz[6].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[7].row, chartExtJson.lqhhlHz[7].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[8].row, chartExtJson.lqhhlHz[8].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[9].row, chartExtJson.lqhhlHz[9].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[10].row, chartExtJson.lqhhlHz[10].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[11].row, chartExtJson.lqhhlHz[11].col),\r\n ],\r\n ],\r\n xData = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n xAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMin = 0,\r\n yAxisMax = 6,\r\n yData = [0, 1, 2, 3, 4, 5, 6],\r\n yAxisData = ['VFA', 'VMA', '流值', '稳定度', '空隙率', '密度'],\r\n seriesData = [],\r\n showLine = true; //是否显示辅助线\r\n\r\n const title = 'OAC',\r\n xName = '油石比(%)',\r\n yName = 'VFA(%)',\r\n legendName = '图例1';\r\n let lineData = [];\r\n let pointData = [];\r\n let xMin = Math.max(...lines.map((item) => item[0]));\r\n let xMax = Math.min(...lines.map((item) => item[1]));\r\n\r\n lines.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], lines.length - index],\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n type: 'solid',\r\n width: 2,\r\n },\r\n },\r\n {\r\n coord: [item[1], lines.length - index],\r\n },\r\n ]);\r\n });\r\n if (showLine && xMin <= xMax) {\r\n //最小\r\n lineData.push([\r\n {\r\n coord: [xMin, 0],\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed',\r\n width: 2,\r\n },\r\n },\r\n {\r\n coord: [xMin, 6],\r\n },\r\n ]);\r\n //最大\r\n lineData.push([\r\n {\r\n coord: [xMax, 0],\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed',\r\n width: 2,\r\n },\r\n },\r\n {\r\n coord: [xMax, 6],\r\n },\r\n ]);\r\n pointData = [\r\n {\r\n xAxis: xMin,\r\n yAxis: 0,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'OACmin';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n {\r\n xAxis: xMax,\r\n yAxis: 0,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'OACmax';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ];\r\n }\r\n\r\n if (xMin <= xMax) {\r\n //平均值\r\n const avg = (xMin + xMax) / 2;\r\n lineData.push([\r\n {\r\n coord: [avg, 0],\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed',\r\n width: 2,\r\n },\r\n },\r\n {\r\n coord: [avg, 6],\r\n },\r\n ]);\r\n pointData.push({\r\n xAxis: avg,\r\n yAxis: 0,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'OAC2';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n });\r\n }\r\n\r\n if (isNaN(xMin)) {\r\n xMin = 0;\r\n }\r\n if (isNaN(xMax)) {\r\n xMax = 0;\r\n }\r\n // console.log('输出:', xMin, xMax);\r\n //输出\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, xMin);\r\n }\r\n if (chartExtJson.lqhhlSc2 != null && chartExtJson.lqhhlSc2 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc2.row, chartExtJson.lqhhlSc2.col, xMax);\r\n }\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n lines.forEach((item) => {\r\n yValIsAllNull = item.every((ele) => {\r\n return ele == '/';\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 10,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n axisLabel: {\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n if (data == 0) {\r\n return '';\r\n } else {\r\n return yAxisData[data - 1];\r\n }\r\n },\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n // data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 击实\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart30: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n //设置是否选择校正jsIsJz的默认值\r\n if (chartExtJson != null && (chartExtJson.jsIsJz == null || chartExtJson.jsIsJz == undefined)) {\r\n chartExtJson.jsIsJz = true;\r\n }\r\n // console.log(config);\r\n\r\n let isTwoLine = xDataArr.length == 2;\r\n\r\n let xDataSource1 = xDataArr[0], // [1.6, 2.4, 3.5, 4.6, 5.3],\r\n xDataSource2 = isTwoLine ? xDataArr[1] : [], // [1.5, 2.4, 3.6, 4.3, 5.4],\r\n yDataSource1 = yDataArr[0], // [2.25, 2.29, 2.34, 2.29, 2.23],\r\n yDataSource2 = isTwoLine ? yDataArr[1] : []; // [2.27, 2.32, 2.36, 2.33, 2.26];\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n const lineFunc = (xDataSource, yDataSource, isShowMarkPoint, isShowMarkLine, isTwoLineData) => {\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [],\r\n seriesData = []; //处理原始数据为空的值,不然参与mathjs计算会报错\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (\r\n /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item) &&\r\n item != 0 &&\r\n /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(yDataSource[index]) &&\r\n yDataSource[index] != 0\r\n ) {\r\n xData.push(item);\r\n yData.push(yDataSource[index]);\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n xAxisMax = Math.ceil(xMax + 0.1),\r\n xAxisMin = Math.trunc(xMin - 0.1),\r\n yAxisMax = Number(EChartsUtilsComm.getRound(yMax + 0.02, 0.01)),\r\n yAxisMin = Number(EChartsUtilsComm.getRound(yMin - 0.02, 0.01));\r\n\r\n //如果界面设置了校正最佳含水率和最大干密度,则显示界面中的顶点坐标(此时就不显示辅助线了)\r\n let cellValJzZjhsl, cellValJzZdgmd;\r\n if (chartExtJson != null && chartExtJson.jsIsJz) {\r\n if (chartExtJson.jsZjhslJz != null && chartExtJson.jsZjhslJz != undefined) {\r\n cellValJzZjhsl = sheet.getValue(chartExtJson.jsZjhslJz.row, chartExtJson.jsZjhslJz.col);\r\n }\r\n if (chartExtJson.jsZdgmdJz != null && chartExtJson.jsZdgmdJz != undefined) {\r\n cellValJzZdgmd = sheet.getValue(chartExtJson.jsZdgmdJz.row, chartExtJson.jsZdgmdJz.col);\r\n }\r\n\r\n //如果界面输入的最大干密度大于了y轴最大值,则需要重新设置y轴的最大值\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(cellValJzZdgmd) && cellValJzZdgmd > yAxisMax) {\r\n yAxisMax = Number(EChartsUtilsComm.getRound(cellValJzZdgmd + 0.02, 0.01));\r\n }\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n // console.log('无法解决该线性系统');\r\n }\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n // x=[3.5, 4, 4.5, 5, 5.5,6 ],y= [2.262, 2.321, 2.319, 2.292, 2.285, 2.28]\r\n\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //重新设置i,防止i丢失精度\r\n i = Number(temp);\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n // console.log(chartExtJson);\r\n\r\n //默认输出精度\r\n let outJdZjhsl = 0.01,\r\n outJdZdgmd = 0.001;\r\n\r\n //顶点数据\r\n let outValZjhsl = 0,\r\n outValZdgmd = 0;\r\n\r\n //设置Sheet单元格的值(最佳含水率和最大干密度)\r\n if (chartExtJson != null) {\r\n // console.log(4444, chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, arrX[maxIndex]);\r\n\r\n if (chartExtJson.jsZjhslJd != null && chartExtJson.jsZjhslJd != undefined) {\r\n outJdZjhsl = chartExtJson.jsZjhslJd;\r\n }\r\n if (chartExtJson.jsZdgmdJd != null && chartExtJson.jsZdgmdJd != undefined) {\r\n outJdZdgmd = chartExtJson.jsZdgmdJd;\r\n }\r\n\r\n if (arrX[maxIndex] == 0 && max == 0) {\r\n sheet.setValue(chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, '/');\r\n sheet.setValue(chartExtJson.jsZdgmd.row, chartExtJson.jsZdgmd.col, '/');\r\n } else {\r\n outValZjhsl = EChartsUtilsComm.getRound(arrX[maxIndex], outJdZjhsl);\r\n outValZdgmd = EChartsUtilsComm.getRound(max, outJdZdgmd);\r\n\r\n sheet.setValue(chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, outValZjhsl);\r\n sheet.setValue(chartExtJson.jsZdgmd.row, chartExtJson.jsZdgmd.col, outValZdgmd);\r\n }\r\n }\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n\r\n //xData.forEach((item, index) => {\r\n //seriesData.push([item, yData[index]]);\r\n //});\r\n\r\n //计算峰值----目前没有公式 值写死的\r\n const peakvalue = [arrX[maxIndex], Number(EChartsUtilsComm.getRound(max, outJdZdgmd))],\r\n coordX = [peakvalue[0], yAxisMin],\r\n coordY = [xAxisMin, peakvalue[1]];\r\n\r\n let markPointObj = {\r\n data: [\r\n {\r\n xAxis: EChartsUtilsComm.getRound(peakvalue[0], outJdZjhsl),\r\n yAxis: EChartsUtilsComm.getRound(peakvalue[1], outJdZdgmd),\r\n symbolOffset: [0, 15],\r\n symbol: 'circle',\r\n symbolSize: 6,\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n if (Number(data.data.xAxis) == 0 && Number(data.data.yAxis) == 0) {\r\n return '';\r\n } else {\r\n return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n }\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ],\r\n },\r\n markLineObj = {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: [\r\n [\r\n {\r\n coord: coordX,\r\n lineStyle: {\r\n color: '#333', //X轴\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: peakvalue,\r\n },\r\n ],\r\n [\r\n {\r\n coord: coordY,\r\n lineStyle: {\r\n color: '#333', //y轴\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: peakvalue,\r\n },\r\n ],\r\n ],\r\n };\r\n\r\n //如果界面设置了校正最佳含水率和最大干密度,则显示界面中的顶点坐标(此时就不显示辅助线了)\r\n if (chartExtJson.jsIsJz && /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(cellValJzZjhsl) && /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(cellValJzZdgmd)) {\r\n markLineObj = null;\r\n markPointObj.data[0].label = null;\r\n markPointObj.data[0].symbolOffset = null;\r\n markPointObj.data[0].itemStyle.color = '#F56C6C';\r\n markPointObj.data[0].xAxis = cellValJzZjhsl;\r\n markPointObj.data[0].yAxis = cellValJzZdgmd;\r\n markLineObj = null;\r\n }\r\n\r\n let seriesDataObj = {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[isTwoLineData ? 1 : 0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: isTwoLineData ? 'dotted' : 'solid',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[isTwoLineData ? 1 : 0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: isShowMarkPoint ? markPointObj : null,\r\n markLine: isShowMarkLine ? markLineObj : null,\r\n };\r\n\r\n return {\r\n xAxisMin: xAxisMin,\r\n xAxisMax: xAxisMax,\r\n yAxisMin: yAxisMin,\r\n yAxisMax: yAxisMax,\r\n xData: xData,\r\n seriesDataObj: seriesDataObj,\r\n maxPointData: [arrX[maxIndex], max],\r\n };\r\n };\r\n\r\n let xAxisMin = 0,\r\n xAxisMax = 0,\r\n yAxisMin = 0,\r\n yAxisMax = 0,\r\n xData = [],\r\n seriesData = [],\r\n maxPointDataX = 0,\r\n maxPointDataY = 0;\r\n\r\n let lineObj1 = lineFunc(xDataSource1, yDataSource1, !isTwoLine, !isTwoLine, false),\r\n lineObj2;\r\n if (isTwoLine) {\r\n lineObj2 = lineFunc(xDataSource2, yDataSource2, false, false, true);\r\n }\r\n\r\n //此处的作用是,有可能x和y轴的数据都为空,造成lineObj1为undefined,避免报错\r\n if (lineObj1 == undefined || lineObj1 == null) {\r\n return;\r\n }\r\n\r\n //一条线的时候\r\n if (!isTwoLine) {\r\n xAxisMin = lineObj1.xAxisMin;\r\n xAxisMax = lineObj1.xAxisMax;\r\n yAxisMin = lineObj1.yAxisMin;\r\n yAxisMax = lineObj1.yAxisMax;\r\n xData = lineObj1.xData;\r\n seriesData.push(lineObj1.seriesDataObj);\r\n }\r\n //2条线的时候\r\n else {\r\n if (lineObj2 == undefined || lineObj2 == null) {\r\n return;\r\n }\r\n\r\n xAxisMax = lineObj1.xAxisMax;\r\n if (lineObj2.xAxisMax > xAxisMax) {\r\n xAxisMax = lineObj2.xAxisMax;\r\n }\r\n xAxisMin = lineObj1.xAxisMin;\r\n if (lineObj2.xAxisMin < xAxisMin) {\r\n xAxisMin = lineObj2.xAxisMin;\r\n }\r\n yAxisMax = lineObj1.yAxisMax;\r\n if (lineObj2.yAxisMax > yAxisMax) {\r\n yAxisMax = lineObj2.yAxisMax;\r\n }\r\n yAxisMin = lineObj1.yAxisMin;\r\n if (lineObj2.yAxisMin < yAxisMin) {\r\n yAxisMin = lineObj2.yAxisMin;\r\n }\r\n\r\n lineObj1.xData.forEach((item) => {\r\n xData.push(item);\r\n });\r\n lineObj2.xData.forEach((item) => {\r\n xData.push(item);\r\n });\r\n\r\n seriesData.push(lineObj1.seriesDataObj);\r\n seriesData.push(lineObj2.seriesDataObj);\r\n\r\n maxPointDataX = (lineObj1.maxPointData[0] + lineObj2.maxPointData[0]) / 2;\r\n maxPointDataY = (lineObj1.maxPointData[1] + lineObj2.maxPointData[1]) / 2;\r\n\r\n // console.log(\r\n // \t\"两条线最大点的平均值:\",\r\n // \tmaxPointDataX,\r\n // \tmaxPointDataY\r\n // );\r\n\r\n //默认输出精度\r\n let outJdZjhsl = 0.01,\r\n outJdZdgmd = 0.001;\r\n\r\n //顶点数据\r\n let outValZjhsl = 0,\r\n outValZdgmd = 0;\r\n\r\n //设置Sheet单元格的值(最佳含水率和最大干密度)\r\n if (chartExtJson != null) {\r\n // console.log(4444, chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, arrX[maxIndex]);\r\n\r\n if (chartExtJson.jsZjhslJd != null && chartExtJson.jsZjhslJd != undefined) {\r\n outJdZjhsl = chartExtJson.jsZjhslJd;\r\n }\r\n if (chartExtJson.jsZdgmdJd != null && chartExtJson.jsZdgmdJd != undefined) {\r\n outJdZdgmd = chartExtJson.jsZdgmdJd;\r\n }\r\n\r\n if (maxPointDataX == 0 && maxPointDataY == 0) {\r\n sheet.setValue(chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, '/');\r\n sheet.setValue(chartExtJson.jsZdgmd.row, chartExtJson.jsZdgmd.col, '/');\r\n } else {\r\n outValZjhsl = EChartsUtilsComm.getRound(maxPointDataX, outJdZjhsl);\r\n outValZdgmd = EChartsUtilsComm.getRound(maxPointDataY, outJdZdgmd);\r\n\r\n sheet.setValue(chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, outValZjhsl);\r\n sheet.setValue(chartExtJson.jsZdgmd.row, chartExtJson.jsZdgmd.col, outValZdgmd);\r\n }\r\n }\r\n }\r\n\r\n //判断数据是否为/,‘’,null,undefined\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.data[0].value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 40 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: seriesData,\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 筛分\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart50: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = '', //config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName;\r\n\r\n // x轴原始数据、y轴原始数据、y轴原始数据(上限)、y轴原始数据(下限)\r\n const xDataSourceOld = xDataArr[0],\r\n yDataSourceOld = yDataArr[0],\r\n yDataSourceSxOld = yDataArr[1],\r\n yDataSourceXxOld = yDataArr[2];\r\n const allData: any[] = [];\r\n xDataSourceOld.forEach((item, index) => {\r\n allData.push({\r\n x: item,\r\n y: yDataSourceOld[index],\r\n ySx: yDataSourceSxOld[index],\r\n yXx: yDataSourceXxOld[index],\r\n });\r\n });\r\n allData.sort(function (a, b) {\r\n return a.x - b.x;\r\n });\r\n\r\n const xDataSource: any[] = [],\r\n yDataSource: any[] = [],\r\n yDataSourceSx: any[] = [],\r\n yDataSourceXx: any[] = [];\r\n\r\n // 记录上限或下限中值为null的个数\r\n let sxValNullCount = 0;\r\n yDataSourceSxOld.forEach((item, index) => {\r\n if (item == null || item == '/') {\r\n sxValNullCount++;\r\n }\r\n });\r\n\r\n // 如果上限或下限值中的所有值都为null,则只展示筛分曲线的折线\r\n if (sxValNullCount == yDataSourceSxOld.length) {\r\n allData.forEach((item, index) => {\r\n xDataSource.push(item.x);\r\n yDataSource.push(item.y);\r\n yDataSourceSx.push(item.ySx);\r\n yDataSourceXx.push(item.yXx);\r\n });\r\n } else {\r\n // 只获取上限或下限中值不为null的点\r\n allData.forEach((item, index) => {\r\n if (item.ySx != null && item.ySx != '/' && item.yXx != null && item.yXx != '/') {\r\n xDataSource.push(item.x);\r\n yDataSource.push(item.y);\r\n yDataSourceSx.push(item.ySx);\r\n yDataSourceXx.push(item.yXx);\r\n }\r\n });\r\n }\r\n\r\n // x轴需要的数据(x轴原始数据的0.45次方,并修约0.01)、x轴需要的上限数据(x轴原始数据的0.45次方,并修约0.01)、x轴需要的下限数据(x轴原始数据的0.45次方,并修约0.01)、标记线需要的数据\r\n let xData: any[] = [],\r\n xDataSx: any[] = [],\r\n xDataXx: any[] = [],\r\n markLineData: any[] = [];\r\n\r\n // x和y轴的字体大小\r\n const xyFontSize = 10;\r\n\r\n // 组装数据\r\n xDataSource.forEach((item, index) => {\r\n // 得到x轴原始数据的0.45次方值,并修约0.001\r\n const val045 = Number(EChartsUtilsComm.getRound(item ** 0.45, 0.001));\r\n\r\n xData.push([val045, yDataSource[index]]);\r\n markLineData.push({\r\n name: item + '',\r\n xAxis: val045,\r\n label: {\r\n show: xDataSource.length >= 6 && index % 2 != 0 && index < 6 ? false : true, // 控制x轴的名称某些点是否显示,避免重叠的情况\r\n fontSize: xyFontSize,\r\n },\r\n });\r\n\r\n xDataSx.push([val045, yDataSourceSx[index]]);\r\n xDataXx.push([val045, yDataSourceXx[index]]);\r\n });\r\n\r\n /**\r\n * 获取series需要的3条线配置\r\n * @param type 线类型(1:筛分曲线、2:上限、3:下限)\r\n * @param data 对应的坐标点数据\r\n */\r\n const getLineObj = (type, data) => {\r\n const name = type == 1 ? '筛分曲线' : type == 2 ? '上限' : '下限';\r\n const symbol = type == 1 ? 'rect' : type == 2 ? 'triangle' : 'circle';\r\n const lineType = type == 1 ? 'solid' : type == 2 ? 'dotted' : [10, 5];\r\n const color = type == 1 ? lineData[0].lineColor : type == 2 ? lineData[1].lineColor : lineData[2].lineColor; //type == 1 ? '#F56C6C' : type == 2 ? '#409EFF' : '#000';\r\n\r\n let obj = {\r\n name: name,\r\n type: 'line',\r\n smooth: true, // 平滑的线条\r\n // 设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: symbol,\r\n symbolSize: 5,\r\n z: 10, // 控制曲线的浮动层级,避免在markLine下方被遮住\r\n // 线条的颜色\r\n lineStyle: {\r\n color: color,\r\n // 线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: lineType,\r\n },\r\n // 线条上数据点的颜色\r\n itemStyle: {\r\n color: color,\r\n },\r\n data: data,\r\n connectNulls: true, // 是否连接空数据\r\n markLine: {\r\n symbol: '', // 取消箭头\r\n silent: true, // 取消鼠标hover事件\r\n label: {\r\n // 标线的文本,模拟x轴显示的内容\r\n position: 'start', // 改变label位置\r\n //rotate: 45, // 设置文字旋转度数(注意:ECharts官网文档居然没有rotate这个属性的说明)\r\n // backgroundColor:'#fff'\r\n // color:'#f00',// 文字颜色\r\n formatter: (data) => {\r\n return data.name;\r\n },\r\n },\r\n lineStyle: { color: '#e0e6f1', type: 'solid' },\r\n data: markLineData,\r\n },\r\n };\r\n\r\n return obj;\r\n };\r\n\r\n // 验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (\r\n yDataSourceSxOld.some((item) => item != null && item != undefined && item != '/') ||\r\n yDataSourceXxOld.some((item) => item != null && item != undefined && item != '/')\r\n ) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,// 是否显示外边框线\r\n // borderColor: '#f00',// 外边框线颜色\r\n top: 20,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 35,\r\n containLabel: true,\r\n },\r\n // 提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n if (datas && datas[0].data.length > 1) {\r\n let xObj = markLineData.filter((item) => item.xAxis == datas[0].data[0]);\r\n\r\n return datas[0].seriesName + '(' + xObj[0].name + ')' + ':' + datas[0].data[1];\r\n } else {\r\n return datas[0].data;\r\n }\r\n },\r\n },\r\n // 顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 5,\r\n textStyle: {\r\n fontSize: 18,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n // 图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n left: 'center',\r\n data: ['筛分曲线', '上限', '下限'],\r\n selected: {\r\n 筛分曲线: true, // 显示\r\n 上限: true, // 显示\r\n 下限: true, // 显示\r\n },\r\n selectedMode: 'multiple', // 用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n axisTick: { show: false }, // 隐藏刻度线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n // 网格线,参考文档:https://echarts.apache.org/zh/option.html#xAxis.splitLine\r\n splitLine: {\r\n show: false, // 隐藏分割线\r\n },\r\n min: xData.length > 0 ? (xData[0][0] > 0.2 ? xData[0][0] - 0.2 : 0) : null, //控制x轴的最小值\r\n max: xData.length > 0 ? xData[xData.length - 1][0] + 0.1 : null,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', // '#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n splitNumber: 10, // 设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLabel: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n ],\r\n series: [getLineObj(1, xData), getLineObj(2, xDataSx), getLineObj(3, xDataXx)],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 界限含水率\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart70: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n //此图形排除了图形数据不正确的情况,如果数据不对,则直接返回{}\r\n if (\r\n xDataArr[0].some((item) => item == null || item == '' || item == undefined) ||\r\n yDataArr[0].some((item) => item == null || item == '' || item == undefined)\r\n ) {\r\n return {};\r\n }\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0], // [22.9, 32.4, 36.9],\r\n yData = yDataArr[0], // [2.2, 11.6, 19.8],\r\n ztzl = 100, //锥体质量(g),100或76\r\n cllx = '砂类土', //材料类型,砂类土或细粒土\r\n logx = [], // c,b,a\r\n logy = [];\r\n\r\n //获取锥体质量和材料类型\r\n if (chartExtJson != null) {\r\n let curZtzl = sheet.getValue(chartExtJson.jxhslZtzl.row, chartExtJson.jxhslZtzl.col),\r\n curCllx = sheet.getValue(chartExtJson.jxhslCllx.row, chartExtJson.jxhslCllx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curZtzl)) {\r\n curZtzl = Number(curZtzl);\r\n if (curZtzl == 100 || curZtzl == 76) {\r\n ztzl = curZtzl;\r\n }\r\n }\r\n if (curCllx == '砂类土' || curCllx == '细粒土') {\r\n cllx = curCllx;\r\n }\r\n }\r\n\r\n // console.log(ztzl, cllx);\r\n\r\n //先求对数\r\n for (const item1 of xData) {\r\n logx.push(Math.log(item1));\r\n }\r\n for (const item2 of yData) {\r\n logy.push(Math.log(item2));\r\n }\r\n //求ab / ac 斜率 公式k=y2-y1 / x2-x1\r\n let abk = (logy[2] - logy[1]) / (logx[2] - logx[1]);\r\n let ack = (logy[2] - logy[0]) / (logx[2] - logx[0]);\r\n\r\n const xMax = Math.max.apply(Math, xData),\r\n xMin = Math.min.apply(Math, xData),\r\n xAxisMax = xMax + 1,\r\n xAxisMin = xMin - 0.3,\r\n yMax = Math.max.apply(Math, yData),\r\n yMin = Math.min.apply(Math, yData),\r\n yAxisMax = yMax + 1,\r\n yAxisMin = yMin - 2,\r\n dropName = ['C', 'B', 'A'],\r\n seriesData = [];\r\n\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index], dropName[index]]);\r\n });\r\n\r\n //求ab / ac 延长线方法\r\n function getYOnLine(point1, point2, point3X) {\r\n const logX1 = Math.log(point1[0]);\r\n const logY1 = Math.log(point1[1]);\r\n const logX2 = Math.log(point2[0]);\r\n const logY2 = Math.log(point2[1]);\r\n const slope = (logY2 - logY1) / (logX2 - logX1);\r\n const logPoint3X = Math.log(point3X);\r\n const logY = logY1 + slope * (logPoint3X - logX1);\r\n return Math.exp(logY);\r\n }\r\n\r\n let point3X = 20;\r\n let abd3 = getYOnLine([xData[2], yData[2]], [xData[1], yData[1]], point3X);\r\n let zero_ab = [20, abd3];\r\n let acd3 = getYOnLine([xData[2], yData[2]], [xData[0], yData[0]], point3X);\r\n let zero_ac = [20, acd3];\r\n\r\n // console.log(zero_ab, 'zero_ab');\r\n // console.log(zero_ac, 'zero_ac');\r\n\r\n //第一次计算D-y值,代入A点的X坐标\r\n function HpCoordinates(wl) {\r\n let hp;\r\n if (cllx == '砂类土') {\r\n //砂类土\r\n hp = 29.6 - 1.22 * wl + 0.017 * wl * wl - 0.0000744 * wl * wl * wl;\r\n } else {\r\n //细粒土\r\n hp = wl / (0.524 * wl - 7.606);\r\n }\r\n return hp;\r\n }\r\n\r\n let coordX = [];\r\n let coordY = [];\r\n let point_hp = [];\r\n\r\n let Dy = HpCoordinates(xData[2]);\r\n let Dylog = Math.log(Dy);\r\n let hp0_xab = (abk * logx[2] - (logy[2] - Dylog)) / abk;\r\n let hp0_xac = (ack * logx[2] - (logy[2] - Dylog)) / ack;\r\n if (hp0_xab - hp0_xac >= 2) {\r\n //return '超差!';\r\n }\r\n let hp0_xcenter = Math.exp((hp0_xab + hp0_xac) / 2);\r\n let Dxlog = Math.log(hp0_xcenter);\r\n let adk = (logy[2] - Dylog) / (logx[2] - Dxlog); //AD 斜率\r\n\r\n //输出的hp、wl和wp\r\n let scHp, scWl, scWp;\r\n\r\n //判断锥数\r\n if (ztzl == 76) {\r\n //计算wl ad直线上y=17时,对应的x值\r\n let wly = Math.log(17);\r\n let wlx = (adk * logx[2] - (logy[2] - wly)) / adk;\r\n let wl = Math.exp(wlx);\r\n\r\n //计算WP:ad直线上y=2时,对应的x值\r\n let wpy = Math.log(2);\r\n let wpx = (adk * logx[2] - (logy[2] - wpy)) / adk;\r\n let wp = Math.exp(wpx);\r\n\r\n point_hp = [hp0_xcenter, Dy];\r\n coordX = [hp0_xcenter, yAxisMin];\r\n coordY = [xAxisMin, Dy];\r\n seriesData.push([hp0_xcenter, Dy, 'Hp']);\r\n\r\n scHp = Dy;\r\n scWl = wl;\r\n scWp = wp;\r\n // console.log('输出:', wp, wl, Dy);\r\n } else if (ztzl == 100) {\r\n //计算wl的值----先求AD斜率再代入y=20,求X (X即Wl的值)\r\n let wly = Math.log(20);\r\n let wlx = (adk * logx[2] - (logy[2] - wly)) / adk;\r\n let wl = Math.exp(wlx);\r\n\r\n //第二次计算hp值\r\n let hpy2 = HpCoordinates(wl);\r\n let hpylog2 = Math.log(hpy2);\r\n let hp0_xab2 = (abk * logx[2] - (logy[2] - hpylog2)) / abk;\r\n let hp0_xac2 = (ack * logx[2] - (logy[2] - hpylog2)) / ack;\r\n\r\n let hp0_xcenter2 = Math.exp((hp0_xab2 + hp0_xac2) / 2);\r\n let wp = hp0_xcenter2;\r\n\r\n point_hp = [hp0_xcenter2, hpy2];\r\n\r\n coordX = [hp0_xcenter2, yAxisMin];\r\n coordY = [xAxisMin, hpy2];\r\n seriesData.push([hp0_xcenter2, hpy2, 'Hp']);\r\n\r\n scHp = hpy2;\r\n scWl = wl;\r\n scWp = wp;\r\n // console.log('输出:', wp, wl, hpy2);\r\n }\r\n\r\n //判断是否是一个数字\r\n if (isNaN(scHp) || isNaN(scWl) || isNaN(scWp)) {\r\n scHp = 0;\r\n scWl = 0;\r\n scWp = 0;\r\n }\r\n\r\n //设置Sheet单元格的值(输出hp、wl和wp)\r\n if (chartExtJson != null) {\r\n //默认输出精度\r\n let outJdHp = 0.01,\r\n outJdWl = 0.01,\r\n outJdWp = 0.01;\r\n if (chartExtJson.jxhslScHpJd != null && chartExtJson.jxhslScHpJd != undefined) {\r\n outJdHp = chartExtJson.jxhslScHpJd;\r\n }\r\n if (chartExtJson.jxhslScWlJd != null && chartExtJson.jxhslScWlJd != undefined) {\r\n outJdWl = chartExtJson.jxhslScWlJd;\r\n }\r\n if (chartExtJson.jxhslScWpJd != null && chartExtJson.jxhslScWpJd != undefined) {\r\n outJdWp = chartExtJson.jxhslScWpJd;\r\n }\r\n\r\n if (chartExtJson.jxhslScHp != null && chartExtJson.jxhslScHp != undefined) {\r\n if (scHp == 0) {\r\n sheet.setValue(chartExtJson.jxhslScHp.row, chartExtJson.jxhslScHp.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.jxhslScHp.row, chartExtJson.jxhslScHp.col, EChartsUtilsComm.getRound(scHp, outJdHp));\r\n }\r\n }\r\n if (chartExtJson.jxhslScWl != null && chartExtJson.jxhslScWl != undefined) {\r\n if (scWl == 0) {\r\n sheet.setValue(chartExtJson.jxhslScWl.row, chartExtJson.jxhslScWl.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.jxhslScWl.row, chartExtJson.jxhslScWl.col, EChartsUtilsComm.getRound(scWl, outJdWl));\r\n }\r\n }\r\n if (chartExtJson.jxhslScWp != null && chartExtJson.jxhslScWp != undefined) {\r\n if (scWp == 0) {\r\n sheet.setValue(chartExtJson.jxhslScWp.row, chartExtJson.jxhslScWp.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.jxhslScWp.row, chartExtJson.jxhslScWp.col, EChartsUtilsComm.getRound(scWp, outJdWp));\r\n }\r\n }\r\n }\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (\r\n yData.some((item) => item != null && item != undefined && item != '/') ||\r\n yData.some((item) => item != null && item != undefined && item != '/')\r\n ) {\r\n yValIsAllNull = false;\r\n }\r\n let option = {\r\n grid: {\r\n top: 20,\r\n left: !yValIsAllNull ? 50 : 25,\r\n right: 10,\r\n bottom: 35,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + datas[0].value[1] : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'log',\r\n min: xAxisMin,\r\n max: xAxisMax,\r\n interval: 0,\r\n axisTick: {\r\n show: false,\r\n alignWithLabel: true,\r\n },\r\n splitLine: {\r\n show: false,\r\n },\r\n axisLabel: {\r\n show: false,\r\n },\r\n },\r\n yAxis: {\r\n type: 'log',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n min: yAxisMin,\r\n max: yAxisMax,\r\n interval: 0,\r\n axisTick: {\r\n show: false,\r\n alignWithLabel: true,\r\n },\r\n splitLine: {\r\n show: false,\r\n },\r\n axisLabel: {\r\n show: false,\r\n },\r\n },\r\n series: [\r\n {\r\n name: legendName,\r\n data: seriesData,\r\n type: 'scatter',\r\n symbol: 'circle',\r\n smooth: false,\r\n symbolSize: 6,\r\n label: {\r\n show: true,\r\n formatter: function (param) {\r\n return param.data[2];\r\n },\r\n position: 'right',\r\n minMargin: 2,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'],\r\n silent: true,\r\n label: {\r\n show: true,\r\n position: 'start',\r\n color: '#000000',\r\n },\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n },\r\n data: [\r\n { xAxis: seriesData[0][0] },\r\n { xAxis: seriesData[1][0] },\r\n { xAxis: seriesData[2][0] },\r\n { yAxis: seriesData[0][1] },\r\n { yAxis: seriesData[1][1] },\r\n { yAxis: seriesData[2][1] },\r\n [\r\n {\r\n coord: coordX,\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed',\r\n },\r\n },\r\n { coord: point_hp }, //Hp---x\r\n ],\r\n [\r\n {\r\n coord: coordY,\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed', //dashed dotted\r\n },\r\n },\r\n { coord: point_hp }, //Hp----y\r\n ],\r\n ],\r\n },\r\n },\r\n {\r\n //a-b连线\r\n type: 'line',\r\n data: [\r\n [xData[2], yData[2]],\r\n [xData[1], yData[1]],\r\n ],\r\n lineStyle: {\r\n color: '#0000FF',\r\n type: 'solid',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n {\r\n //a-b 延长线\r\n type: 'line',\r\n data: [\r\n [xData[1], yData[1]],\r\n [zero_ab[0], zero_ab[1]],\r\n ],\r\n lineStyle: {\r\n color: '#000000',\r\n type: 'dashed',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n {\r\n //a-c连线\r\n type: 'line',\r\n data: [\r\n [xData[2], yData[2]],\r\n [xData[0], yData[0]],\r\n ],\r\n lineStyle: {\r\n color: '#0000FF',\r\n type: 'solid',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n {\r\n //a-c 延长线\r\n type: 'line',\r\n data: [\r\n [xData[0], yData[0]],\r\n [zero_ac[0], zero_ac[1]],\r\n ],\r\n lineStyle: {\r\n color: '#000000',\r\n type: 'dashed',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n {\r\n //a-Hp连线\r\n type: 'line',\r\n data: [[xData[2], yData[2]], point_hp],\r\n lineStyle: {\r\n color: '#0000FF',\r\n type: 'solid',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 水泥、石灰标准曲线\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart90: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n //y轴原始数据\r\n let yDataSource = yDataArr[0]; // [1.2, 5.6, 10.8, 16, 20.8];\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x轴的数据\r\n let xData = xDataArr[0]; // [0, 2, 4, 6, 8];\r\n\r\n //重新处理x轴和y轴的数据,排除x轴后面为0的数据(因为有可能在单元格中,最后一个单元格的值可能没有填,这时候默认传的是0)\r\n let xDataCl = [],\r\n yDataSourceCl = [];\r\n for (let i = 0; i < xData.length; i++) {\r\n if (xData[i] != '/' && (i == 0 || (i > 0 && xData[i] != 0))) {\r\n xDataCl.push(xData[i]);\r\n yDataSourceCl.push(yDataSource[i]);\r\n } else if (i > 0 && xData[i] == 0) {\r\n break;\r\n }\r\n }\r\n xData = xDataCl;\r\n yDataSource = yDataSourceCl;\r\n\r\n //series的data数据、series的markPoint的data数据、series的markLine的data数据\r\n let seriesData = [],\r\n markPointData = [],\r\n markLineData = [...xData];\r\n\r\n //此目的是显示更多的x轴数据\r\n //假设x轴原始数据为[0, 2, 4, 6, 8],在这个数组中没有1、3、5等数据,此时就可以通过下面的方式进行增加\r\n /*\r\n\t\tfor (let i = 0; i < 20; i++) {\r\n\t\t\tif (!markLineData.some((item) => item == i)) {\r\n\t\t\t\tmarkLineData.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\t\t*/\r\n\r\n //获取y轴趋势公式对象\r\n const gsS = EChartsUtilsComm.calcTrend(xData, yDataSource, xData[0]);\r\n\r\n //输出方程表达式\r\n if (chartExtJson != null) {\r\n if (chartExtJson.jxhslSnShScfc != null && chartExtJson.jxhslSnShScfc != undefined) {\r\n // console.log('输出公式:',`Y=${getRound(gsS.xl,0.0001)}X+${getRound(gsS.jj,0.0001)}`)\r\n if (gsS.xl == '' || gsS.jj == '') {\r\n sheet.setValue(chartExtJson.jxhslSnShScfc.row, chartExtJson.jxhslSnShScfc.col, '/');\r\n } else {\r\n sheet.setValue(\r\n chartExtJson.jxhslSnShScfc.row,\r\n chartExtJson.jxhslSnShScfc.col,\r\n `Y=${EChartsUtilsComm.getRound(gsS.xl, 0.0001)}X+${EChartsUtilsComm.getRound(gsS.jj, 0.0001)}`\r\n );\r\n }\r\n }\r\n }\r\n\r\n let yDataCopy = [];\r\n //获取y轴原始数据对应的趋势数据\r\n xData.forEach((item, index) => {\r\n let curYData = Number(EChartsUtilsComm.getRound(eval(gsS.gs.replace('x', item + '')), 0.01));\r\n if (isNaN(curYData)) {\r\n curYData = 0;\r\n }\r\n\r\n seriesData.push([item, curYData]);\r\n yDataCopy.push(curYData);\r\n markPointData.push({\r\n xAxis: item,\r\n yAxis: yDataSource[index],\r\n symbol: 'circle',\r\n symbolSize: 6,\r\n });\r\n\r\n //console.log(curYData, \"curYData\")\r\n });\r\n\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == 0 || item[1] == null || item[1] == undefined) {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (yDataCopy.some((item) => item != 0 || item[1] == null || item[1] == undefined)) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 22,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 35,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].value[0] + ':' + datas[0].value[1] : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n splitLine: { show: false }, // 隐藏分割线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n opacity: 0,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: markPointData,\r\n },\r\n markLine: {\r\n symbol: false, //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n position: 'start', //改变label位置\r\n formatter: (obj) => obj.value, //格式化显示的x轴标签内容\r\n },\r\n lineStyle: { color: '#ddd', type: 'solid' },\r\n data: markLineData.map((val) => {\r\n return {\r\n xAxis: val,\r\n };\r\n }),\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 延迟时间-强度曲线\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart110: (\r\n config: EChartsUtilsConfigModel,\r\n xDataArr: Array<Array<any>>,\r\n yDataArr: Array<Array<any>>,\r\n xDataArrSource: Array<Array<any>>,\r\n yDataArrSource: Array<Array<any>>\r\n ) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n const xDataSource = xDataArrSource[0]; // ['0.0','1.0','2.0','3.0','4.0','5.0'];\r\n\r\n let xData = [];\r\n xDataSource.forEach((item, index) => {\r\n if (item == '/') {\r\n xData.push(item);\r\n } else {\r\n xData.push(Number(item));\r\n }\r\n });\r\n\r\n //y轴的数据\r\n let yData = yDataArr[0]; // [4.4,4.3,4.3,4.2,4.1,3.7];\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n if (item != '/' && item != undefined && item != null) {\r\n seriesData.push([item, yData[index]]);\r\n }\r\n });\r\n\r\n let yValIsAllNull = false;\r\n if (seriesData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 25,\r\n right: 15,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category', //设置x轴为对数坐标轴\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n let curXName = '';\r\n for (let i = 0; i < xData.length; i++) {\r\n if (xData[i] == value) {\r\n curXName = xDataSource[i];\r\n if (curXName == '/') {\r\n curXName = '';\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return curXName;\r\n },\r\n },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n },\r\n ],\r\n };\r\n return option;\r\n },\r\n /**\r\n * 颗粒组成(筛分法)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart130: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n // console.log(config);\r\n // console.log(xDataArr);\r\n // console.log(yDataArr);\r\n\r\n //x和y轴的数据\r\n const xData = xDataArr[0], // [60, 40, 20, 10, 5, 2, 1, 0.5, 0.25, 0.075],\r\n yData = yDataArr[0]; // [100.0, 100.0, 88.3, 69.3, 46.7, 27.0, 19.7, 5.6, 0.5, 0.3];\r\n let xMin = 0.01,\r\n xMax = 200;\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item == '筛底' ? 0 : item, yData[index]]);\r\n });\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n if (yValIsAllNull) {\r\n xMin = null;\r\n xMax = null;\r\n }\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 20,\r\n right: 15,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'log', //设置x轴为对数坐标轴\r\n logBase: 10, //可以设置对数轴的底数,默认为10\r\n inverse: true,\r\n min: xMin,\r\n max: xMax,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 回弹模量 (承载板法)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart150: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n const xData = xDataArr[0], // [25, 50, 100, 150, 200],\r\n yData = yDataArr[0]; // [0.72, 1.07, 1.87, 2.63, 3.48];\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 55,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 10,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 18,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n splitLine: { show: false }, // 隐藏分割线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n position: 'top', //设置x轴在顶部显示\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n markLine: {\r\n symbol: false, //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n position: 'start', //改变label位置\r\n formatter: (obj) => obj.value, //格式化显示的x轴标签内容\r\n },\r\n lineStyle: { color: '#ddd', type: 'solid' },\r\n data: xData.map((val) => {\r\n return {\r\n xAxis: val,\r\n };\r\n }),\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 土的回弹模量 (强度仪法)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart170: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n const xData = xDataArr[0], // [25, 50, 100, 150, 200],\r\n yData = yDataArr[0]; // [0.72, 1.07, 1.87, 2.63, 3.48];\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 55,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 10,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 18,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n splitLine: { show: false }, // 隐藏分割线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n position: 'top', //设置x轴在顶部显示\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n markLine: {\r\n symbol: false, //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n position: 'start', //改变label位置\r\n formatter: (obj) => obj.value, //格式化显示的x轴标签内容\r\n },\r\n lineStyle: { color: '#ddd', type: 'solid' },\r\n data: xData.map((val) => {\r\n return {\r\n xAxis: val,\r\n };\r\n }),\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 28d抗压强度与胶水比关系\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart190: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0], // [2.32, 2.5, 2.7],\r\n yData = yDataArr[0]; // [42.5, 47.1, 49.1];\r\n\r\n //处理数据\r\n xData = xData.filter((item) => item != null && item != undefined && item != '/' && (item._code == null || item._code == undefined));\r\n yData = yData.filter((item) => item != null && item != undefined && item != '/' && (item._code == null || item._code == undefined));\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item == null || item == undefined || item == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n xData = [];\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 18,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n if (value == '/') {\r\n return '';\r\n } else {\r\n return value;\r\n }\r\n },\r\n },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: yData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 混凝土拌合物含气量\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart210: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n //x和y轴的原始数据\r\n let xDataSource = xDataArr[0], // [0.093, 0.081, 0.068, 0.063, 0.057, 0.052, 0.049, 0.044, 0.041, 0.038, 0.036],\r\n yDataSource = yDataArr[0]; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //series需要的数据\r\n const seriesData = [];\r\n\r\n for (let i = xDataSource.length - 1; i >= 0; i--) {\r\n const item = xDataSource[i];\r\n\r\n if (item != null && item != undefined && item != '/' && (item._error == null || item._error == undefined)) {\r\n seriesData.push([item, yDataSource[i]]);\r\n }\r\n }\r\n\r\n //x和y轴的字体大小\r\n const xyFontSize = 10;\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xDataSource.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xDataSource.forEach((item) => {\r\n if (item == null || item == undefined || item == '/' || (item._error != null && item._error != undefined)) {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xDataSource.length) {\r\n yValIsAllNull = true;\r\n //xDataSource = [];\r\n }\r\n if (yDataSource.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n const getXline = () => {\r\n let arr = [];\r\n [0, 0.02, 0.04, 0.06, 0.08, 0.1].forEach((val) => {\r\n xDataSource.forEach((item) => {\r\n let obj: any = { xAxis: '' };\r\n\r\n if (item == '/') {\r\n obj.xAxis = '';\r\n arr.push(obj);\r\n } else {\r\n obj.xAxis = val;\r\n arr.push(obj);\r\n }\r\n });\r\n });\r\n\r\n //去重\r\n let uniqueData = arr.filter((item, index, self) => index === self.findIndex((t) => t.xAxis == item.xAxis));\r\n return nullCount == xDataSource.length ? [] : uniqueData;\r\n };\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: !yValIsAllNull && seriesData.length > 0 ? 30 : 25,\r\n right: 10,\r\n bottom: 40,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].value[0] + ':' + datas[0].value[1] : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n splitLine: { show: false }, // 隐藏分割线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull && seriesData.length > 0 ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n axisLabel: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n markLine: {\r\n symbol: false, //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n position: 'start', //改变label位置\r\n formatter: (obj) => obj.value, //格式化显示的x轴标签内容\r\n fontSize: xyFontSize,\r\n },\r\n lineStyle: { color: '#ddd', type: 'solid' },\r\n data: getXline(),\r\n // data: [0, 0.02, 0.04, 0.06, 0.08, 0.1].map((val) => {\r\n // return {\r\n // xAxis: val,\r\n // }\r\n // }),\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 混凝土拌合物凝结时间\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart230: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n /*\r\n\t\t\t此处需要注意的是,如果单元格A3=A1-A2,就需要将A3=TEXT(A1-A2, \"h\"\":\"\"m\")\r\n\r\n\t\t\tExcel中默认时间相减得到的是天为单位,因此此处使用了TEXT函数来格式化相减的时间差格式\r\n\r\n\t\t\t=TEXT(A1-A2, \"h\"\":\"\"m\")\r\n\t\t\t=INT(A1-A2) & \"天\" & TEXT(A1-A2, \"h\"\"小时\"\"m\"\"分\"\"\")\r\n\r\n\t\t*/\r\n\r\n //折线的数量\r\n let lineCount = xDataArr.length;\r\n\r\n //原始数据\r\n let xDataSource1 = [], // ['6:20', '6:50', '7:20', '7:50', '7:56', '8:26', '8:56', '9:26', '9:56', '10:11'],\r\n xDataSource2 = [], // ['6:27', '6:57', '7:32', '8:02', '8:05', '8:35', '9:05', '9:35', '10:05', '10:22'],\r\n xDataSource3 = [], // ['6:10', '6:40', '7:10', '7:40', '8:03', '8:13', '8:42', '9:12', '9:40', '10:12'],\r\n yDataSource1 = [], // [0.8, 1.2, 2.2, 3.4, 3.6, 7.8, 11.8, 16.6, 24.6, 28.2],\r\n yDataSource2 = [], // [0.8, 1.3, 2.4, 3.4, 3.5, 7.7, 12.2, 16.7, 25, 28.2],\r\n yDataSource3 = []; // [0.7, 1, 1.9, 3, 3.3, 3.5, 8.2, 13.8, 20.2, 28.2];\r\n\r\n //折线1\r\n xDataSource1 = EChartsUtilsComm.filterNullEmptyErrArray(xDataArr[0]); // ['6:20', '6:50', '7:20', '7:50', '7:56', '8:26', '8:56', '9:26', '9:56', '10:11'],\r\n yDataSource1 = EChartsUtilsComm.filterNullEmptyErrArray(yDataArr[0]); // [0.8, 1.2, 2.2, 3.4, 3.6, 7.8, 11.8, 16.6, 24.6, 28.2],\r\n\r\n //折线2\r\n if (lineCount == 2) {\r\n xDataSource2 = EChartsUtilsComm.filterNullEmptyErrArray(xDataArr[1]); // ['6:27', '6:57', '7:32', '8:02', '8:05', '8:35', '9:05', '9:35', '10:05', '10:22'],\r\n yDataSource2 = EChartsUtilsComm.filterNullEmptyErrArray(yDataArr[1]); // [0.8, 1.3, 2.4, 3.4, 3.5, 7.7, 12.2, 16.7, 25, 28.2],\r\n }\r\n //折线3\r\n if (lineCount == 3) {\r\n xDataSource2 = EChartsUtilsComm.filterNullEmptyErrArray(xDataArr[1]); // ['6:27', '6:57', '7:32', '8:02', '8:05', '8:35', '9:05', '9:35', '10:05', '10:22'],\r\n yDataSource2 = EChartsUtilsComm.filterNullEmptyErrArray(yDataArr[1]); // [0.8, 1.3, 2.4, 3.4, 3.5, 7.7, 12.2, 16.7, 25, 28.2],\r\n xDataSource3 = EChartsUtilsComm.filterNullEmptyErrArray(xDataArr[2]); // ['6:10', '6:40', '7:10', '7:40', '8:03', '8:13', '8:42', '9:12', '9:40', '10:12'],\r\n yDataSource3 = EChartsUtilsComm.filterNullEmptyErrArray(yDataArr[2]); // [0.7, 1, 1.9, 3, 3.3, 3.5, 8.2, 13.8, 20.2, 28.2];\r\n }\r\n\r\n //3条线的x轴数据\r\n let xData1 = [],\r\n xData2 = [],\r\n xData3 = [];\r\n\r\n //组装数据\r\n\r\n xDataSource1.forEach((item, index) => {\r\n //js的时间格式\r\n if (typeof item == 'object') {\r\n xData1.push(item.getHours() * 60 + item.getMinutes());\r\n }\r\n //数字\r\n else if (typeof item == 'number') {\r\n xData1.push(item);\r\n }\r\n //文本格式\r\n else {\r\n const curArr = item.split(':');\r\n const curItemMins = Number(curArr[0]) * 60 + Number(curArr[1]);\r\n xData1.push(curItemMins);\r\n }\r\n });\r\n\r\n xDataSource2.forEach((item, index) => {\r\n //js的时间格式\r\n if (typeof item == 'object') {\r\n xData2.push(item.getHours() * 60 + item.getMinutes());\r\n }\r\n //数字\r\n else if (typeof item == 'number') {\r\n xData2.push(item);\r\n }\r\n //文本格式\r\n else {\r\n const curArr = item.split(':');\r\n const curItemMins = Number(curArr[0]) * 60 + Number(curArr[1]);\r\n xData2.push(curItemMins);\r\n }\r\n });\r\n\r\n xDataSource3.forEach((item, index) => {\r\n //js的时间格式\r\n if (typeof item == 'object') {\r\n xData3.push(item.getHours() * 60 + item.getMinutes());\r\n }\r\n //数字\r\n else if (typeof item == 'number') {\r\n xData3.push(item);\r\n }\r\n //文本格式\r\n else {\r\n const curArr = item.split(':');\r\n const curItemMins = Number(curArr[0]) * 60 + Number(curArr[1]);\r\n xData3.push(curItemMins);\r\n }\r\n });\r\n\r\n //x轴数据前后增加一个点,y轴数据前后也增加一个点\r\n if (xDataSource1.length > 0) {\r\n xData1.push(xData1[xData1.length - 1] + 20);\r\n xData1.unshift(xData1[0] - 20);\r\n yDataSource1.push(null);\r\n yDataSource1.unshift(null);\r\n }\r\n\r\n if (lineCount == 2) {\r\n if (xDataSource2.length > 0) {\r\n xData2.push(xData2[xData2.length - 1] + 20);\r\n xData2.unshift(xData2[0] - 20);\r\n yDataSource2.push(null);\r\n yDataSource2.unshift(null);\r\n }\r\n }\r\n if (lineCount == 3) {\r\n if (xDataSource3.length == 0) {\r\n xData2.push(xData2[xData2.length - 1] + 20);\r\n xData2.unshift(xData2[0] - 20);\r\n yDataSource2.push(null);\r\n yDataSource2.unshift(null);\r\n xData3.push(xData3[xData3.length - 1] + 20);\r\n xData3.unshift(xData3[0] - 20);\r\n yDataSource3.push(null);\r\n yDataSource3.unshift(null);\r\n }\r\n }\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName;\r\n\r\n //获取xAxis需要的数据\r\n const getxAxisObj = (type, data) => {\r\n return {\r\n type: 'category',\r\n data: data,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n show: type == 1,\r\n splitLine: {\r\n show: true,\r\n },\r\n };\r\n };\r\n\r\n let xAxisData = [getxAxisObj(1, xData1)];\r\n if (lineCount == 2) {\r\n xAxisData.push(getxAxisObj(2, xData2));\r\n }\r\n if (lineCount == 3) {\r\n xAxisData.push(getxAxisObj(2, xData2));\r\n xAxisData.push(getxAxisObj(3, xData3));\r\n }\r\n\r\n //获取series需要的数据\r\n const getLineObj = (type, data) => {\r\n const name = type == 1 ? '第一组' : type == 2 ? '第二组' : '第三组';\r\n const symbol = type == 1 ? 'rect' : type == 2 ? 'triangle' : 'circle';\r\n const lineType = type == 1 ? 'solid' : type == 2 ? 'dotted' : [10, 5];\r\n const color =\r\n type == 1 && lineData.length >= 1\r\n ? lineData[0].lineColor\r\n : type == 2 && lineData.length >= 2\r\n ? lineData[1].lineColor\r\n : type == 3 && lineData.length >= 3\r\n ? lineData[2].lineColor\r\n : '#000';\r\n\r\n let obj = {\r\n name: name,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: symbol, //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: color,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: lineType,\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: color,\r\n },\r\n data: data,\r\n };\r\n\r\n return obj;\r\n };\r\n\r\n //series: [getLineObj(1, yDataSource1), getLineObj(2, yDataSource2), getLineObj(3, yDataSource3)],\r\n let seriesData = [getLineObj(1, yDataSource1)];\r\n if (lineCount == 2) {\r\n if (yDataSource2.length > 0) {\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n }\r\n }\r\n if (lineCount == 3) {\r\n if (yDataSource2.length > 0) {\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n }\r\n if (yDataSource3.length > 0) {\r\n seriesData.push(getLineObj(3, yDataSource3));\r\n }\r\n }\r\n\r\n let legendData = lineCount == 1 ? ['第一组'] : lineCount == 2 ? ['第一组', '第二组'] : ['第一组', '第二组', '第三组'],\r\n legendSelected: any =\r\n lineCount == 1 ? { 第一组: true } : lineCount == 2 ? { 第一组: true, 第二组: true } : { 第一组: true, 第二组: true, 第三组: true };\r\n\r\n //console.log(xData1,xData2,xData3,seriesData)\r\n let yValIsAllNull = false;\r\n let xValIsAllNull = false;\r\n let topmargin = 0;\r\n //为空不展示\r\n if (xDataSource1.length == 0) {\r\n xValIsAllNull = true;\r\n topmargin = 15;\r\n\r\n legendData = ['第二组', '第三组'];\r\n legendSelected = { 第一组: false, 第二组: true, 第三组: true };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData2));\r\n xAxisData.push(getxAxisObj(3, xData3));\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n seriesData.push(getLineObj(3, yDataSource3));\r\n\r\n if (xDataSource2.length == 0) {\r\n topmargin = 35;\r\n\r\n legendData = ['第三组'];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: true };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData3));\r\n seriesData.push(getLineObj(3, yDataSource3));\r\n\r\n if (xDataSource3.length == 0) {\r\n topmargin = 0;\r\n\r\n yValIsAllNull = true;\r\n legendData = [];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: false };\r\n xAxisData = [];\r\n seriesData = [];\r\n xAxisData.push(getxAxisObj(1, []));\r\n seriesData.push(getLineObj(3, []));\r\n }\r\n }\r\n } else if (xDataSource2.length == 0) {\r\n topmargin = 15;\r\n xValIsAllNull = true;\r\n legendData = ['第一组', '第三组'];\r\n legendSelected = { 第一组: true, 第二组: false, 第三组: true };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData1));\r\n xAxisData.push(getxAxisObj(3, xData3));\r\n\r\n seriesData.push(getLineObj(1, yDataSource1));\r\n seriesData.push(getLineObj(3, yDataSource3));\r\n\r\n if (xDataSource1.length == 0) {\r\n topmargin = 35;\r\n\r\n legendData = ['第三组'];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: true };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData1));\r\n seriesData.push(getLineObj(3, yDataSource1));\r\n\r\n if (xDataSource3.length == 0) {\r\n topmargin = 0;\r\n\r\n yValIsAllNull = true;\r\n legendData = [];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: false };\r\n xAxisData = [];\r\n seriesData = [];\r\n xAxisData.push(getxAxisObj(1, []));\r\n seriesData.push(getLineObj(3, []));\r\n }\r\n }\r\n } else if (xDataSource3.length == 0) {\r\n topmargin = 15;\r\n xValIsAllNull = true;\r\n legendData = ['第一组', '第二组'];\r\n legendSelected = { 第一组: true, 第二组: true, 第三组: false };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n xAxisData.push(getxAxisObj(1, xData1));\r\n xAxisData.push(getxAxisObj(2, xData2));\r\n seriesData.push(getLineObj(1, yDataSource1));\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n\r\n if (xDataSource1.length == 0) {\r\n topmargin = 35;\r\n legendData = ['第二组'];\r\n legendSelected = { 第一组: false, 第二组: true, 第三组: false };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData2));\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n\r\n if (xDataSource2.length == 0) {\r\n topmargin = 0;\r\n yValIsAllNull = true;\r\n legendData = [];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: false };\r\n xAxisData = [];\r\n seriesData = [];\r\n xAxisData.push(getxAxisObj(1, []));\r\n seriesData.push(getLineObj(2, []));\r\n }\r\n }\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: !xValIsAllNull ? -5 : topmargin,\r\n left: 30,\r\n right: 10,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n left: 'center',\r\n top: 16,\r\n data: legendData,\r\n selected: legendSelected,\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: xAxisData,\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: seriesData,\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 颗粒组成(密度计法)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart250: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n const xData = xDataArr[0], // [0.0316, 0.0224, 0.0115, 0.0075, 0.0058, 0.0033, 0.0031, 0.0024, 0.001, 0.0008],\r\n yData = yDataArr[0]; // [83.0, 78.8, 53.8, 42.6, 33.7, 27.8, 23.2, 19.2, 13.0, 7.7];\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n\r\n let xmin = 0.001,\r\n xmax = 100;\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item == null || item == undefined || item == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n xmin = null;\r\n xmax = null;\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 20,\r\n right: 15,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'log', //设置x轴为对数坐标轴\r\n logBase: 10, //可以设置对数轴的底数,默认为10\r\n inverse: true,\r\n min: xmin,\r\n max: xmax,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 承载比(CBR)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart270: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n // const xDataSource1 = xDataArr[0], // [36, 102, 316, 678, 917, 1177, 1396, 1478, 1620, 1651, 1753, 1789, 1855],\r\n // \txDataSource2 = xDataArr[1], // [56, 122, 357, 617, 958, 1223, 1376, 1493, 1631, 1682, 1783, 1824, 1885],\r\n // \txDataSource3 = xDataArr[2], // [66, 168, 443, 729, 994, 1213, 1411, 1529, 1651, 1722, 1783, 1824, 1890],\r\n // \tyDataSource1 = yDataArr[0], // [0.31, 0.51, 0.94, 1.47, 2.0, 2.48, 2.92, 3.41, 3.87, 4.37, 4.86, 5.36, 5.88],\r\n // \tyDataSource2 = yDataArr[1], // [0.26, 0.5, 1.01, 1.52, 2.02, 2.52, 2.98, 3.49, 3.99, 4.49, 4.98, 5.48, 5.98],\r\n // \tyDataSource3 = yDataArr[2]; // [0.32, 0.52, 1.01, 1.5, 1.99, 2.49, 2.98, 3.47, 3.96, 4.46, 4.95, 5.44, 5.93];\r\n\r\n let xDataSource1 = [],\r\n xDataSource2 = [],\r\n xDataSource3 = [],\r\n yDataSource1 = [],\r\n yDataSource2 = [],\r\n yDataSource3 = [];\r\n\r\n //排除原始数据为0的数据\r\n xDataArr[0].forEach((item, index) => {\r\n if (item != 0 && yDataArr[0][index] != 0) {\r\n xDataSource1.push(item);\r\n yDataSource1.push(yDataArr[0][index]);\r\n }\r\n });\r\n xDataArr[1].forEach((item, index) => {\r\n if (item != 0 && yDataArr[1][index] != 0) {\r\n xDataSource2.push(item);\r\n yDataSource2.push(yDataArr[1][index]);\r\n }\r\n });\r\n xDataArr[2].forEach((item, index) => {\r\n if (item != 0 && yDataArr[2][index] != 0) {\r\n xDataSource3.push(item);\r\n yDataSource3.push(yDataArr[2][index]);\r\n }\r\n });\r\n\r\n /**\r\n * 获取series需要的3条线配置\r\n * @param type 线类型(1:筛分曲线、2:上限、3:下限)\r\n * @param data 对应的坐标点数据\r\n */\r\n const getLineObj = (type, xData, yData) => {\r\n const name = `曲线${type}`;\r\n const symbol = type == 1 ? 'rect' : type == 2 ? 'triangle' : 'circle';\r\n const lineType = type == 1 ? 'solid' : type == 2 ? 'dotted' : [10, 5];\r\n const color = type == 1 ? lineData[0].lineColor : type == 2 ? lineData[1].lineColor : lineData[2].lineColor; //ttype == 1 ? '#F56C6C' : type == 2 ? '#409EFF' : '#000';\r\n\r\n const seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n\r\n return {\r\n name: name,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: symbol, //符号类型\r\n symbolSize: 5, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: color,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: lineType,\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: color,\r\n },\r\n data: seriesData,\r\n };\r\n };\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (\r\n xDataSource1.every((item) => item == '/') &&\r\n xDataSource2.every((item) => item == '/') &&\r\n xDataSource3.every((item) => item == '/') &&\r\n yDataSource1.every((item) => item == '/') &&\r\n yDataSource2.every((item) => item == '/') &&\r\n yDataSource3.every((item) => item == '/')\r\n ) {\r\n yValIsAllNull = true;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 35,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 20,\r\n bottom: 5,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + datas[0].value[1] : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 16,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value', //category\r\n //data: xDataSource1,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n position: 'top', //设置x轴在顶部显示\r\n nameGap: 5, //坐标轴名称与轴线之间的距离\r\n nameLocation: 'end', //设置x轴显示的名称的位置在末端,注意:需要配置grid.right一起使用,不然可能会被遮住\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [getLineObj(1, xDataSource1, yDataSource1), getLineObj(2, xDataSource2, yDataSource2), getLineObj(3, xDataSource3, yDataSource3)],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 压实度-吸水量,膨胀率,CBR-279、280和281\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart279_280_281: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle, //压实度-吸水量关系曲线 压实度-膨胀率关系曲线 压实度-CBR关系曲线\r\n xName = config.chartXName, //压实度(%) 压实度(%) 压实度(%)\r\n yName = config.chartYName, //吸水量(g) 膨胀率(%) CBR(%)\r\n legendName = '图例1';\r\n\r\n //y轴最大最小数据加减数字\r\n let jjNum = config.chartType == 279 ? 5 : config.chartType == 280 ? 0.1 : 0.15;\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0], // [90.3, 95.6, 99.5],\r\n yData = yDataArr[0], // [245, 206, 163],\r\n xAxisMin = Math.min(...xData),\r\n yAxisMin = Number(EChartsUtilsComm.getRound(Math.min(...yData) - jjNum, 0.001)),\r\n yAxisMax = Number(EChartsUtilsComm.getRound(Math.max(...yData) + jjNum, 0.001));\r\n //yData1 = [245, 206, 163],\r\n //yData2 = [3.49, 2.69, 2.34];\r\n //yData3 = [4, 4.7, 5.7];\r\n //修约:0.001 0.001 0.001\r\n //y最大最小加减数:5 0.1 0.15\r\n\r\n xAxisMin = Number(EChartsUtilsComm.getRound(xAxisMin - xAxisMin * 0.01, 0.001));\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (yData.every((item) => item == '/')) {\r\n yValIsAllNull = true;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 20,\r\n right: 15,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value', //设置x轴为对数坐标轴\r\n min: xAxisMin,\r\n max: 100,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n min: yAxisMin,\r\n max: yAxisMax,\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 承载比(CBR)(路强仪)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart290: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xDataSource1 = xDataArr[0], // [36, 102, 316, 678, 917, 1177, 1396, 1478, 1620, 1651, 1753, 1789, 1855],\r\n xDataSource2 = xDataArr[0], // [56, 122, 357, 617, 958, 1223, 1376, 1493, 1631, 1682, 1783, 1824, 1885],\r\n xDataSource3 = xDataArr[0], // [66, 168, 443, 729, 994, 1213, 1411, 1529, 1651, 1722, 1783, 1824, 1890],\r\n yDataSource1 = yDataArr[0], // [0.31, 0.51, 0.94, 1.47, 2.0, 2.48, 2.92, 3.41, 3.87, 4.37, 4.86, 5.36, 5.88],\r\n yDataSource2 = yDataArr[1], // [0.26, 0.5, 1.01, 1.52, 2.02, 2.52, 2.98, 3.49, 3.99, 4.49, 4.98, 5.48, 5.98],\r\n yDataSource3 = yDataArr[2]; // [0.32, 0.52, 1.01, 1.5, 1.99, 2.49, 2.98, 3.47, 3.96, 4.46, 4.95, 5.44, 5.93];\r\n\r\n /**\r\n * 获取series需要的3条线配置\r\n * @param type 线类型(1:筛分曲线、2:上限、3:下限)\r\n * @param data 对应的坐标点数据\r\n */\r\n const getLineObj = (type, data) => {\r\n const name = `曲线${type}`;\r\n const symbol = type == 1 ? 'rect' : type == 2 ? 'triangle' : 'circle';\r\n const lineType = type == 1 ? 'solid' : type == 2 ? 'dotted' : [10, 5];\r\n const color = type == 1 ? lineData[0].lineColor : type == 2 ? lineData[1].lineColor : lineData[2].lineColor; //ttype == 1 ? '#F56C6C' : type == 2 ? '#409EFF' : '#000';\r\n\r\n return {\r\n name: name,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: symbol, //符号类型\r\n symbolSize: 5, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: color,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: lineType,\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: color,\r\n },\r\n data: data,\r\n };\r\n };\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (\r\n xDataSource1.every((item) => item == '/') &&\r\n xDataSource2.every((item) => item == '/') &&\r\n xDataSource3.every((item) => item == '/') &&\r\n yDataSource1.every((item) => item == '/') &&\r\n yDataSource2.every((item) => item == '/') &&\r\n yDataSource3.every((item) => item == '/')\r\n ) {\r\n yValIsAllNull = true;\r\n xDataSource1 = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 35,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 5,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 16,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: xDataSource1,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n position: 'top', //设置x轴在顶部显示\r\n nameGap: 5, //坐标轴名称与轴线之间的距离\r\n nameLocation: 'end', //设置x轴显示的名称的位置在末端,注意:需要配置grid.right一起使用,不然可能会被遮住\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n if (value == '/') {\r\n return '';\r\n } else {\r\n return value;\r\n }\r\n },\r\n },\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [getLineObj(1, yDataSource1), getLineObj(2, yDataSource2), getLineObj(3, yDataSource3)],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 土基回弹模量\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart310: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0], // [0.02, 0.04, 0.06, 0.08, 0.14, 0.18, 0.22, 0.26, 0.3, 0.34],\r\n yData = yDataArr[0]; // [6, 10, 12, 16, 20, 28, 36, 44, 54, 68];\r\n\r\n let xDataCl = [],\r\n yDataCl = [];\r\n xData.forEach((item, index) => {\r\n if (item != null && item != undefined && item != '/' && (item._code == null || item._code == undefined)) {\r\n xDataCl.push(item);\r\n yDataCl.push(yData[index]);\r\n }\r\n });\r\n xData = xDataCl;\r\n yData = yDataCl;\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (\r\n xData.every((item) => item == '/' || (item._code != null && item._code != undefined)) &&\r\n yData.every((item) => item == '/' || (item._code != null && item._code != undefined))\r\n ) {\r\n yValIsAllNull = true;\r\n xData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 35,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 20,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 16,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: xData,\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n if (value == '/') {\r\n return '';\r\n } else {\r\n return value;\r\n }\r\n },\r\n },\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n axisLine: {\r\n //设置x轴箭头效果\r\n symbol: ['none', 'arrow'], //默认是['none', 'none'],可以设置为['arrow', 'none']或['none', 'arrow']等来分别控制起始和结束的箭头\r\n symbolSize: 10, //箭头大小\r\n },\r\n splitLine: { show: true },\r\n position: 'top', //设置x轴在顶部显示\r\n name: 'p', //设置x轴显示的名称\r\n nameGap: 5, //坐标轴名称与轴线之间的距离\r\n nameLocation: 'end', //设置x轴显示的名称的位置在末端,注意:需要配置grid.right一起使用,不然可能会被遮住\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n symbol: ['arrow', 'none'], //默认是['none', 'none'],可以设置为['arrow', 'none']或['none', 'arrow']等来分别控制起始和结束的箭头\r\n symbolSize: 10, //箭头大小\r\n },\r\n },\r\n {\r\n //配置符号L的显示\r\n name: 'L',\r\n nameRotate: 0,\r\n nameLocation: 'end',\r\n nameGap: 5, //坐标轴名称与轴线之间的距离\r\n position: 'left',\r\n inverse: true, //y轴坐标轴向下\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: yData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 布氏粘度计\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart330: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let title = '', //config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0],\r\n yData = yDataArr[0];\r\n\r\n //获取y轴趋势公式对象\r\n const gsS: any = EChartsUtilsComm.calcTrend(xData, yData, xData[0]);\r\n\r\n //黏度为0.15Pa·s、0.19Pa·s、0.25Pa·s、0.31Pa·s时的温度\r\n let wd015 = EChartsUtilsComm.getRound((0.15 - gsS.jj) / gsS.xl, 0),\r\n wd019 = EChartsUtilsComm.getRound((0.19 - gsS.jj) / gsS.xl, 0),\r\n wd025 = EChartsUtilsComm.getRound((0.25 - gsS.jj) / gsS.xl, 0),\r\n wd031 = EChartsUtilsComm.getRound((0.31 - gsS.jj) / gsS.xl, 0);\r\n\r\n if (wd015 == Infinity) {\r\n wd015 = 0;\r\n }\r\n if (wd019 == Infinity) {\r\n wd019 = 0;\r\n }\r\n if (wd025 == Infinity) {\r\n wd025 = 0;\r\n }\r\n if (wd031 == Infinity) {\r\n wd031 = 0;\r\n }\r\n //输出“拌合温度范围 ℃”和“压实成型温度范围 ℃”\r\n let wdBh = `${wd015}~${wd019}`,\r\n wdYs = `${wd025}~${wd031}`;\r\n // console.log('输出温度:', wdBh, wdYs);\r\n\r\n //设置Sheet单元格的值(拌合温度和压实成型温度范围)\r\n if (chartExtJson != null) {\r\n if (wd015 == 0 && wd019 == 0) {\r\n sheet.setValue(chartExtJson.bszdjBh.row, chartExtJson.bszdjBh.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.bszdjBh.row, chartExtJson.bszdjBh.col, wdBh);\r\n }\r\n if (wd025 == 0 && wd031 == 0) {\r\n sheet.setValue(chartExtJson.bszdjYs.row, chartExtJson.bszdjYs.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.bszdjYs.row, chartExtJson.bszdjYs.col, wdYs);\r\n }\r\n }\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.every((item) => item == '/') && yData.every((item) => item == '/')) {\r\n yValIsAllNull = true;\r\n xData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 18,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n if (value == '/') {\r\n return '';\r\n } else {\r\n return value;\r\n }\r\n },\r\n },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 25 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: yData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 液限碟式仪\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart350: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson),\r\n lineColor = lineData[0].lineColor;\r\n\r\n //击数N(次)、含水率w(%)、y轴第一个趋势数据、y轴第二个趋势数据、25的趋势数据、y轴最小值、y轴最大值\r\n const jsN = [xDataArr[0][0], xDataArr[0][1]], // [18, 30],\r\n hsl = [yDataArr[0][0], yDataArr[0][1]], // [22.1, 11.5],\r\n //通过calcTrend获取y轴第一个趋势数据、y轴第二个趋势数据、25的趋势数据\r\n yVal1 = Number(EChartsUtilsComm.getRound(EChartsUtilsComm.calcTrend(jsN, hsl, jsN[0]).y, 0.1)),\r\n yVal2 = Number(EChartsUtilsComm.getRound(EChartsUtilsComm.calcTrend(jsN, hsl, jsN[1]).y, 0.1)),\r\n yVal25 = Number(EChartsUtilsComm.getRound(EChartsUtilsComm.calcTrend(jsN, hsl, 25).y, 0.1)),\r\n //通过calcTrend获取y轴的趋势数据,然后分别-2和+2\r\n yAxisMin = Math.floor(Number(yVal2)) - 2,\r\n yAxisMax = Math.floor(Number(yVal1)) + 2;\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //检测是否所有数据都为空\r\n let isAllNull = true;\r\n isAllNull = xDataArr[0].filter((item) => item != null && item != undefined && item != '/').length == 0;\r\n if (isAllNull) {\r\n isAllNull = yDataArr[0].filter((item) => item != null && item != undefined && item != '/').length == 0;\r\n }\r\n\r\n //x和y轴的字体大小\r\n const xyFontSize = 8;\r\n\r\n let seriesObjs = [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle',\r\n z: 10, //控制曲线的浮动层级,避免在markLine下方被遮住\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineColor,\r\n },\r\n connectNulls: true, //是否连接空数据\r\n data: [\r\n [0, null],\r\n [2, null],\r\n [3.5, null],\r\n [4.9, null],\r\n [5.9, null],\r\n [6.9, null],\r\n {\r\n //延长线1\r\n value: [10.4, yVal25 - (2.7 * (yVal25 - yVal1)) / 2.1],\r\n symbol: 'none', //隐藏线条上的数据点\r\n },\r\n [11, yVal1], //第一个点\r\n [11.8, null],\r\n [13.1, yVal25], //第二个点\r\n [14.6, yVal2], //第三个点\r\n {\r\n //延长线2\r\n value: [15.2, (2.1 / 1.5) * (yVal2 - yVal25) + yVal25],\r\n symbol: 'none', //隐藏线条上的数据点\r\n },\r\n [16.4, null],\r\n [17.4, null],\r\n [18.9, null],\r\n [19.8, null],\r\n [20.7, null],\r\n [21.6, null],\r\n [22.6, null],\r\n ],\r\n markPoint: {\r\n data: [\r\n {\r\n xAxis: 13.1,\r\n yAxis: yVal25,\r\n symbolOffset: [40, 25],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n //显示25这个坐标点数据\r\n return isAllNull ? '' : '( ' + 25 + ' , ' + data.data.yAxis + ')';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ],\r\n },\r\n markLine: {\r\n symbol: '', //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n //标线的文本,模拟x轴显示的内容\r\n position: 'start', //改变label位置\r\n // rotate: 45, //设置文字旋转度数(注意:ECharts官网文档居然没有rotate这个属性的说明)\r\n // backgroundColor:'#fff'\r\n // color:'#f00',//文字颜色\r\n formatter: (data) => {\r\n return data.name;\r\n },\r\n },\r\n lineStyle: { color: '#e0e6f1', type: 'solid' },\r\n data: [\r\n {\r\n name: '5',\r\n xAxis: 0,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '6',\r\n xAxis: 2,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '7',\r\n xAxis: 3.5,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '8',\r\n xAxis: 4.9,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '9',\r\n xAxis: 5.9,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '10',\r\n xAxis: 6.9,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n //延长线1\r\n name: '',\r\n xAxis: 10.4,\r\n lineStyle: {\r\n opacity: 0,\r\n },\r\n },\r\n {\r\n //第一个点\r\n name: '',\r\n xAxis: 11,\r\n },\r\n {\r\n name: '20',\r\n xAxis: 11.8,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n //第二个点\r\n name: '25',\r\n xAxis: 13.1,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n //第三个点\r\n name: '30',\r\n xAxis: 14.6,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n //延长线2\r\n name: '',\r\n xAxis: 15.2,\r\n lineStyle: {\r\n opacity: 0,\r\n },\r\n },\r\n {\r\n name: '40',\r\n xAxis: 16.4,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '50',\r\n xAxis: 17.4,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '',\r\n xAxis: 18.9,\r\n },\r\n {\r\n name: '',\r\n xAxis: 19.8,\r\n },\r\n {\r\n name: '',\r\n xAxis: 20.7,\r\n },\r\n {\r\n name: '',\r\n xAxis: 21.6,\r\n },\r\n {\r\n name: '100',\r\n xAxis: 22.6,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n\r\n //横线\r\n [\r\n {\r\n coord: [0, yVal25],\r\n lineStyle: {\r\n color: '#529b2e',\r\n type: 'solid',\r\n },\r\n },\r\n { coord: [13.1, yVal25] },\r\n ],\r\n //纵线\r\n [\r\n {\r\n coord: [13.1, yAxisMin],\r\n lineStyle: {\r\n color: '#000',\r\n type: 'silid',\r\n },\r\n },\r\n { coord: [13.1, yVal25] },\r\n ],\r\n ],\r\n },\r\n },\r\n ];\r\n if (isAllNull) {\r\n seriesObjs = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 30,\r\n right: 10,\r\n bottom: 35,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas[0].data.length > 1\r\n ? datas[0].data[1] == null\r\n ? ''\r\n : datas[0].seriesName + '(' + datas[0].data[0] + ')' + ':' + datas[0].data[1]\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n axisTick: { show: false }, //隐藏刻度线\r\n axisLabel: { show: false }, //隐藏刻度值\r\n //网格线,参考文档:https://echarts.apache.org/zh/option.html#xAxis.splitLine\r\n splitLine: {\r\n show: false, //隐藏分割线\r\n },\r\n min: 0,\r\n max: 23.5,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !isAllNull ? 30 : 10,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n splitNumber: 4, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n min: !isAllNull ? yAxisMin : null,\r\n max: yAxisMax,\r\n axisLabel: {\r\n show: !isAllNull ? true : false,\r\n fontSize: xyFontSize,\r\n },\r\n axisTick: {\r\n show: !isAllNull ? true : false,\r\n },\r\n },\r\n ],\r\n series: seriesObjs,\r\n };\r\n\r\n return option;\r\n },\r\n};\r\n","import * as echarts from 'echarts';\r\nimport { type CellModel } from '../types/sheet';\r\nimport { type EChartsUtilsConfigModel, type EChartsUtilsChartLinesJsonModel } from '../types/echarts';\r\nimport { EChartsUtilsAll } from './echarts-all';\r\n\r\n/**\r\n * ECharts图表工具类\r\n */\r\nexport const EChartsUtils = {\r\n /**\r\n * 创建图表\r\n * @param GC GC对象\r\n * @param spread 工作簿对象\r\n * @param sheet 工作表对象\r\n * @param config 折现配置\r\n * @param isHideChart 是否隐藏图表\r\n */\r\n create: async (\r\n GC: any,\r\n spread: any,\r\n sheet: any,\r\n config: EChartsUtilsConfigModel,\r\n isHideChart: boolean = false\r\n ): Promise<{\r\n fObj: any;\r\n fObjPosition: {\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n };\r\n ecObj: echarts.ECharts;\r\n }> => {\r\n // 获取扩展配置\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n // 如果isShowCon配置存在,则验证isShowCon对应单元格的值是否和输入的配置chartExtJson.isShowVal相等,不相等的话,就不创建图表\r\n if (chartExtJson != null && chartExtJson.isShowCon != null && chartExtJson.isShowCon != undefined) {\r\n const conVal = sheet.getValue(chartExtJson.isShowCon.row, chartExtJson.isShowCon.col);\r\n\r\n if (conVal != chartExtJson.isShowVal) {\r\n sheet.floatingObjects.remove(config.chartId);\r\n return;\r\n }\r\n }\r\n\r\n // 获取图表单元格之上的所有行的高度总和、所有列的宽度总和、距离左侧的距离和图表所在单元格的高度\r\n let allRowsTotalHeight = 0,\r\n allRowsTotalWidth = 0,\r\n allRowsTotalLeft = 0,\r\n chartCellHeight = 0;\r\n for (let i = 0; i < config.row; i++) {\r\n allRowsTotalHeight += sheet.getRowHeight(i);\r\n }\r\n allRowsTotalHeight += sheet.getRowHeight(0, GC.Spread.Sheets.SheetArea.colHeader);\r\n for (let i = config.col; i < config.col + config.colCount; i++) {\r\n allRowsTotalWidth += sheet.getColumnWidth(i);\r\n }\r\n for (let i = 0; i < config.col; i++) {\r\n allRowsTotalLeft += sheet.getColumnWidth(i);\r\n }\r\n allRowsTotalLeft += sheet.getColumnWidth(0, GC.Spread.Sheets.SheetArea.rowHeader);\r\n for (let i = config.row; i < config.row + config.rowCount; i++) {\r\n chartCellHeight += sheet.getRowHeight(i);\r\n }\r\n\r\n // 设置浮动对象的呈现位置(实际情况根据需要进行调整)\r\n const fObjPosition = {\r\n x: allRowsTotalLeft - 40 + 2,\r\n y: allRowsTotalHeight - 20 + 2,\r\n w: allRowsTotalWidth - 6,\r\n h: chartCellHeight - 6,\r\n };\r\n\r\n // 获取浮动对象\r\n let fcObj = sheet.floatingObjects.get(config.chartId);\r\n\r\n // 浮动对象不存在时\r\n if (fcObj == null || fcObj == undefined) {\r\n // 创建浮动对象\r\n fcObj = new GC.Spread.Sheets.FloatingObjects.FloatingObject(config.chartId, fObjPosition.x, fObjPosition.y, fObjPosition.w, fObjPosition.h);\r\n\r\n // 不允许改变大小、不允许拖动\r\n fcObj.allowResize(false);\r\n fcObj.allowMove(false);\r\n\r\n // 将浮动对象添加到表单\r\n sheet.floatingObjects.add(fcObj);\r\n }\r\n // 浮动对象存在时\r\n else {\r\n fcObj.x(fObjPosition.x);\r\n fcObj.y(fObjPosition.y);\r\n fcObj.width(fObjPosition.w);\r\n fcObj.height(fObjPosition.h);\r\n }\r\n\r\n // 设置浮动对象的内容为divObj(当document.getElementById(config.chartId + '_ec')为null的时候)\r\n if (document.getElementById(config.chartId + '_ec') == null) {\r\n // 创建用于放置ECharts的div容器\r\n const divObj = document.createElement('div');\r\n divObj.setAttribute('style', `background-color:#fff;width:100%;height:100%;`);\r\n divObj.innerHTML = `<div id=\"${config.chartId}_ec\" style=\"width:100%;height:100%;\"></div>`;\r\n\r\n fcObj.content(divObj);\r\n }\r\n\r\n // 定义ECharts对象\r\n let ecObj: echarts.ECharts | null = null;\r\n\r\n // 获取ECharts对象的函数(这里使用到了Promise和setTimeout,原因是:ECharts所在的div可能还没有及时在浮动元素中渲染完成,导致ECharts展示部出来)\r\n const getEcObj = (): any => {\r\n return new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n // 初始化图表并获取ECharts对象\r\n resolve({ ecObj: EChartsUtils.initChart(spread, sheet, config, isHideChart) });\r\n }, 10);\r\n });\r\n };\r\n ecObj = (await getEcObj()).ecObj;\r\n\r\n return {\r\n fObj: fcObj,\r\n fObjPosition: fObjPosition,\r\n ecObj: ecObj,\r\n };\r\n },\r\n\r\n /**\r\n * 初始化图表\r\n * @param spread 工作簿对象\r\n * @param sheet 工作表对象\r\n * @param config 图表配置\r\n * @param isHideChart 是否隐藏图表\r\n */\r\n initChart: (spread: any, sheet: any, config: EChartsUtilsConfigModel, isHideChart: boolean = false): echarts.ECharts => {\r\n // 此时可能ECharts所在的div还没有渲染(如浮动元素还没有在可视区域的时候是不会创建的)\r\n if (document.getElementById(config.chartId + '_ec') == null) {\r\n return null;\r\n }\r\n\r\n // 获取多条x轴的数组(类似[[1,2,3,4],[1,2,3,4]])\r\n let xDataArr: any = [],\r\n yDataArr: any = [];\r\n\r\n // 获取多条x轴的数组(单元格原始数据,类似[['1.0','2.0','3.0'],['1.0','2.0','3.0']],此数据可能在有些情况下需要使用原始数据,如:原始数据为字符串的1.0,可能需要在x轴显示为1.0这个字符文本)\r\n let xDataArrSource: any = [],\r\n yDataArrSource: any = [];\r\n\r\n /**\r\n * 获取x或y轴单元格的值集合\r\n * @param spread 工作簿对象\r\n * @param sheet 工作表对象\r\n * @param sheetName x轴或y轴数据所在的Sheet名称,如果没有值,则说明是当前操作的Sheet\r\n * @param cells 单元格集合\r\n * @returns 返回x或y轴数据的值集合\r\n */\r\n const getCellVals = (\r\n spread: any,\r\n sheet: any,\r\n sheetName?: string,\r\n cells?: CellModel[]\r\n ): {\r\n dataOneArr: any[];\r\n dataOneSourceArr: any[];\r\n } => {\r\n let retArr: {\r\n dataOneArr: any[];\r\n dataOneSourceArr: any[];\r\n } = {\r\n dataOneArr: [],\r\n dataOneSourceArr: [],\r\n };\r\n\r\n // 获取x或y轴数据所在的Sheet对象(如果sheetName有值,则说明是跨Sheet的)\r\n let curSheet: any = null;\r\n if (sheetName != null && sheetName != undefined && sheetName.length > 0) {\r\n curSheet = spread.getSheetFromName(sheetName);\r\n }\r\n\r\n cells?.forEach((itemCell, indexCell) => {\r\n // 如果单元格的值为数字,就转换为数字,否则在后期参与各个ECharts图表计算的时候会出错\r\n const curCellVal = curSheet != null ? curSheet.getValue(itemCell.row, itemCell.col) : sheet.getValue(itemCell.row, itemCell.col);\r\n retArr.dataOneSourceArr.push(curCellVal);\r\n\r\n // 严格的数字验证(包括科学计数法)\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curCellVal)) {\r\n retArr.dataOneArr.push(Number(curCellVal));\r\n } else {\r\n retArr.dataOneArr.push(curCellVal == null ? 0 : curCellVal);\r\n }\r\n });\r\n\r\n return retArr;\r\n };\r\n\r\n let lineData: EChartsUtilsChartLinesJsonModel[] = JSON.parse(config.chartLinesJson);\r\n lineData.forEach((item, index) => {\r\n let xDataOne: any = [],\r\n yDataOne: any = [];\r\n let xDataOneSource: any = [],\r\n yDataOneSource: any = [];\r\n\r\n const curItemValsX = getCellVals(spread, sheet, item.sheetNameX, item.xCells);\r\n xDataOne = curItemValsX.dataOneArr;\r\n xDataOneSource = curItemValsX.dataOneSourceArr;\r\n const curItemValsY = getCellVals(spread, sheet, item.sheetNameY, item.yCells);\r\n yDataOne = curItemValsY.dataOneArr;\r\n yDataOneSource = curItemValsY.dataOneSourceArr;\r\n\r\n xDataArr.push(xDataOne);\r\n yDataArr.push(yDataOne);\r\n xDataArrSource.push(xDataOneSource);\r\n yDataArrSource.push(yDataOneSource);\r\n });\r\n\r\n // 获取ECharts图表所在div容器\r\n const ecDom = document.getElementById(config.chartId + '_ec') as HTMLElement;\r\n\r\n // 获取ECharts对象\r\n let ecObj = echarts.getInstanceByDom(ecDom);\r\n if (ecObj == null || ecObj == undefined) {\r\n ecObj = echarts.init(ecDom, null, {\r\n renderer: 'canvas',\r\n useDirtyRect: false,\r\n });\r\n }\r\n\r\n let option;\r\n\r\n if (config.chartType == 10) {\r\n option = EChartsUtilsAll.chart10(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 11) {\r\n option = EChartsUtilsAll.chart11(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 12) {\r\n option = EChartsUtilsAll.chart12(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 13) {\r\n option = EChartsUtilsAll.chart13(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 14) {\r\n option = EChartsUtilsAll.chart14(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 15) {\r\n option = EChartsUtilsAll.chart15(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 16) {\r\n option = EChartsUtilsAll.chart16(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 30) {\r\n option = EChartsUtilsAll.chart30(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 50) {\r\n option = EChartsUtilsAll.chart50(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 70) {\r\n option = EChartsUtilsAll.chart70(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 90) {\r\n option = EChartsUtilsAll.chart90(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 110) {\r\n option = EChartsUtilsAll.chart110(config, xDataArr, yDataArr, xDataArrSource, yDataArrSource);\r\n } else if (config.chartType == 130) {\r\n option = EChartsUtilsAll.chart130(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 150) {\r\n option = EChartsUtilsAll.chart150(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 170) {\r\n option = EChartsUtilsAll.chart170(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 190) {\r\n option = EChartsUtilsAll.chart190(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 210) {\r\n option = EChartsUtilsAll.chart210(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 230) {\r\n option = EChartsUtilsAll.chart230(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 250) {\r\n option = EChartsUtilsAll.chart250(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 270) {\r\n option = EChartsUtilsAll.chart270(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 279 || config.chartType == 280 || config.chartType == 281) {\r\n option = EChartsUtilsAll.chart279_280_281(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 290) {\r\n option = EChartsUtilsAll.chart290(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 310) {\r\n option = EChartsUtilsAll.chart310(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 330) {\r\n option = EChartsUtilsAll.chart330(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 350) {\r\n option = EChartsUtilsAll.chart350(config, xDataArr, yDataArr);\r\n }\r\n\r\n if (option && typeof option === 'object') {\r\n //如果是隐藏的图表,则需要禁用ECharts的动画效果\r\n //原因是:如果ECharts使用了动画效果,图表渲染完成可能需要0.5秒,但是在导出ECharts统计图为图片的场景下时,可能在图表还没有渲染完成(动画效果还没结束)前就要获取图像了,此时可能就会造成获取到的图像内容丢失的情况\r\n if (isHideChart) {\r\n option.animation = false;\r\n }\r\n\r\n ecObj.setOption(option);\r\n }\r\n\r\n ecObj.setOption(option);\r\n\r\n return ecObj;\r\n },\r\n\r\n /**\r\n * 获取ECharts对象\r\n * @param chartId 图表ID\r\n * @returns 返回ECharts对象,如果不存在则返回null\r\n */\r\n getEChartsObj: (chartId: string): echarts.ECharts | null => {\r\n // 获取ECharts图表所在div容器\r\n const ecDom = document.getElementById(chartId + '_ec') as HTMLElement;\r\n\r\n // 获取ECharts对象\r\n let ecObj = echarts.getInstanceByDom(ecDom);\r\n if (ecObj == null || ecObj == undefined) {\r\n return null;\r\n }\r\n\r\n return ecObj;\r\n },\r\n};\r\n","// 导出Excel文件所需的第三方包\r\nimport { saveAs } from 'file-saver';\r\nimport { RegisterFontModel } from '../types/wookbook';\r\n\r\n/**\r\n * SpreadJS工作簿工具函数属性\r\n */\r\nexport const WorkbookUtils = {\r\n /**\r\n * 加载在线sjs文件\r\n * @param spread 工作簿对象\r\n * @param fileUrl 在线sjs文件地址\r\n * @param succFunc 文件打开成功后的回调函数,返回的第一个参数为spread工作簿对象\r\n * @param errorFunc 文件打开失败后的回调函数,返回的第一个参数为错误信息\r\n */\r\n loadSjsFile: async (spread: any, fileUrl: string, succFunc?: (spreadObj) => Promise<void>, errorFunc?: (error) => Promise<void>): Promise<void> => {\r\n // 获取文件响应结果\r\n const response = await fetch(fileUrl, { method: 'GET' });\r\n\r\n // 获取成功\r\n if (response.ok) {\r\n // 文件的字节流对象\r\n const blob = await response.blob();\r\n // 将Blob转换为File或Blob对象\r\n // const file = new File([blob], 'template.sjs', { type: 'application/octet-stream' });\r\n const sjsBlob = new Blob([blob], { type: 'application/zip' });\r\n\r\n // SpreadJS打开文件\r\n spread.open(\r\n sjsBlob,\r\n async () => {\r\n if (typeof succFunc === 'function') {\r\n await succFunc(spread);\r\n\r\n // // 或者使用then回调\r\n // succFunc(spread).then((ret) => {\r\n // // return ret;\r\n // });\r\n }\r\n },\r\n async (e: any) => {\r\n if (typeof errorFunc === 'function') {\r\n await errorFunc(e);\r\n }\r\n }\r\n );\r\n }\r\n },\r\n\r\n /**\r\n * 获取工作簿的Blob对象\r\n * @param spread 工作簿实例\r\n * @returns 返回异步的Promise对象(Blob对象)\r\n * @example\r\n * const saveSpread = async (spread: any) => {\r\n * try {\r\n * const blob = await WorkbookUtils.getWookbookBlob(spread);\r\n * console.log('获取成功:', blob);\r\n * } catch (error) {\r\n * console.error('获取失败:', error);\r\n * }\r\n * };\r\n */\r\n getWookbookBlob: async (spread: any): Promise<Blob> => {\r\n return new Promise((resolve, reject) => {\r\n spread.save(\r\n // 成功回调\r\n (blob) => resolve(blob),\r\n // 失败回调\r\n (error) => reject(error)\r\n );\r\n });\r\n },\r\n\r\n /**\r\n * 打印所有工作表\r\n * @param GC GC对象\r\n * @param spread 工作簿实例\r\n */\r\n print: (GC: any, spread: any) => {\r\n // 得到Sheet个数\r\n const sheetCount = spread.getSheetCount();\r\n\r\n for (let i = 0; i < sheetCount; i++) {\r\n const sheet = spread.getSheet(i);\r\n\r\n // 获取每个工作表的打印信息\r\n let printInfo = sheet.printInfo();\r\n\r\n // 隐藏行和列的头部信息\r\n printInfo.showRowHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide);\r\n printInfo.showColumnHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide);\r\n\r\n // // 显示和隐藏打印区域的辅助线\r\n // spread.getSheet(0).isPrintLineVisible(true);\r\n // spread.getSheet(0).isPrintLineVisible(!true);\r\n\r\n // 设置打印区域,这里是固定的,在业务应用中需要根据实际情况修改打印区域\r\n printInfo.rowStart(0);\r\n printInfo.rowEnd(sheet.getRowCount()); //printInfo.rowEnd(41);\r\n printInfo.columnStart(0);\r\n printInfo.columnEnd(76);\r\n\r\n // 设置SpreadJS自身的边距为合适的距离\r\n printInfo.margin({\r\n /**\r\n * 设置默认边距\r\n * 单位是:以百分之一英寸为单位\r\n * 也就是,如果我们需要设置左边距为25mm,需要将25mm先转换为英寸,然后再用这个英寸*100就是要设置的边距\r\n * 即:(25mm转换为英寸的结果)*100\r\n *\r\n * 参考文档:\r\n * https://demo.grapecity.com.cn/spreadjs/help/api/classes/GC.Spread.Sheets.Print.PrintInfo#margin\r\n * https://www.67tool.com/converter/length\r\n */\r\n // 纵表\r\n top: 0.5905511999999999 * 100,\r\n bottom: 0.5905511999999999 * 100,\r\n left: 0.9842520000000001 * 100,\r\n right: 0.5905511999999999 * 100,\r\n\r\n // // 横表\r\n // top: 0.9842520000000001 * 100,\r\n // bottom: 0.5905511999999999 * 100,\r\n // left: 0.5905511999999999 * 100,\r\n // right: 0.5905511999999999 * 100,\r\n\r\n // top: 0,\r\n // bottom: 0,\r\n // left: 0,\r\n // right: 0,\r\n header: 0,\r\n footer: 0,\r\n });\r\n\r\n // 设置打印的纸张\r\n printInfo.paperSize(new GC.Spread.Sheets.Print.PaperSize(GC.Spread.Sheets.Print.PaperKind.a4));\r\n\r\n sheet.printInfo(printInfo);\r\n }\r\n\r\n // 调用打印方法\r\n spread.print();\r\n },\r\n\r\n /**\r\n * 导出为Excel文件\r\n * 如支持导出自定义公式的值等功能\r\n * @param GC Spread的GC对象\r\n * @param spread 原始Spread对象\r\n * @param fileName 导出的文件名称,不传则为第一个工作表的名称\r\n */\r\n exportToExcel: (GC: any, spread: any, fileName: string = '') => {\r\n // 导出模板为JSON对象,此处设置了参数includeBindingSource,改参数代表包含数据绑定的值\r\n const json = spread.toJSON({ includeBindingSource: true });\r\n\r\n // 需要移除的自定义公式名称集合(该变量的作用是,在导出Excel前,将工作簿中所有的自定义公式移除掉,其他内置的公式保留)\r\n const removeCustomFormulas = ['YJMAX', 'YJMIN', 'YJMID', 'YJGETNUM', 'YJGETS', 'YJGETCV', 'YJINTERPOLATIONMETHOD', 'YJINTERPOLATIONMETHOD_Y'];\r\n\r\n // 临时工作簿\r\n const tempSpread = new GC.Spread.Sheets.Workbook();\r\n tempSpread.fromJSON(json);\r\n\r\n // 暂停绘制\r\n tempSpread.suspendPaint();\r\n\r\n // 获取Sheet数量\r\n const sheetCount = tempSpread.getSheetCount();\r\n\r\n for (let iSheet = 0; iSheet < sheetCount; iSheet++) {\r\n // 当前工作表\r\n const sheet = tempSpread.getSheet(iSheet);\r\n\r\n // 暂停公式的计算,提高性能\r\n sheet.suspendCalcService();\r\n\r\n for (var i = 0; i < sheet.getRowCount(); i++) {\r\n for (var j = 0; j < sheet.getColumnCount(); j++) {\r\n // 获取单元格的公式\r\n const cellFormula = sheet.getFormula(i, j);\r\n\r\n // 如果cellFormula不为null或undefined,则说明该单元格引用了公式\r\n if (cellFormula != null && cellFormula != undefined && removeCustomFormulas.some((item) => cellFormula.indexOf(item) > -1)) {\r\n // 获取单元格的值\r\n const cellVal = sheet.getValue(i, j);\r\n\r\n // 移除单元格引用的公式\r\n sheet.getCell(i, j).formula(undefined);\r\n\r\n // 设置单元格的值\r\n sheet.setValue(i, j, cellVal);\r\n }\r\n }\r\n }\r\n\r\n // 恢复计算\r\n sheet.resumeCalcService(false);\r\n }\r\n\r\n // 恢复绘制\r\n tempSpread.resumePaint();\r\n\r\n if (fileName == '') {\r\n fileName = tempSpread.getSheet(0).name();\r\n }\r\n\r\n let options = {\r\n fileType: GC.Spread.Sheets.FileType.excel,\r\n includeBindingSource: true,\r\n includeStyles: true,\r\n includeFormulas: true,\r\n saveAsView: false,\r\n rowHeadersAsFrozenColumns: false,\r\n columnHeadersAsFrozenRows: false,\r\n includeAutoMergedCells: false,\r\n includeCalcModelCache: false,\r\n includeUnusedNames: true,\r\n includeEmptyRegionCells: true,\r\n };\r\n\r\n tempSpread.export(\r\n (blob: any) => {\r\n saveAs(blob, `${fileName}.xlsx`);\r\n },\r\n () => {},\r\n options\r\n );\r\n\r\n // 销毁临时工作簿\r\n tempSpread.destroy();\r\n },\r\n\r\n /**\r\n * 合并多个工作簿并导出Excel(同时返回合并后的工作簿实例)\r\n * @param GC Spread的GC对象\r\n * @param spreads 工作簿实例集合\r\n * @param exportName 导出的文件名称,不传则为第一个Sheet的名称\r\n * @returns 合并后的工作簿实例\r\n */\r\n mergeWorkbooksToExcel: async (GC: any, spreads: any[], exportName?: string) => {\r\n if (!spreads || spreads.length == 0) {\r\n return;\r\n }\r\n\r\n // 主工作簿\r\n const mainWorkbook = new GC.Spread.Sheets.Workbook();\r\n\r\n // 暂停绘制\r\n mainWorkbook.suspendPaint();\r\n\r\n mainWorkbook.fromJSON(spreads[0].toJSON());\r\n\r\n for (let i = 1; i < spreads.length; i++) {\r\n // 临时工作簿\r\n const tempSpread = new GC.Spread.Sheets.Workbook();\r\n\r\n // 暂停绘制\r\n tempSpread.suspendPaint();\r\n\r\n tempSpread.fromJSON(spreads[i].toJSON());\r\n\r\n // 重命名样式表\r\n const styleSign = i + '';\r\n tempSpread.getNamedStyles().forEach(function (namedStyle) {\r\n namedStyle.name = `new_${styleSign}_${namedStyle.name}`;\r\n mainWorkbook.addNamedStyle(namedStyle);\r\n });\r\n\r\n // 当前临时工作簿的第一个工作表\r\n let tempSheet = tempSpread.getSheet(0);\r\n // 导出为JSON字符串\r\n let tempSheetJSON = JSON.stringify(tempSheet.toJSON());\r\n // 替换当前JSON字符串的style或parentName配置,目的是重命名样式名称,和上述的tempSpread重命名样式表保持一致\r\n tempSheetJSON = tempSheetJSON.replace(/\"style\":\"/g, '\"style\":\"new_' + styleSign + '_');\r\n tempSheetJSON = tempSheetJSON.replace(/\"parentName\":\"/g, '\"parentName\":\"new_' + styleSign + '_');\r\n\r\n // 创建新的工作表并添加到主工作簿中\r\n let newSheet = new GC.Spread.Sheets.Worksheet(`newSheet${styleSign}_`);\r\n mainWorkbook.addSheet(mainWorkbook.getSheetCount(), newSheet);\r\n newSheet.fromJSON(JSON.parse(tempSheetJSON));\r\n\r\n // 获取新创建的工作表newSheet的行数\r\n const newSheetRowCount = newSheet.getRowCount();\r\n\r\n // 当前操作的主工作簿的Sheet\r\n const curMainSheet = mainWorkbook.getSheet(0);\r\n\r\n // 如果是表尾,则在表单的最后一行开始添加\r\n curMainSheet.addRows(curMainSheet.getRowCount(), newSheetRowCount);\r\n\r\n // 设置复制和粘贴的范围\r\n let pastedRangesStartRow = curMainSheet.getRowCount() - newSheetRowCount;\r\n\r\n const fromRanges = [new GC.Spread.Sheets.Range(-1, -1, -1, -1)],\r\n pastedRanges = [new GC.Spread.Sheets.Range(pastedRangesStartRow, 0, newSheetRowCount, newSheet.getColumnCount())];\r\n mainWorkbook.commandManager().execute({\r\n cmd: 'clipboardPaste',\r\n sheetName: curMainSheet.name(), //此参数的作用是:粘贴到某个名称的Sheet中\r\n fromSheet: newSheet,\r\n fromRanges: fromRanges,\r\n pastedRanges: pastedRanges,\r\n isCutting: false,\r\n clipboardText: '',\r\n pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all,\r\n });\r\n\r\n // 删除最后的Sheet,也就是newSheet对象\r\n mainWorkbook.removeSheet(mainWorkbook.getSheetCount() - 1);\r\n\r\n // 取消选中状态\r\n curMainSheet.clearSelection();\r\n\r\n // 恢复绘制\r\n tempSpread.resumePaint();\r\n\r\n // 销毁临时工作簿\r\n tempSpread.destroy();\r\n }\r\n\r\n // 获取当前活动的工作表\r\n const sheet = mainWorkbook.getActiveSheet();\r\n\r\n // 设置缩放比为1\r\n sheet.zoom(1);\r\n\r\n // 隐藏行和列的头部\r\n sheet.options.rowHeaderVisible = true;\r\n sheet.options.colHeaderVisible = true;\r\n\r\n // 隐藏Tab、水平和垂直的滚动条\r\n mainWorkbook.options.tabStripVisible = true;\r\n mainWorkbook.options.showHorizontalScrollbar = true;\r\n mainWorkbook.options.showVerticalScrollbar = true;\r\n\r\n // 滚动条是否与活动工作表的最后一行和最后一列对齐(避免滚动的时候出现灰色区域)\r\n mainWorkbook.options.scrollbarMaxAlign = false;\r\n\r\n // 恢复绘制\r\n mainWorkbook.resumePaint();\r\n\r\n // 导出Excel文件\r\n WorkbookUtils.exportToExcel(GC, mainWorkbook, exportName);\r\n\r\n return mainWorkbook;\r\n },\r\n\r\n /**\r\n * 注册字体(主要为导出PDF使用)\r\n * @param GC Spread的GC对象\r\n * @param regFonts 字体配置集合\r\n */\r\n registerFont: async (GC: any, regFonts: RegisterFontModel[]) => {\r\n // 基于fetch\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n if (!regFonts || regFonts.length == 0) {\r\n resolve(null);\r\n }\r\n\r\n for (let i = 0; i < regFonts.length; i++) {\r\n const font = regFonts[i];\r\n\r\n const response = await fetch(font.url, { method: 'GET' });\r\n\r\n if (response.ok) {\r\n const blob = await response.blob();\r\n\r\n var reader = new FileReader();\r\n reader.readAsArrayBuffer(blob);\r\n reader.onload = function (e) {\r\n var fontArrayBuffer = reader.result;\r\n\r\n var fonts = {};\r\n fonts[font.type] = fontArrayBuffer;\r\n GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(font.name, fonts);\r\n\r\n resolve(blob);\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n\r\n // 基于XMLHttpRequest\r\n // return new Promise((resolve, reject) => {\r\n // try {\r\n // if (!regFonts || regFonts.length == 0) {\r\n // resolve(null);\r\n // }\r\n\r\n // for (let i = 0; i < regFonts.length; i++) {\r\n // const font = regFonts[i];\r\n\r\n // var xhr = new XMLHttpRequest();\r\n // xhr.open('GET', font.url, true);\r\n // xhr.responseType = 'blob';\r\n\r\n // xhr.onload = function (e) {\r\n // if (this.status == 200) {\r\n // var blob = this.response;\r\n\r\n // var reader = new FileReader();\r\n // reader.onload = function (e) {\r\n // var fontArrayBuffer = reader.result;\r\n\r\n // var fonts = {};\r\n // fonts[font.type] = fontArrayBuffer;\r\n // GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(font.name, fonts);\r\n\r\n // resolve(blob);\r\n // };\r\n // reader.readAsArrayBuffer(blob);\r\n // }\r\n // };\r\n\r\n // xhr.send();\r\n // }\r\n // } catch (error) {\r\n // reject(error);\r\n // }\r\n // });\r\n },\r\n};\r\n"],"names":["SheetUtils","getActiveSheetSelectCells","spread","getActiveSheet","getSelections","setActiveSheetSelectCells","cellObj","setSelection","row","col","rowCount","colCount","getAllCellObjsByRange","sheet","selectRange","isMulColOrder","getAllCellObjsByRanges","selectRanges","allCellObjs","forEach","item","index","getSpans","itemSpanCell","push","undefined","Error","i","j","getSpan","orderByJson","getSheetAllCellObjs","curSheetCellRange","getRowCount","getColumnCount","getSheetSelectCellObjs","getActiveSheetSelectCellObjs","getSheetCellObjsByGroup","cellRange","groupType","suspendPaint","valCells","groupByCells","groupByJson","retCells","forEachJson","curGroupCells","key","source","resumePaint","getSheetSelectVals","nullUndefinedReplaceVal","selectCells","selectCellVals","cell","cellVal","getValue","getActiveSheetSelectVals","getSheetRangeValsByGroup","retVals","curVals","getCellType","GC","cellTypeName","cellType","Spread","Sheets","CellTypes","Button","RadioButtonList","CheckBox","CheckBoxList","HyperLink","ComboBox","cellStyle","getStyle","cellButtons","length","command","dropDowns","option","showDateRange","setSheetZoom","scale","sheetCount","getSheetCount","getSheet","zoom","setActiveSheetSelectBgColor","color","sel","getRange","backColor","setSheetBgColor","cells","setSheetShowPrintPageLine","isShow","isPrintLineVisible","ignoreSheetShowStrs","ignoreStrs","ignorePaint","Text","prototype","paint","ctx","value","x","y","w","h","style","options","some","call","this","apply","arguments","setSheetAuxiliaryLine","width","height","lineWidth","colorStr","isHb","floatBottom","FloatingObjects","FloatingObject","floatRight","divBottom","document","createElement","divRight","borderBottom","borderLeft","allowResize","allowMove","content","floatingObjects","add","setActiveSheetWatermark","getCell","watermark","title","setBindingPath","pathPrev","pathField","setSheetCellDate","isAutoSize","Style","imageType","ButtonImageType","dropdown","type","DropDownType","dateTimePicker","showTime","formatter","dateFormat","shrinkToFit","setStyle","BusinessUtils","createTestObjectAttrsCells","gc","testObjectAttrs","isVertical","contentColStartIndex","contentTotalColCount","addRowHeight","titleCellColumnCount","titleCellValColumnCount","testObjectAttrsChunk","chunkJson","setRowCount","rowAttrArr","totalRowCount","addRows","setRowHeight","SheetArea","viewport","addRowRange","setBorder","LineBorder","LineStyle","thin","all","medium","left","right","hAlign","HorizontalAlign","center","vAlign","addSpan","setValue","colIndexTitle","colIndexValue","getTestObjectAttrsVals","rowTestObjectCount","allCells","allCellsChunk","newAllCellsChunk","retData","attrObjs","attrObj","fieldName","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","result","done","then","SuppressedError","CommonUtils","getFileBlob","fileUrl","response","fetch","method","ok","blob","getColLetterName","colIndex","letter","remainder","String","fromCharCode","Math","floor","toUpperCase","EChartsUtilsComm","getRound","roundingVal","accuracy","valIsNegative","abs","inputValStr","toString","indexOf","intVal","parseInt","split","decimalStr","parseFloat","coefficient","retNum","inputVal","decimalStrFirst","substring","calcRoundingRet","Number","toFixed","accuracyStr","retNumStr","zeroStr","xsPart","calcTrend","xVal","n","sumX","sumY","sumXY","sumXX","slope","intercept","gs","xl","jj","filterNullEmptyErrArray","dataSource","filter","_error","EChartsUtilsAll","chart10","config","xDataArr","yDataArr","lineJson","JSON","parse","chartLinesJson","chartExtJson","xDataSource","yDataSource","dxsJs","xData","yData","test","xMin","min","xMax","max","yMin","yMax","xAxisMax","xAxisMin","yAxisMax","yAxisMin","seriesData","points","A","N","matrix","math","pow","vandermondeMatrix","AT","transpose","ATA","multiply","ATb","coefficients","lusolve","valueOf","err","funequation","arrX","arrY","temp","maxIndex","findIndex","xName","chartXName","yName","chartYName","includes","symbol","peakvalue","coordX","lqhhlKs","lqhhlJs","lqhhlSc1","lineData","pointData","coord","lineStyle","xAxis","yAxis","symbolOffset","label","show","data","itemStyle","yValIsAllNull","every","ele","grid","top","bottom","containLabel","tooltip","trigger","datas","ticket","seriesName","text","textStyle","fontSize","fontWeight","legend","selected","legendName","selectedMode","axisTick","alignWithLabel","splitLine","name","nameGap","nameRotate","nameLocation","axisLine","series","smooth","symbolSize","lineColor","markPoint","markLine","chart11","ceil","upperLimit","lowerLimit","lqhhlSx","curVal","lqhhlXx","ifHaveIntersectionPoint","y1","y2","y3","y4","getIntersectionPoint","upperIntersectionPoint","lowerIntersectionPoint","upperIntersectionPointTrend","lowerIntersectionPointTrend","index1","validX1","validX2","chart12","avg","avgXIndex","chart13","chart14","chart15","chart16","lines","lqhhlHz","yAxisData","map","isNaN","lqhhlSc2","axisLabel","chart30","jsIsJz","isTwoLine","xDataSource1","xDataSource2","yDataSource1","yDataSource2","chartTitle","lineFunc","isShowMarkPoint","isShowMarkLine","isTwoLineData","cellValJzZjhsl","cellValJzZdgmd","trunc","jsZjhslJz","jsZdgmdJz","outJdZjhsl","outJdZdgmd","outValZjhsl","outValZdgmd","jsZjhslJd","jsZdgmdJd","jsZjhsl","jsZdgmd","coordY","markPointObj","markLineObj","seriesDataObj","maxPointData","lineObj2","maxPointDataX","maxPointDataY","lineObj1","chart50","xDataSourceOld","yDataSourceOld","yDataSourceSxOld","yDataSourceXxOld","allData","ySx","yXx","sort","a","b","yDataSourceSx","yDataSourceXx","sxValNullCount","xDataSx","xDataXx","markLineData","val045","getLineObj","lineType","obj","z","connectNulls","silent","position","nullCount","xObj","splitNumber","chart70","ztzl","cllx","logx","logy","curZtzl","jxhslZtzl","curCllx","jxhslCllx","item1","log","item2","abk","ack","dropName","getYOnLine","point1","point2","point3X","logX1","logY1","logX2","logY","exp","zero_ab","zero_ac","HpCoordinates","wl","hp","scHp","scWl","scWp","point_hp","Dy","Dylog","hp0_xab","hp0_xac","hp0_xcenter","Dxlog","adk","wly","wlx","wpy","wpx","wp","hpy2","hpylog2","hp0_xab2","hp0_xac2","hp0_xcenter2","outJdHp","outJdWl","outJdWp","jxhslScHpJd","jxhslScWlJd","jxhslScWpJd","jxhslScHp","jxhslScWl","jxhslScWp","interval","param","minMargin","chart90","xDataCl","yDataSourceCl","markPointData","gsS","jxhslSnShScfc","yDataCopy","curYData","eval","replace","opacity","val","chart110","xDataArrSource","yDataArrSource","curXName","chart130","logBase","inverse","chart150","chart170","chart190","_code","chart210","arr","uniqueData","self","t","getXline","chart230","lineCount","xDataSource3","yDataSource3","xData1","xData2","xData3","getHours","getMinutes","curArr","curItemMins","unshift","getxAxisObj","xAxisData","legendData","legendSelected","xValIsAllNull","topmargin","chart250","xmin","xmax","chart270","chart279_280_281","jjNum","chartType","chart290","chart310","yDataCl","chart330","wd015","wd019","wd025","wd031","Infinity","wdBh","wdYs","bszdjBh","bszdjYs","chart350","jsN","hsl","yVal1","yVal2","yVal25","isAllNull","seriesObjs","EChartsUtils","create","GC_1","spread_1","sheet_1","config_1","args_1","isHideChart","isShowCon","isShowVal","remove","chartId","allRowsTotalHeight","allRowsTotalWidth","allRowsTotalLeft","chartCellHeight","getRowHeight","colHeader","getColumnWidth","rowHeader","fObjPosition","fcObj","get","getElementById","divObj","setAttribute","innerHTML","ecObj","setTimeout","initChart","fObj","getCellVals","sheetName","retArr","dataOneArr","dataOneSourceArr","curSheet","getSheetFromName","itemCell","indexCell","curCellVal","xDataOne","yDataOne","xDataOneSource","yDataOneSource","curItemValsX","sheetNameX","xCells","curItemValsY","sheetNameY","yCells","ecDom","echarts","getInstanceByDom","init","renderer","useDirtyRect","animation","setOption","getEChartsObj","WorkbookUtils","loadSjsFile","succFunc","errorFunc","sjsBlob","Blob","open","getWookbookBlob","save","error","print","printInfo","showRowHeader","Print","PrintVisibilityType","hide","showColumnHeader","rowStart","rowEnd","columnStart","columnEnd","margin","header","footer","paperSize","PaperSize","PaperKind","a4","exportToExcel","fileName","json","toJSON","includeBindingSource","removeCustomFormulas","tempSpread","Workbook","fromJSON","iSheet","suspendCalcService","cellFormula","getFormula","formula","resumeCalcService","fileType","FileType","excel","includeStyles","includeFormulas","saveAsView","rowHeadersAsFrozenColumns","columnHeadersAsFrozenRows","includeAutoMergedCells","includeCalcModelCache","includeUnusedNames","includeEmptyRegionCells","export","saveAs","destroy","mergeWorkbooksToExcel","spreads","exportName","mainWorkbook","styleSign","getNamedStyles","namedStyle","addNamedStyle","tempSheet","tempSheetJSON","stringify","newSheet","Worksheet","addSheet","newSheetRowCount","curMainSheet","pastedRangesStartRow","fromRanges","Range","pastedRanges","commandManager","execute","cmd","fromSheet","isCutting","clipboardText","pasteOption","ClipboardPasteOptions","removeSheet","clearSelection","rowHeaderVisible","colHeaderVisible","tabStripVisible","showHorizontalScrollbar","showVerticalScrollbar","scrollbarMaxAlign","registerFont","regFonts","font","url","reader","FileReader","readAsArrayBuffer","onload","fontArrayBuffer","fonts","PDF","PDFFontsManager"],"mappings":"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","x_google_ignoreList":[2]}
1
+ {"version":3,"file":"index.esm.min.js","sources":["../node_modules/.pnpm/@rollup+plugin-typescript@1_ccba8aa16c5fc04bbd7ba036697931a3/node_modules/tslib/tslib.es6.js","../src/utils/common.ts","../src/utils/sheet.ts","../src/utils/business.ts","../src/utils/echarts-all.ts","../src/utils/echarts.ts","../src/utils/wookbook.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\r\n * 公用工具函数属性\r\n */\r\nexport const CommonUtils = {\r\n /**\r\n * 获取文件的字节流对象\r\n * @param fileUrl 在线文件地址\r\n * @returns 文件的字节流对象\r\n */\r\n getFileBlob: async (fileUrl: string): Promise<Blob> | null => {\r\n // 获取文件响应结果\r\n const response = await fetch(fileUrl, { method: 'GET' });\r\n\r\n // 获取成功\r\n if (response.ok) {\r\n // 文件的字节流对象\r\n const blob = await response.blob();\r\n\r\n return blob;\r\n } else {\r\n return null;\r\n }\r\n },\r\n\r\n /**\r\n * 获取列的英文字母\r\n * @param colIndex 列的索引\r\n * @returns 返回英文字母\r\n */\r\n getColLetterName: (colIndex: number): string => {\r\n colIndex += 1;\r\n\r\n let letter = '';\r\n while (colIndex > 0) {\r\n const remainder = (colIndex - 1) % 26;\r\n letter = String.fromCharCode(remainder + 65) + letter;\r\n colIndex = Math.floor((colIndex - 1) / 26);\r\n }\r\n\r\n return letter.toUpperCase();\r\n },\r\n};\r\n","// 导入rapid-utils中的函数(注意:需要在tsconfig.json文件中设置moduleResolution为node,否则会提示:找不到模块“rapid-utils”。你的意思是要将 \"moduleResolution\" 选项设置为 \"nodenext\",还是要将别名添加到 \"paths\" 选项中?ts(2792))\r\nimport { forEachJson, orderByJson, groupByJson } from 'rapid-utils';\r\n// 导入单元格实体\r\nimport { CellModel, CellWatermarkModel, CellDateModel } from '../types/sheet';\r\nimport { CommonUtils } from '../utils/common';\r\n\r\n/**\r\n * SpreadJS工作表工具函数属性\r\n */\r\nexport const SheetUtils = {\r\n /**\r\n * 获取当前活动工作表选中的单元格集合\r\n * @param spread 工作簿对象\r\n * @returns 返回选中单元格的集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n */\r\n getActiveSheetSelectCells: (spread: any): CellModel[] => {\r\n const sheet = spread.getActiveSheet();\r\n\r\n const allCellObjs: CellModel[] = sheet.getSelections();\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 设置当前活动工作表某个或某些单元格范围为选中状态\r\n * @param spread 工作簿对象\r\n * @param cellObj 设置选中的单元格,格式如:{row:0,col:0,rowCount:1,colCount:1}\r\n */\r\n setActiveSheetSelectCells: (spread: any, cellObj: CellModel) => {\r\n const sheet = spread.getActiveSheet();\r\n\r\n sheet.setSelection(cellObj.row, cellObj.col, cellObj.rowCount, cellObj.colCount);\r\n },\r\n\r\n /**\r\n * 获取某工作表中某个范围中所有的单元格坐标对象集合\r\n * 该方法适用的场景如:手动选择了某个单元格范围,在这个范围中可能包含独立的单元格,也可能包含合并的单元格,这时候就需要用到如下方法获取到所有单元格对象\r\n * @param sheet 工作表实例\r\n * @param selectRange 单元格范围,格式如:{ row: 0, col: 0, rowCount: 2, colCount: 2 }\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @returns 返回数组集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n */\r\n getAllCellObjsByRange: (sheet: any, selectRange: CellModel, isMulColOrder: boolean = false): CellModel[] => {\r\n return SheetUtils.getAllCellObjsByRanges(sheet, [selectRange], isMulColOrder);\r\n },\r\n\r\n /**\r\n * 获取某工作表中多个范围集合中所有的单元格坐标对象集合\r\n * 该方法适用的场景如:手动选择了很多个单元格范围,在这些范围中可能包含独立的单元格,也可能包含合并的单元格,这时候就需要用到如下方法获取到所有单元格对象\r\n * @param sheet 工作表实例\r\n * @param selectRanges 单元格范围集合,格式如:[{ row: 0, col: 0, rowCount: 2, colCount: 2 }]\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @returns 返回数组集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n */\r\n getAllCellObjsByRanges: (sheet: any, selectRanges: CellModel[], isMulColOrder: boolean = false): CellModel[] => {\r\n // 得到所有的单元格坐标对象集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n let allCellObjs: CellModel[] = [];\r\n\r\n selectRanges.forEach((item, index) => {\r\n // 得到当前item中所有合并的单元格对象集合\r\n const itemSpanCells = sheet.getSpans(item);\r\n itemSpanCells.forEach((itemSpanCell: CellModel) => {\r\n allCellObjs.push({\r\n row: itemSpanCell.row,\r\n col: itemSpanCell.col,\r\n rowCount: itemSpanCell.rowCount,\r\n colCount: itemSpanCell.colCount,\r\n });\r\n });\r\n\r\n if (item.row === undefined || item.col === undefined || item.rowCount === undefined || item.colCount === undefined) {\r\n throw new Error('row、col、rowCount、colCount is required.');\r\n }\r\n\r\n // 遍历item中涉及到的所有单元格\r\n for (let i = item.row; i < +item.row + item.rowCount; i++) {\r\n for (let j = item.col; j < item.col + item.colCount; j++) {\r\n const curSpanCellObj = sheet.getSpan(i, j);\r\n\r\n // 检查当前单元格是否为合并单元格\r\n if (curSpanCellObj == null) {\r\n allCellObjs.push({\r\n row: i,\r\n col: j,\r\n rowCount: 1,\r\n colCount: 1,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n // 对所有单元格坐标对象集合进行排序\r\n allCellObjs = orderByJson(allCellObjs, !isMulColOrder ? ['row', 'col'] : ['col', 'row'], ['asc', 'asc']);\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 获取某工作表中所有的单元格坐标对象集合\r\n * @param sheet 工作表实例\r\n * @returns 返回数组集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]\r\n */\r\n getSheetAllCellObjs: (sheet: any): CellModel[] => {\r\n // 得到当前Sheet单元格范围\r\n const curSheetCellRange = [\r\n {\r\n row: 0,\r\n col: 0,\r\n rowCount: sheet.getRowCount(),\r\n colCount: sheet.getColumnCount(),\r\n },\r\n ];\r\n\r\n // 得到所有的单元格坐标对象集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]\r\n const allCellObjs = SheetUtils.getAllCellObjsByRanges(sheet, curSheetCellRange);\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 获取某工作表中选中的所有单元格坐标对象集合\r\n * @param sheet 工作表实例\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @returns 返回数组集合,格式如:[{ col: 0, row: 0, \"rowCount\": 1, \"colCount\": 1 }]\r\n */\r\n getSheetSelectCellObjs: (sheet: any, isMulColOrder: boolean = false): CellModel[] => {\r\n // 得到当前Sheet中选择的单元格范围集合\r\n const curSheetCellRange = sheet.getSelections();\r\n\r\n // 得到所有的单元格坐标对象集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]\r\n const allCellObjs = SheetUtils.getAllCellObjsByRanges(sheet, curSheetCellRange, isMulColOrder);\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 获取活动工作表中选中的所有单元格坐标对象集合\r\n * @param spread 工作簿实例\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @returns 返回数组集合,格式如:[{ col: 0, row: 0, \"rowCount\": 1, \"colCount\": 1 }]\r\n */\r\n getActiveSheetSelectCellObjs: (spread: any, isMulColOrder: boolean = false): CellModel[] => {\r\n // 当前活动的Sheet\r\n const sheet = spread.getActiveSheet();\r\n\r\n return SheetUtils.getSheetSelectCellObjs(sheet, isMulColOrder);\r\n },\r\n\r\n /**\r\n * 获取某工作表指定范围单元格的坐标对象集合(二维数组,格式如:[[{row:0……}],[{row:0……}]])\r\n * @param sheet 工作表实例\r\n * @param cellRange 单元格范围\r\n * @param groupType 分组字段属性(row或col),默认为:row\r\n * @returns 返回某工作表指定范围单元格的坐标对象集合(二维数组,格式如:[[{row:0……}],[{row:0……}]])\r\n */\r\n getSheetCellObjsByGroup: (sheet: any, cellRange: CellModel, groupType: 'row' | 'col' = 'row'): Array<Array<CellModel>> => {\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n const valCells = SheetUtils.getAllCellObjsByRange(sheet, cellRange);\r\n\r\n // 按照JSON数组中某个字段进行分组(groupType为row或col)\r\n const groupByCells = groupByJson(valCells, groupType);\r\n\r\n // 最终返回结果(二维数组)\r\n const retCells: Array<Array<any>> = [];\r\n\r\n // 遍历分组JSON对象(groupByCells的格式为:{key1: [cell1, cell2, ...], key2: [cell1, cell2, ...], ...})\r\n forEachJson(groupByCells, (curGroupCells: CellModel[], key, source) => {\r\n retCells.push(curGroupCells);\r\n });\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n\r\n return retCells;\r\n },\r\n\r\n /**\r\n * 获取某工作表选中单元格的值集合\r\n * @param sheet 工作表实例\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @param nullUndefinedReplaceVal 如果单元格的值为null或undefined,则将其替换为该值(如果不传入该参数,则不替换)\r\n * @returns 返回选中单元格的值集合\r\n */\r\n getSheetSelectVals: (\r\n sheet: any,\r\n isMulColOrder: boolean = false,\r\n nullUndefinedReplaceVal?: number | string\r\n ): (number | string | null | undefined)[] => {\r\n // 获取活动工作表选中单元格对象集合\r\n const selectCells = SheetUtils.getSheetSelectCellObjs(sheet, isMulColOrder);\r\n\r\n // 获取选中单元格的值集合\r\n let selectCellVals: (number | string | null | undefined)[] = [];\r\n selectCells.forEach((cell) => {\r\n let cellVal = sheet.getValue(cell.row, cell.col);\r\n\r\n // 如果cellVal为null或undefined,并且nullUndefinedReplaceVal不为null或undefined,则将cellVal替换为nullUndefinedReplaceVal\r\n if (nullUndefinedReplaceVal != null && nullUndefinedReplaceVal != undefined && (cellVal === null || cellVal === undefined)) {\r\n cellVal = nullUndefinedReplaceVal;\r\n }\r\n\r\n selectCellVals.push(cellVal);\r\n });\r\n\r\n return selectCellVals;\r\n },\r\n\r\n /**\r\n * 获取活动工作表选中单元格的值集合\r\n * @param spread 工作簿实例\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * @param nullUndefinedReplaceVal 如果单元格的值为null或undefined,则将其替换为该值(如果不传入该参数,则不替换)\r\n * @returns 返回选中单元格的值集合\r\n */\r\n getActiveSheetSelectVals: (\r\n spread: any,\r\n isMulColOrder: boolean = false,\r\n nullUndefinedReplaceVal?: number | string\r\n ): (number | string | null | undefined)[] => {\r\n // 获取当前活动工作表\r\n const sheet = spread.getActiveSheet();\r\n\r\n return SheetUtils.getSheetSelectVals(sheet, isMulColOrder, nullUndefinedReplaceVal);\r\n },\r\n\r\n /**\r\n * 获取某工作表指定范围单元格的值集合(二维数组,格式如:[[1,2,3],[4,5,6]])\r\n * @param sheet 工作表实例\r\n * @param cellRange 单元格范围\r\n * @param groupType 分组字段属性(row或col),默认为:row\r\n * @param nullUndefinedReplaceVal 如果单元格的值为null或undefined,则将其替换为该值(如果不传入该参数,则不替换)\r\n * @returns 返回某工作表指定范围单元格的值集合(二维数组,格式如:[[1,2,3],[4,5,6]])\r\n */\r\n getSheetRangeValsByGroup: (\r\n sheet: any,\r\n cellRange: CellModel,\r\n groupType: 'row' | 'col' = 'row',\r\n nullUndefinedReplaceVal?: number | string | boolean\r\n ): Array<Array<any>> => {\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n const valCells = SheetUtils.getAllCellObjsByRange(sheet, cellRange);\r\n\r\n // 按照JSON数组中某个字段进行分组(groupType为row或col)\r\n const groupByCells = groupByJson(valCells, groupType);\r\n\r\n // 最终返回结果(二维数组)\r\n const retVals: Array<Array<any>> = [];\r\n\r\n // 遍历分组JSON对象(groupByCells的格式为:{key1: [cell1, cell2, ...], key2: [cell1, cell2, ...], ...})\r\n forEachJson(groupByCells, (curGroupCells: CellModel[], key, source) => {\r\n // 当前按照row或col分组的单元格的值集合\r\n const curVals: Array<any> = [];\r\n\r\n // 遍历当前分组的所有单元格\r\n forEachJson(curGroupCells, (item, index, source) => {\r\n let cellVal = sheet.getValue(item.row, item.col);\r\n\r\n // 如果cellVal为null或undefined,并且nullUndefinedReplaceVal不为null或undefined,则将cellVal替换为nullUndefinedReplaceVal\r\n if (nullUndefinedReplaceVal != null && nullUndefinedReplaceVal != undefined && (cellVal === null || cellVal === undefined)) {\r\n cellVal = nullUndefinedReplaceVal;\r\n }\r\n\r\n curVals.push(cellVal);\r\n });\r\n\r\n retVals.push(curVals);\r\n });\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n\r\n return retVals;\r\n },\r\n\r\n /**\r\n * 获取单元格类型名称\r\n * @param GC GC对象\r\n * @param sheet 工作表实例\r\n * @param row 单元格行索引\r\n * @param col 单元格列索引\r\n * @returns 返回单元格类型名称,如:button、radio、checkbox、checkboxList、hyperLink、comboBox、date、dateRange、calc\r\n */\r\n getCellType: (GC: any, sheet: any, row: number, col: number): string | undefined => {\r\n let cellTypeName;\r\n\r\n // 先根据getCellType来获取\r\n const cellType = sheet.getCellType(row, col);\r\n\r\n if (cellType instanceof GC.Spread.Sheets.CellTypes.Button) {\r\n cellTypeName = 'button';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.RadioButtonList) {\r\n cellTypeName = 'radio';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBox) {\r\n cellTypeName = 'checkbox';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBoxList) {\r\n cellTypeName = 'checkboxList';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.HyperLink) {\r\n cellTypeName = 'hyperLink';\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.ComboBox) {\r\n cellTypeName = 'comboBox';\r\n }\r\n\r\n // 根据getStyle来获取\r\n if (cellTypeName == undefined || cellTypeName == null) {\r\n const cellStyle = sheet.getStyle(row, col);\r\n\r\n if (cellStyle && cellStyle.cellButtons && cellStyle.cellButtons.length > 0) {\r\n if (cellStyle.cellButtons[0].command == 'openDateTimePicker') {\r\n if (cellStyle.dropDowns && cellStyle.dropDowns.length > 0) {\r\n if (cellStyle.dropDowns[0].option.showDateRange) {\r\n cellTypeName = 'dateRange';\r\n } else {\r\n cellTypeName = 'date';\r\n }\r\n }\r\n } else if (cellStyle.cellButtons[0].command == 'openCalculator') {\r\n cellTypeName = 'calc';\r\n }\r\n }\r\n }\r\n\r\n return cellTypeName;\r\n },\r\n\r\n /**\r\n * 设置工作簿中所有工作表的缩放比例\r\n * @param spread 工作簿实例\r\n * @param scale 缩放比例,默认为:1(100%)\r\n */\r\n setSheetZoom: (spread: any, scale: number) => {\r\n // 暂停绘制\r\n spread.suspendPaint();\r\n\r\n const sheetCount = spread.getSheetCount();\r\n for (let i = 0; i < sheetCount; i++) {\r\n const sheet = spread.getSheet(i);\r\n\r\n sheet.zoom(scale);\r\n }\r\n\r\n // 恢复绘制\r\n spread.resumePaint();\r\n },\r\n\r\n /**\r\n * 设置当前活动工作表中选中的单元格背景颜色\r\n * @param spread 工作簿实例\r\n * @param color 背景颜色\r\n */\r\n setActiveSheetSelectBgColor: (spread: any, color: string) => {\r\n const sheet = spread.getActiveSheet();\r\n\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n //#region 方式1:通过getRange进行批量设置,推荐使用该方法来实现\r\n\r\n // 获取选择的多个单元格范围集合\r\n const selections = SheetUtils.getActiveSheetSelectCells(spread);\r\n\r\n // 循环每个选中的单元格范围\r\n selections.forEach((sel: CellModel) => {\r\n // 批量设置每个选中的单元格范围的背景颜色\r\n sheet.getRange(sel.row, sel.col, sel.rowCount, sel.colCount).backColor(color);\r\n });\r\n\r\n //#endregion\r\n\r\n //#region 方式2:通过getCell获取单元格样式对每个单元格进行设置,此方式效率相对较低,不推荐\r\n\r\n // // 当前活动的工作表中所有选择的单元格\r\n // const selectCells = SheetUtils.getActiveSheetSelectCellObjs(spread);\r\n\r\n // selectCells.forEach(item => {\r\n // // 获取单元格对象\r\n // const cellObj = sheet.getCell(item.row, item.col);\r\n\r\n // // 获取单元格样式\r\n // let cellStyle = sheet.getStyle(item.row, item.col);\r\n // if (!cellStyle) {\r\n // // 不存在样式则new一个\r\n // cellStyle = new GC.Spread.Sheets.Style();\r\n // }\r\n\r\n // // 设置单元格背景颜色\r\n // cellStyle.backColor = color;\r\n\r\n // // 重新设置单元格样式\r\n // cellObj.setStyle(cellStyle);\r\n // });\r\n\r\n //#endregion\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n },\r\n\r\n /**\r\n * 设置某工作表中指定单元格背景颜色\r\n * @param sheet 工作表实例\r\n * @param cells 单元格集合\r\n * @param color 背景颜色\r\n */\r\n setSheetBgColor: (sheet: any, cells: CellModel[], color: string) => {\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n // 循环每个选中的单元格范围\r\n cells.forEach((sel: CellModel) => {\r\n // 批量设置每个选中的单元格范围的背景颜色\r\n sheet.getRange(sel.row, sel.col, sel.rowCount, sel.colCount).backColor(color);\r\n });\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n },\r\n\r\n /**\r\n * 设置工作簿中所有工作表是否显示分页线\r\n * @param spread 工作簿实例\r\n * @param isShow 是否显示分页线(true:显示、false:不显示)\r\n */\r\n setSheetShowPrintPageLine: (spread: any, isShow: boolean) => {\r\n // 暂停绘制\r\n spread.suspendPaint();\r\n\r\n const sheetCount = spread.getSheetCount();\r\n for (let i = 0; i < sheetCount; i++) {\r\n const sheet = spread.getSheet(i);\r\n\r\n // 获取当前工作表是否显示分页线\r\n // var isVisible = sheet.isPrintLineVisible();\r\n\r\n sheet.isPrintLineVisible(isShow);\r\n }\r\n\r\n // 恢复绘制\r\n spread.resumePaint();\r\n },\r\n\r\n /**\r\n * 忽略工作工作表元格中指定字符串不显示,如:#DIV/0!、#VALUE!等\r\n * @param GC GC对象\r\n */\r\n ignoreSheetShowStrs: (GC: any) => {\r\n // 忽略的字符串集合\r\n const ignoreStrs: string[] = ['#DIV/0!', '#VALUE!', '#NAME?', '#N/A', '#NULL!', '#NUM!', '#REF!'];\r\n\r\n // paint对象\r\n const ignorePaint = GC.Spread.Sheets.CellTypes.Text.prototype.paint;\r\n\r\n // 重写paint函数\r\n GC.Spread.Sheets.CellTypes.Text.prototype.paint = function (ctx: any, value: any, x: any, y: any, w: any, h: any, style: any, options: any) {\r\n // 如果在忽略的字符串集合中有匹配的结果,则将其显示为空字符串\r\n if (ignoreStrs.some((item) => item == value)) {\r\n ignorePaint.call(this, ctx, '/', x, y, w, h, style, options);\r\n } else {\r\n ignorePaint.apply(this, arguments);\r\n }\r\n\r\n // // 或使用如下代码\r\n // if (ignoreStrs.some((item) => item == value)) {\r\n // \tvalue = '';\r\n // }\r\n // ignorePaint.apply(this, [ctx, value, x, y, w, h, style, options]);\r\n };\r\n },\r\n\r\n /**\r\n * 设置工作表显示辅助线(底部和右侧的辅助线)\r\n * @param sheet 工作表实例\r\n * @param width 宽度(像素)\r\n * @param height 高度(像素)\r\n * @param lineWidth 辅助线宽度(默认为:1像素)\r\n * @param colorStr 辅助线颜色(默认为:#409eff)\r\n * @param isHb 是否为横表(默认为:false)\r\n */\r\n setSheetAuxiliaryLine: (\r\n GC: any,\r\n sheet: any,\r\n width: number,\r\n height: number,\r\n lineWidth: number = 1,\r\n colorStr: string = '#409eff',\r\n isHb: boolean = false\r\n ) => {\r\n // 创建底部和右侧的浮动对象\r\n let floatBottom = new GC.Spread.Sheets.FloatingObjects.FloatingObject(`floatLineBottom${isHb ? 'Hb' : ''}`, 0, height, width, lineWidth),\r\n floatRight = new GC.Spread.Sheets.FloatingObjects.FloatingObject(`floatLineRight${isHb ? 'Hb' : ''}`, width, 0, lineWidth, height);\r\n\r\n // 创建底部和右侧的div对象\r\n let divBottom = document.createElement('div'),\r\n divRight = document.createElement('div');\r\n\r\n // 设置底部div对象样式\r\n divBottom.style.width = `${width}px`;\r\n divBottom.style.height = '1px';\r\n divBottom.style.borderBottom = `${lineWidth}px dashed ${colorStr}`;\r\n\r\n // 设置右侧div对象样式\r\n divRight.style.width = '1px';\r\n divRight.style.height = `${height}px`;\r\n divRight.style.borderLeft = `${lineWidth}px dashed ${colorStr}`;\r\n\r\n // floatBottom.fixedPosition(true);\r\n // floatRight.fixedPosition(true);\r\n\r\n // 设置底部和右侧浮动对象不允许改变大小、不允许拖动和设置浮动对象的内容\r\n floatBottom.allowResize(false);\r\n floatBottom.allowMove(false);\r\n floatBottom.content(divBottom);\r\n floatRight.allowResize(false);\r\n floatRight.allowMove(false);\r\n floatRight.content(divRight);\r\n\r\n // 将浮动元素添加到工作表中\r\n sheet.floatingObjects.add(floatBottom);\r\n sheet.floatingObjects.add(floatRight);\r\n },\r\n\r\n /**\r\n * 设置当前活动工作表的水印和数据绑定是否显示\r\n * @param spread 工作簿实例\r\n * @param cells 数据绑定单元格配置集合([{ row: number; col: number; title: string; pathPrev: string; pathField: string }])\r\n * @param isShow 是否显示\r\n */\r\n setActiveSheetWatermark: (spread: any, cells: CellWatermarkModel[], isShow: boolean) => {\r\n if (cells == null || cells == undefined) {\r\n return;\r\n }\r\n\r\n const sheet = spread.getActiveSheet();\r\n\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n cells.forEach((cell: CellWatermarkModel) => {\r\n // 设置或移除水印标签\r\n sheet.getCell(cell.row, cell.col).watermark(isShow ? `{${cell.title}}` : undefined);\r\n\r\n // 设置或移除绑定路径\r\n sheet.setBindingPath(cell.row, cell.col, isShow ? `${cell.pathPrev}.${cell.pathField}` : undefined);\r\n });\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n },\r\n\r\n /**\r\n\t * 设置某工作表中单元格为日期选择控件\r\n\t * @param GC GC对象\r\n\t * @param sheet 工作表实例\r\n\t * @param cells 单元格集合,格式如:[{\r\n\t\t\tdateFormat: 'yyyy-MM-dd',\r\n\t\t\trow: 0,\r\n\t\t\tcol: 0\r\n\t\t}]\r\n\t * @param isAutoSize 是否自适应单元格大小(默认为:true)\r\n\t */\r\n setSheetCellDate: (GC: any, sheet: any, cells: CellDateModel[], isAutoSize: boolean = true) => {\r\n cells.forEach((item, index) => {\r\n // 先获取单元格样式,否则设置控件后样式会丢失\r\n let cellStyle = sheet.getStyle(item.row, item.col);\r\n if (!cellStyle) {\r\n cellStyle = new GC.Spread.Sheets.Style();\r\n }\r\n\r\n cellStyle.cellButtons = [\r\n {\r\n imageType: GC.Spread.Sheets.ButtonImageType.dropdown,\r\n command: 'openDateTimePicker',\r\n // 按钮宽度\r\n // width: 10,\r\n },\r\n ];\r\n cellStyle.dropDowns = [\r\n {\r\n type: GC.Spread.Sheets.DropDownType.dateTimePicker,\r\n option: {\r\n showTime: false,\r\n showDateRange: false,\r\n },\r\n },\r\n ];\r\n cellStyle.formatter = item.dateFormat;\r\n\r\n // 是否缩小以适应\r\n cellStyle.shrinkToFit = isAutoSize;\r\n\r\n // 设置单元格样式\r\n sheet.setStyle(item.row, item.col, cellStyle);\r\n });\r\n },\r\n\r\n /**\r\n * 根据单元格范围获取范围字符串\r\n * @param cellRange 单元格范围\r\n * @returns 返回范围字符串,如:A1:B2\r\n */\r\n getRangeStr: (cellRange: CellModel): string => {\r\n // 计算起始位置\r\n const startCol = CommonUtils.getColLetterName(cellRange.col);\r\n // 行索引转Excel行号(从1开始)\r\n const startRow = cellRange.row + 1;\r\n\r\n // 计算结束位置\r\n const endCol = CommonUtils.getColLetterName(cellRange.col + cellRange.colCount - 1);\r\n // 结束行号 = 起始行 + 行数\r\n const endRow = cellRange.row + cellRange.rowCount;\r\n\r\n return `${startCol}${startRow}:${endCol}${endRow}`;\r\n\r\n // // 或者使用SpreadJS提供的方法rangeToFormula\r\n // return GC.Spread.Sheets.CalcEngine.rangeToFormula(cellRange);\r\n },\r\n};\r\n","import { chunkJson } from 'rapid-utils';\r\nimport { TestObjectAttrModel } from '../types/business';\r\nimport { SheetUtils } from '../utils/sheet';\r\n\r\n/**\r\n * SpreadJS业务相关工具函数属性\r\n */\r\nexport const BusinessUtils = {\r\n /**\r\n * 创建检测对象属性单元格\r\n * @param gc GC对象\r\n * @param sheet 工作表实例\r\n * @param testObjectAttrs 检测对象属性配置集合\r\n * @param isVertical 是否为纵表,默认为:true\r\n * @param contentColStartIndex 表格内容列起始索引,默认为:1\r\n * @param contentTotalColCount 表格内容列总数,默认为:77\r\n * @param addRowHeight 添加的表格行高,默认为:24\r\n */\r\n createTestObjectAttrsCells: (\r\n gc: any,\r\n sheet: any,\r\n testObjectAttrs: TestObjectAttrModel[],\r\n isVertical: boolean = true,\r\n contentColStartIndex: number = 1,\r\n contentTotalColCount: number = 77,\r\n addRowHeight: number = 24\r\n ) => {\r\n if (!testObjectAttrs || testObjectAttrs.length === 0) {\r\n return;\r\n }\r\n\r\n // 标题单元格列数量(纵表为12列,横表待定)\r\n const titleCellColumnCount = isVertical ? 12 : 10;\r\n // 标题对应的值单元格列数量(纵表:第一个值单元格为26、第二个值单元格为27,纵表待定)\r\n const titleCellValColumnCount = isVertical ? 26 : 15;\r\n\r\n // 一行中检测对象属性的个数(纵表为2个,横表为3个)\r\n const rowTestObjectCount = isVertical ? 2 : 3;\r\n\r\n // 将测试对象属性数据进行分块\r\n const testObjectAttrsChunk = chunkJson(testObjectAttrs, rowTestObjectCount);\r\n\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n // 设置工作表行数为0\r\n sheet.setRowCount(0);\r\n\r\n for (let i = 0; i < testObjectAttrsChunk.length; i++) {\r\n const rowAttrArr = testObjectAttrsChunk[i] as TestObjectAttrModel[];\r\n\r\n // 获取总行数\r\n const totalRowCount: number = sheet.getRowCount();\r\n\r\n // 添加一行\r\n sheet.addRows(totalRowCount, 1);\r\n\r\n // 设置添加这一行的行高\r\n sheet.setRowHeight(totalRowCount, addRowHeight, gc.Spread.Sheets.SheetArea.viewport);\r\n\r\n // 获取添加这一行的区域范围\r\n const addRowRange = sheet.getRange(totalRowCount, 1, contentColStartIndex, contentTotalColCount, gc.Spread.Sheets.SheetArea.viewport);\r\n // 设置添加这一行区域中的边框样式(最左边和最后边边框样式为粗线、中间的为细边框样式)\r\n addRowRange.setBorder(new gc.Spread.Sheets.LineBorder('#000', gc.Spread.Sheets.LineStyle.thin), { all: true });\r\n addRowRange.setBorder(new gc.Spread.Sheets.LineBorder('#000', gc.Spread.Sheets.LineStyle.medium), { left: true });\r\n addRowRange.setBorder(new gc.Spread.Sheets.LineBorder('#000', gc.Spread.Sheets.LineStyle.medium), { right: true });\r\n // 设置单元格水平和垂直居中\r\n addRowRange.hAlign(gc.Spread.Sheets.HorizontalAlign.center);\r\n addRowRange.vAlign(gc.Spread.Sheets.HorizontalAlign.center);\r\n\r\n // 合并第一个属性的标题列和值列,同时设置对应单元格的内容\r\n sheet.addSpan(totalRowCount, contentColStartIndex, 1, titleCellColumnCount, gc.Spread.Sheets.SheetArea.viewport);\r\n sheet.addSpan(\r\n totalRowCount,\r\n contentColStartIndex + titleCellColumnCount,\r\n 1,\r\n rowAttrArr.length > 1 ? titleCellValColumnCount : contentTotalColCount - titleCellColumnCount,\r\n gc.Spread.Sheets.SheetArea.viewport\r\n );\r\n sheet.setValue(totalRowCount, contentColStartIndex, rowAttrArr[0].title);\r\n sheet.setValue(totalRowCount, contentColStartIndex + titleCellColumnCount, rowAttrArr[0].value);\r\n\r\n // 合并第二个属性的标题列和值列,同时设置对应单元格的内容\r\n if (rowAttrArr.length > 1) {\r\n const colIndexTitle = contentColStartIndex + titleCellColumnCount + titleCellValColumnCount;\r\n const colIndexValue = colIndexTitle + titleCellColumnCount;\r\n\r\n sheet.addSpan(totalRowCount, colIndexTitle, 1, titleCellColumnCount, gc.Spread.Sheets.SheetArea.viewport);\r\n sheet.addSpan(\r\n totalRowCount,\r\n colIndexValue,\r\n 1,\r\n titleCellValColumnCount + 1 + (!isVertical && rowAttrArr.length == 2 ? titleCellColumnCount + titleCellValColumnCount + 1 : 0),\r\n gc.Spread.Sheets.SheetArea.viewport\r\n );\r\n sheet.setValue(totalRowCount, colIndexTitle, rowAttrArr[1].title);\r\n sheet.setValue(totalRowCount, colIndexValue, rowAttrArr[1].value);\r\n }\r\n // 合并第三个属性的标题列和值列,同时设置对应单元格的内容\r\n if (rowAttrArr.length > 2) {\r\n const colIndexTitle =\r\n contentColStartIndex + titleCellColumnCount + titleCellValColumnCount + titleCellColumnCount + titleCellValColumnCount + 1;\r\n const colIndexValue = colIndexTitle + titleCellColumnCount;\r\n\r\n sheet.addSpan(totalRowCount, colIndexTitle, 1, titleCellColumnCount, gc.Spread.Sheets.SheetArea.viewport);\r\n sheet.addSpan(totalRowCount, colIndexValue, 1, titleCellValColumnCount + 1, gc.Spread.Sheets.SheetArea.viewport);\r\n sheet.setValue(totalRowCount, colIndexTitle, rowAttrArr[2].title);\r\n sheet.setValue(totalRowCount, colIndexValue, rowAttrArr[2].value);\r\n }\r\n }\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n },\r\n /**\r\n * 获取检测对象属性值集合\r\n * @param sheet 工作表实例\r\n * @param testObjectAttrs 检测对象属性配置集合\r\n * @param isVertical 是否为纵表,默认为:true\r\n * @param contentColStartIndex 表格内容列起始索引,默认为:1\r\n * @param contentTotalColCount 表格内容列总数,默认为:77\r\n */\r\n getTestObjectAttrsVals: (\r\n sheet: any,\r\n testObjectAttrs: TestObjectAttrModel[],\r\n isVertical: boolean = true,\r\n contentColStartIndex: number = 1,\r\n contentTotalColCount: number = 77\r\n ): TestObjectAttrModel[] => {\r\n // 一行中检测对象属性的个数(纵表为2个,横表为3个)\r\n const rowTestObjectCount = isVertical ? 2 : 3;\r\n\r\n // 将测试对象属性数据进行分块\r\n const testObjectAttrsChunk = chunkJson(testObjectAttrs, rowTestObjectCount);\r\n\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n // 所有单元格对象\r\n const allCells = SheetUtils.getAllCellObjsByRange(sheet, {\r\n row: 0,\r\n col: contentColStartIndex,\r\n rowCount: sheet.getRowCount(),\r\n colCount: contentTotalColCount,\r\n });\r\n // 将所有单元格对象进行分块\r\n const allCellsChunk = chunkJson(allCells, rowTestObjectCount * 2);\r\n\r\n // 将所有单元格对象按照testObjectAttrsChunk的结构进行组合\r\n const newAllCellsChunk = [];\r\n for (let i = 0; i < allCellsChunk.length; i++) {\r\n newAllCellsChunk.push(chunkJson(allCellsChunk[i], 2));\r\n }\r\n\r\n let retData: TestObjectAttrModel[] = [];\r\n\r\n for (let i = 0; i < testObjectAttrsChunk.length; i++) {\r\n const attrObjs = testObjectAttrsChunk[i] as TestObjectAttrModel[];\r\n\r\n for (let j = 0; j < attrObjs.length; j++) {\r\n const attrObj = attrObjs[j];\r\n\r\n retData.push({\r\n title: sheet.getValue(newAllCellsChunk[i][j][0].row, newAllCellsChunk[i][j][0].col), //attrObj.title,\r\n fieldName: attrObj.fieldName,\r\n value: sheet.getValue(newAllCellsChunk[i][j][1].row, newAllCellsChunk[i][j][1].col),\r\n });\r\n }\r\n }\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n\r\n return retData;\r\n },\r\n};\r\n","import * as math from 'mathjs';\r\nimport { type EChartsUtilsConfigModel } from '../types/echarts';\r\n\r\n/**\r\n * 公用方法,如:修约计算等\r\n */\r\nconst EChartsUtilsComm = {\r\n /**\r\n * 计算常规修约\r\n * @param roundingVal 修约值\r\n * @param accuracy 修约精度\r\n * @return 返回修约结果\r\n */\r\n getRound: (roundingVal, accuracy) => {\r\n // 验证修约的值是否为负数,为负数的话,取绝对值进行修约\r\n const valIsNegative = roundingVal < 0;\r\n if (valIsNegative) {\r\n roundingVal = Math.abs(roundingVal);\r\n }\r\n\r\n // 修约精度为0的时候\r\n if (accuracy == 0) {\r\n // 得到字符串形式\r\n let inputValStr = roundingVal.toString();\r\n\r\n // 判断是否有小数点,没有则直接返回换算后的修约值\r\n if (inputValStr.indexOf('.') == -1) {\r\n return valIsNegative ? -roundingVal : roundingVal;\r\n }\r\n\r\n // 获取整数数字部分和小数部分字符串\r\n let intVal = parseInt(inputValStr.split('.')[0]);\r\n let decimalStr = inputValStr.split('.')[1];\r\n\r\n // 小数部分大于或等于0.5的话,就给整数部分加1后返回,否则返回整数部分\r\n if (parseFloat(`0.${decimalStr}`) >= 0.5) {\r\n return valIsNegative ? -(intVal + 1) : intVal + 1;\r\n } else {\r\n return valIsNegative ? -intVal : intVal;\r\n }\r\n }\r\n\r\n // 系数\r\n let coefficient = 1 / accuracy;\r\n\r\n // 换算后的修约值(=修约值*系数)\r\n // 注意:此处使用到了toFixed,目的是可能会存在精度的问题\r\n let roundingValCal = Number((roundingVal * coefficient).toFixed(8));\r\n\r\n /**\r\n * 计算修约结果函数\r\n * @param inputVal 换算后的修约值\r\n * @returns 返回修约结果\r\n */\r\n const calcRoundingRet = (inputVal: number): number => {\r\n // 得到字符串形式\r\n let inputValStr = inputVal.toString();\r\n\r\n // 判断是否有小数点,没有则直接返回换算后的修约值\r\n if (inputValStr.indexOf('.') == -1) {\r\n return inputVal;\r\n }\r\n\r\n // 获取整数数字部分和小数部分字符串\r\n let intVal = parseInt(inputValStr.split('.')[0]);\r\n let decimalStr = inputValStr.split('.')[1];\r\n\r\n // 获取小数部分的第一位数字\r\n let decimalStrFirst = parseInt(decimalStr.substring(0, 1));\r\n\r\n // 大于等于6的时候,入\r\n if (decimalStrFirst >= 6) {\r\n return intVal + 1;\r\n }\r\n // 小于等于4的时候,舍\r\n else if (decimalStrFirst <= 4) {\r\n return intVal;\r\n }\r\n\r\n // 小数部分为5,并且只有一位小数的时候,前面的整数部分如果是奇数则入,反之则舍\r\n else if (decimalStrFirst == 5 && decimalStr.length == 1) {\r\n return intVal % 2 != 0 ? intVal + 1 : intVal;\r\n }\r\n\r\n // 小数部分为5,并且小数位数大于一位的时候,则入\r\n else if (decimalStrFirst == 5 && decimalStr.length > 1) {\r\n return intVal + 1;\r\n }\r\n\r\n return inputVal;\r\n };\r\n\r\n // 返回最终修约结果(=修约结果/系数)\r\n const retNum = calcRoundingRet(roundingValCal) / coefficient;\r\n\r\n //获取修约精度中的小数位数\r\n let accuracyStr = accuracy + '';\r\n\r\n // 如果修约精度中没有小数,则直接返回\r\n if (accuracyStr.indexOf('.') == -1) {\r\n return valIsNegative ? -retNum : retNum;\r\n } else {\r\n const retNumStr = retNum + '';\r\n\r\n // 补位的0的字符串\r\n let zeroStr = '';\r\n\r\n // 结果为整数的时候,需要补充小数点后面的小数位数为0,如:34→34.0\r\n if (retNumStr.indexOf('.') == -1) {\r\n let zeroStr = '';\r\n for (let index = 0; index < accuracyStr.split('.')[1].length; index++) {\r\n zeroStr += '0';\r\n }\r\n\r\n return (valIsNegative ? '-' : '') + `${retNum}.${zeroStr}`;\r\n }\r\n // 结果为小数的时候,需要补充修约精度的位数,如:0.3修约精度为0.01,则最终应该返回0.30\r\n else {\r\n const xsPart = retNumStr.split('.')[1];\r\n\r\n if (accuracyStr.split('.')[1].length > xsPart.length) {\r\n for (let index = 0; index < accuracyStr.split('.')[1].length - xsPart.length; index++) {\r\n zeroStr += '0';\r\n }\r\n }\r\n\r\n return (valIsNegative ? '-' : '') + `${retNum}${zeroStr}`;\r\n }\r\n }\r\n },\r\n /**\r\n * 实现Excel中TREND(返回线性回归拟合线的一组纵坐标值[y值])公式的计算\r\n * @param x x轴数据集合\r\n * @param y y轴数据集合\r\n * @param xVal x轴的值\r\n * @returns\r\n */\r\n calcTrend: (x: Array<number>, y: Array<number>, xVal: number) => {\r\n let n = x.length;\r\n let sumX = 0,\r\n sumY = 0,\r\n sumXY = 0,\r\n sumXX = 0;\r\n for (let i = 0; i < n; i++) {\r\n sumX += x[i];\r\n sumY += y[i];\r\n sumXY += x[i] * y[i];\r\n sumXX += x[i] * x[i];\r\n }\r\n let slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);\r\n let intercept = (sumY - slope * sumX) / n;\r\n\r\n let predictedY = slope * xVal + intercept;\r\n\r\n if (slope + '' == 'NaN') {\r\n return { y: '', gs: '', xl: '', jj: '' };\r\n }\r\n\r\n //返回y轴趋势数据,以及公式\r\n return { y: predictedY, gs: `${slope}*x+${intercept}`, xl: slope, jj: intercept };\r\n },\r\n /**\r\n * 过滤掉数组中的null、空字符串或/符号等,并返回新的数组\r\n * @param dataSource 原始数组\r\n */\r\n filterNullEmptyErrArray: (dataSource: Array<any>) => {\r\n let retArr = dataSource.filter((item) => item != null && item != undefined && (item._error == null || item._error == undefined) && item != '/');\r\n\r\n return retArr;\r\n },\r\n};\r\n\r\n/**\r\n * 所有统计图表的ECharts配置\r\n */\r\nexport const EChartsUtilsAll = {\r\n /**\r\n * 沥青混合料-目标配合比设计-毛体积密度\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart10: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0],\r\n yDataSource = yDataArr[0];\r\n\r\n // 原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData: any[] = [],\r\n yData: any[] = [];\r\n\r\n // 处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n // y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n // 检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*xAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 2.35,\r\n yAxisMin = 2.25,\r\n */\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Number(EChartsUtilsComm.getRound(yMax + 0.05, 0.01)),\r\n yAxisMin = Number(EChartsUtilsComm.getRound(yMin - 0.05, 0.01)),\r\n seriesData = [],\r\n upperLimit = null, // 上限\r\n lowerLimit = null,\r\n showLine = true; // 是否显示辅助线\r\n\r\n let points: any = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n // 计算峰值\r\n const peakvalue = [arrX[maxIndex], Number(EChartsUtilsComm.getRound(max, 0.001))],\r\n coordX = [peakvalue[0], yAxisMin];\r\n\r\n // console.log('x范围:', xMin, xMax);\r\n // 输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, xMin);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, xMax);\r\n }\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, arrX[maxIndex]);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n lineData = [\r\n [\r\n {\r\n coord: coordX,\r\n lineStyle: {\r\n color: '#333', // X轴\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: peakvalue,\r\n },\r\n ],\r\n ];\r\n pointData = [\r\n {\r\n xAxis: peakvalue[0],\r\n yAxis: peakvalue[1],\r\n symbolOffset: [0, 15],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n if (Number(data.data.xAxis) == 0 && Number(data.data.yAxis) == 0) {\r\n return '';\r\n } else {\r\n return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n }\r\n //return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n {\r\n xAxis: peakvalue[0],\r\n yAxis: yAxisMin,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'a1';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ];\r\n }\r\n\r\n // 判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,// 是否显示外边框线\r\n // borderColor: '#f00',// 外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n // 提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n // 顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n // 图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, // 显示\r\n },\r\n selectedMode: 'multiple', // 用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, // 使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 40 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', // '#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n // splitNumber: 10, // 设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n // 设置y轴箭头效果\r\n show: true, // y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, // 平滑的线条\r\n // 设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', // 符号类型\r\n symbolSize: 6, // 符号大小 lineJson.lineColor\r\n // 线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n // 线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n // 线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], // 去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-稳定度\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart11: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0],\r\n yDataSource = yDataArr[0];\r\n\r\n // 原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n // 处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n // y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n // 检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 2),\r\n yAxisMin = Math.floor(yMin - 2),\r\n seriesData = [],\r\n upperLimit = null, // 上限\r\n lowerLimit = 7.5, // 下限\r\n showLine = true; // 是否显示辅助线\r\n\r\n // 获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 2;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 2;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n // arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n\r\n // 计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n // 获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; // 上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; // 下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (index > 0) {\r\n // 上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n // 向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n // 下限交点\r\n if (lowerLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n // 向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n // 上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n // 下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n // 下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n // 只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n // 上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n // 上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n // 只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n // 上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n // 上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n // 上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n // 上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n // 输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, arrX[maxIndex]);\r\n }\r\n }\r\n\r\n // 峰值\r\n const peakvalue = [arrX[maxIndex], Number(EChartsUtilsComm.getRound(max, 0.001))];\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n lineData = [\r\n [\r\n {\r\n coord: [peakvalue[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', // X轴\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: peakvalue,\r\n },\r\n ],\r\n ];\r\n pointData = [\r\n {\r\n xAxis: peakvalue[0],\r\n yAxis: peakvalue[1],\r\n symbolOffset: [0, 15],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n if (Number(data.data.xAxis) == 0 && Number(data.data.yAxis) == 0) {\r\n return '';\r\n } else {\r\n return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n }\r\n //return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n {\r\n xAxis: peakvalue[0],\r\n yAxis: yAxisMin,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'a2';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ];\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-空隙率\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart12: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n yDataSource = yDataArr[0]; // [8.8, 5.9, 4.1, 3.3, 2.6];\r\n\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n //检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*\r\n\t\t\txAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 10,\r\n yAxisMin = 0,\r\n\t\t\t*/\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 2),\r\n yAxisMin = Math.floor(yMin - 2),\r\n seriesData = [],\r\n upperLimit = 5, //上限\r\n lowerLimit = 3, //下限\r\n showLine = true; //是否显示辅助线\r\n\r\n //获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 2;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 2;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n //获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; //上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; //下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n if (index > 0) {\r\n //上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n //下限交点\r\n if (lowerLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n //上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n //下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n //上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n //上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n //上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n //输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n if (upperIntersectionPoint.length > 0) {\r\n upperIntersectionPoint.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [item[0], upperLimit],\r\n },\r\n ]);\r\n });\r\n }\r\n if (lowerIntersectionPoint.length > 0) {\r\n lowerIntersectionPoint.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [item[0], lowerLimit],\r\n },\r\n ]);\r\n });\r\n }\r\n\r\n //上下线交点分别只有一个才求平均值\r\n if (upperIntersectionPoint.length == 1 && lowerIntersectionPoint.length == 1) {\r\n const avg = ((upperIntersectionPoint[0][0] + lowerIntersectionPoint[0][0]) / 2).toFixed(2);\r\n const avgXIndex = arrX.findIndex((n) => n == avg);\r\n // console.log('输出:', avg, avgXIndex);\r\n //输出\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, avg);\r\n }\r\n }\r\n lineData.push([\r\n {\r\n coord: [avg, yAxisMin],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [avg, arrY[avgXIndex]],\r\n },\r\n ]);\r\n pointData.push({\r\n xAxis: avg,\r\n yAxis: yAxisMin,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'a3';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n });\r\n }\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-流值\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart13: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n yDataSource = yDataArr[0]; // [2.2, 2.5, 2.9, 3.4, 4.2];\r\n\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n //检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*\r\n xAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 5,\r\n yAxisMin = 1,\r\n\t\t\t*/\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 1),\r\n yAxisMin = Math.floor(yMin - 1),\r\n seriesData = [],\r\n upperLimit = null, //上限\r\n lowerLimit = 2, //下限\r\n showLine = true; //是否显示辅助线\r\n\r\n //获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 1;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 1;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n\r\n //计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n //获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; //上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; //下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (index > 0) {\r\n //上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n //下限交点\r\n if (lowerLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n //上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n //下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n //上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n //上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n //上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n //输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n lineData = [];\r\n pointData = [];\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 25 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-矿料间隙率\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart14: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n yDataSource = yDataArr[0]; // [16.1, 15.2, 14.6, 14.8, 16];\r\n\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n //检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*\r\n\t\t\txAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 19.0,\r\n yAxisMin = 13.0,\r\n\t\t\t*/\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 1),\r\n yAxisMin = Math.floor(yMin - 1),\r\n seriesData = [],\r\n upperLimit = null, //上限\r\n lowerLimit = 13.5, //下限\r\n showLine = true; //是否显示辅助线\r\n\r\n //获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 1;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 1;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n\r\n //计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n //获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; //上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; //下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (index > 0) {\r\n //上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n //下限交点\r\n if (lowerLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n //上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n //下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n //上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n //上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n //上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n //输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n lineData = [];\r\n pointData = [];\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-有效沥青饱和度\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart15: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let xDataSource = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n yDataSource = yDataArr[0]; // [40.1, 59.8, 66.8, 74.5, 78.2];\r\n\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [];\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n xData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n xData.push(item);\r\n }\r\n }\r\n });\r\n yDataSource.forEach((item, index) => {\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item)) {\r\n yData.push(item);\r\n } else {\r\n if (item == '/' || item == undefined || item == null || item == '') {\r\n item = 0;\r\n yData.push(item);\r\n }\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n //检查x轴的数据有多少个0,大于1个的时候,就不绘制图形\r\n let zeroCount = 0;\r\n xData.forEach((item) => {\r\n if (item == 0) {\r\n zeroCount++;\r\n }\r\n });\r\n // if (zeroCount > 1) {\r\n // \treturn;\r\n // }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n /*\r\n\t\t\txAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMax = 80,\r\n yAxisMin = 30,\r\n\t\t\t*/\r\n xAxisMax = xMax,\r\n xAxisMin = xMin,\r\n yAxisMax = Math.ceil(yMax + 10),\r\n yAxisMin = Math.floor(yMin - 10),\r\n seriesData = [],\r\n upperLimit = 75, //上限\r\n lowerLimit = 60, //下限\r\n showLine = true; //是否显示辅助线\r\n\r\n //获取单元格中的上限和下限\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSx != null && chartExtJson.lqhhlSx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlSx.row, chartExtJson.lqhhlSx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n upperLimit = curVal;\r\n }\r\n }\r\n if (chartExtJson.lqhhlXx != null && chartExtJson.lqhhlXx != undefined) {\r\n const curVal = sheet.getValue(chartExtJson.lqhhlXx.row, chartExtJson.lqhhlXx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curVal)) {\r\n lowerLimit = curVal;\r\n }\r\n }\r\n }\r\n\r\n if (upperLimit != null && upperLimit > yAxisMax) {\r\n yAxisMax = upperLimit + 10;\r\n }\r\n if (lowerLimit != null && lowerLimit > yAxisMax) {\r\n yAxisMin = lowerLimit - 10;\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n console.log('无法解决该线性系统');\r\n }\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //计算两条线段是否有交点\r\n function ifHaveIntersectionPoint(y1, y2, y3, y4) {\r\n if ((y1 >= y3 && y2 <= y4) || (y1 <= y3 && y2 >= y4)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n //获取两点和香交线最接近的点\r\n function getIntersectionPoint(y1, y2, y) {\r\n if (Math.abs(y1 - y) > Math.abs(y2 - y)) {\r\n return 0;\r\n }\r\n return -1;\r\n }\r\n let upperIntersectionPoint = [],\r\n lowerIntersectionPoint = [];\r\n let upperIntersectionPointTrend = []; //上限交点趋势(向上相交(1) 还是向下相交(0))\r\n let lowerIntersectionPointTrend = []; //下限交点趋势\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n if (index > 0) {\r\n //上限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], upperLimit, upperLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], upperLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n upperIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n upperIntersectionPointTrend.push(0);\r\n } else {\r\n upperIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n //下限交点\r\n if (upperLimit != null) {\r\n if (ifHaveIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit, lowerLimit)) {\r\n let index1 = getIntersectionPoint(arrY[index - 1], arrY[index], lowerLimit);\r\n // console.log(arrX[index + index1], arrY[index + index1]);\r\n lowerIntersectionPoint.push([arrX[index + index1], arrY[index + index1]]);\r\n if (arrY[index - 1] > arrY[index]) {\r\n //向下趋势\r\n lowerIntersectionPointTrend.push(0);\r\n } else {\r\n lowerIntersectionPointTrend.push(1);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n let validX1 = xMin,\r\n validX2 = xMax;\r\n if (upperIntersectionPoint.length == 0 && lowerIntersectionPoint.length > 0) {\r\n //上限无交点,下限有交点\r\n if (lowerIntersectionPointTrend[0] == 0) {\r\n //下限向下相交\r\n validX1 = xMin;\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //下限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n if (lowerIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = lowerIntersectionPoint[1][0];\r\n }\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length == 0) {\r\n //上限有交点,下限无交点\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n if (upperIntersectionPoint.length == 1) {\r\n //只有一个交点\r\n validX2 = xMax;\r\n } else {\r\n validX2 = upperIntersectionPoint[1][0];\r\n }\r\n } else {\r\n //上限向上相交\r\n validX1 = xMin;\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n } else if (upperIntersectionPoint.length > 0 && lowerIntersectionPoint.length > 0) {\r\n //上下限都有交点,情况太多,我们只取中间\r\n if (upperIntersectionPointTrend[0] == 0) {\r\n //上限向下相交\r\n validX1 = upperIntersectionPoint[0][0];\r\n validX2 = lowerIntersectionPoint[0][0];\r\n } else {\r\n //上限向上相交\r\n validX1 = lowerIntersectionPoint[0][0];\r\n validX2 = upperIntersectionPoint[0][0];\r\n }\r\n }\r\n\r\n // console.log('x范围:', validX1, validX2);\r\n //输出开始和结束范围\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlKs != null && chartExtJson.lqhhlKs != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlKs.row, chartExtJson.lqhhlKs.col, validX1);\r\n sheet.setValue(chartExtJson.lqhhlJs.row, chartExtJson.lqhhlJs.col, validX2);\r\n }\r\n }\r\n\r\n let lineData = [];\r\n let pointData = [];\r\n if (showLine) {\r\n if (upperIntersectionPoint.length > 0) {\r\n upperIntersectionPoint.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [item[0], upperLimit],\r\n },\r\n ]);\r\n });\r\n }\r\n if (lowerIntersectionPoint.length > 0) {\r\n lowerIntersectionPoint.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], yAxisMin],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [item[0], lowerLimit],\r\n },\r\n ]);\r\n });\r\n }\r\n //上下线交点分别只有一个才求平均值\r\n if (upperIntersectionPoint.length == 1 && lowerIntersectionPoint.length == 1) {\r\n const avg = ((upperIntersectionPoint[0][0] + lowerIntersectionPoint[0][0]) / 2).toFixed(2);\r\n const avgXIndex = arrX.findIndex((n) => n == avg);\r\n // console.log('输出:', avg, avgXIndex);\r\n //输出\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, avg);\r\n }\r\n }\r\n lineData.push([\r\n {\r\n coord: [avg, yAxisMin],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [avg, arrY[avgXIndex]],\r\n },\r\n ]);\r\n pointData.push({\r\n xAxis: avg,\r\n yAxis: yAxisMin,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'a4';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n });\r\n }\r\n }\r\n\r\n if (upperLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, upperLimit],\r\n lineStyle: {\r\n color: '#333', //上限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, upperLimit],\r\n },\r\n ]);\r\n }\r\n\r\n if (lowerLimit != null) {\r\n lineData.push([\r\n {\r\n coord: [xAxisMin, lowerLimit],\r\n lineStyle: {\r\n color: '#333', //下限\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: [xAxisMax, lowerLimit],\r\n },\r\n ]);\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineJson[0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 沥青混合料-目标配合比设计-汇总\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart16: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineJson = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n // let lines = [\r\n // \t[3.5, 5.5],\r\n // \t[3.5, 5.5],\r\n // \t[4.21, 5.27],\r\n // \t[3.5, 5.5],\r\n // \t[3.5, 5.5],\r\n // \t[4.01, 5.03],\r\n // ],\r\n\r\n //原始数据\r\n let lines = [\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[0].row, chartExtJson.lqhhlHz[0].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[1].row, chartExtJson.lqhhlHz[1].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[2].row, chartExtJson.lqhhlHz[2].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[3].row, chartExtJson.lqhhlHz[3].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[4].row, chartExtJson.lqhhlHz[4].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[5].row, chartExtJson.lqhhlHz[5].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[6].row, chartExtJson.lqhhlHz[6].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[7].row, chartExtJson.lqhhlHz[7].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[8].row, chartExtJson.lqhhlHz[8].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[9].row, chartExtJson.lqhhlHz[9].col),\r\n ],\r\n [\r\n sheet.getValue(chartExtJson.lqhhlHz[10].row, chartExtJson.lqhhlHz[10].col),\r\n sheet.getValue(chartExtJson.lqhhlHz[11].row, chartExtJson.lqhhlHz[11].col),\r\n ],\r\n ],\r\n xData = xDataArr[0], // [3.5, 4, 4.5, 5, 5.5],\r\n xAxisMax = 5.5,\r\n xAxisMin = 3.5,\r\n yAxisMin = 0,\r\n yAxisMax = 6,\r\n yData = [0, 1, 2, 3, 4, 5, 6],\r\n yAxisData = ['VFA', 'VMA', '流值', '稳定度', '空隙率', '密度'],\r\n seriesData = [],\r\n showLine = true; //是否显示辅助线\r\n\r\n const title = 'OAC',\r\n xName = '油石比(%)',\r\n yName = 'VFA(%)',\r\n legendName = '图例1';\r\n let lineData = [];\r\n let pointData = [];\r\n let xMin = Math.max(...lines.map((item) => item[0]));\r\n let xMax = Math.min(...lines.map((item) => item[1]));\r\n\r\n lines.forEach((item, index) => {\r\n lineData.push([\r\n {\r\n coord: [item[0], lines.length - index],\r\n lineStyle: {\r\n color: lineJson[0].lineColor,\r\n type: 'solid',\r\n width: 2,\r\n },\r\n },\r\n {\r\n coord: [item[1], lines.length - index],\r\n },\r\n ]);\r\n });\r\n if (showLine && xMin <= xMax) {\r\n //最小\r\n lineData.push([\r\n {\r\n coord: [xMin, 0],\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed',\r\n width: 2,\r\n },\r\n },\r\n {\r\n coord: [xMin, 6],\r\n },\r\n ]);\r\n //最大\r\n lineData.push([\r\n {\r\n coord: [xMax, 0],\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed',\r\n width: 2,\r\n },\r\n },\r\n {\r\n coord: [xMax, 6],\r\n },\r\n ]);\r\n pointData = [\r\n {\r\n xAxis: xMin,\r\n yAxis: 0,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'OACmin';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n {\r\n xAxis: xMax,\r\n yAxis: 0,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'OACmax';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ];\r\n }\r\n\r\n if (xMin <= xMax) {\r\n //平均值\r\n const avg = (xMin + xMax) / 2;\r\n lineData.push([\r\n {\r\n coord: [avg, 0],\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed',\r\n width: 2,\r\n },\r\n },\r\n {\r\n coord: [avg, 6],\r\n },\r\n ]);\r\n pointData.push({\r\n xAxis: avg,\r\n yAxis: 0,\r\n symbolOffset: [0, 40],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n return 'OAC2';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n });\r\n }\r\n\r\n if (isNaN(xMin)) {\r\n xMin = 0;\r\n }\r\n if (isNaN(xMax)) {\r\n xMax = 0;\r\n }\r\n // console.log('输出:', xMin, xMax);\r\n //输出\r\n if (chartExtJson != null) {\r\n if (chartExtJson.lqhhlSc1 != null && chartExtJson.lqhhlSc1 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc1.row, chartExtJson.lqhhlSc1.col, xMin);\r\n }\r\n if (chartExtJson.lqhhlSc2 != null && chartExtJson.lqhhlSc2 != undefined) {\r\n sheet.setValue(chartExtJson.lqhhlSc2.row, chartExtJson.lqhhlSc2.col, xMax);\r\n }\r\n }\r\n\r\n //判断数据是否为/\r\n let yValIsAllNull = false;\r\n lines.forEach((item) => {\r\n yValIsAllNull = item.every((ele) => {\r\n return ele == '/';\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 10,\r\n right: 10,\r\n bottom: !yValIsAllNull ? 16 : 20,\r\n containLabel: true,\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n axisLabel: {\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n if (data == 0) {\r\n return '';\r\n } else {\r\n return yAxisData[data - 1];\r\n }\r\n },\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n // data: seriesData,\r\n markPoint: {\r\n data: pointData,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'], //去掉箭头\r\n data: lineData,\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 击实\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart30: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n //设置是否选择校正jsIsJz的默认值\r\n if (chartExtJson != null && (chartExtJson.jsIsJz == null || chartExtJson.jsIsJz == undefined)) {\r\n chartExtJson.jsIsJz = true;\r\n }\r\n // console.log(config);\r\n\r\n let isTwoLine = xDataArr.length == 2;\r\n\r\n let xDataSource1 = xDataArr[0], // [1.6, 2.4, 3.5, 4.6, 5.3],\r\n xDataSource2 = isTwoLine ? xDataArr[1] : [], // [1.5, 2.4, 3.6, 4.3, 5.4],\r\n yDataSource1 = yDataArr[0], // [2.25, 2.29, 2.34, 2.29, 2.23],\r\n yDataSource2 = isTwoLine ? yDataArr[1] : []; // [2.27, 2.32, 2.36, 2.33, 2.26];\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n const lineFunc = (xDataSource, yDataSource, isShowMarkPoint, isShowMarkLine, isTwoLineData) => {\r\n //原始数据\r\n let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5,\r\n xData = [],\r\n yData = [],\r\n seriesData = []; //处理原始数据为空的值,不然参与mathjs计算会报错\r\n\r\n //处理原始数据为空的值,不然参与mathjs计算会报错\r\n xDataSource.forEach((item, index) => {\r\n if (\r\n /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(item) &&\r\n item != 0 &&\r\n /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(yDataSource[index]) &&\r\n yDataSource[index] != 0\r\n ) {\r\n xData.push(item);\r\n yData.push(yDataSource[index]);\r\n }\r\n });\r\n\r\n //y轴没有任何数据的时候,不参与绘制图表\r\n if (yData.length == 0) {\r\n return;\r\n }\r\n\r\n if (dxsJs >= yData.length) {\r\n dxsJs = yData.length - 1;\r\n }\r\n\r\n let xMin = Math.min(...xData),\r\n xMax = Math.max(...xData),\r\n yMin = Math.min(...yData),\r\n yMax = Math.max(...yData),\r\n xAxisMax = Math.ceil(xMax + 0.1),\r\n xAxisMin = Math.trunc(xMin - 0.1),\r\n yAxisMax = Number(EChartsUtilsComm.getRound(yMax + 0.02, 0.01)),\r\n yAxisMin = Number(EChartsUtilsComm.getRound(yMin - 0.02, 0.01));\r\n\r\n //如果界面设置了校正最佳含水率和最大干密度,则显示界面中的顶点坐标(此时就不显示辅助线了)\r\n let cellValJzZjhsl, cellValJzZdgmd;\r\n if (chartExtJson != null && chartExtJson.jsIsJz) {\r\n if (chartExtJson.jsZjhslJz != null && chartExtJson.jsZjhslJz != undefined) {\r\n cellValJzZjhsl = sheet.getValue(chartExtJson.jsZjhslJz.row, chartExtJson.jsZjhslJz.col);\r\n }\r\n if (chartExtJson.jsZdgmdJz != null && chartExtJson.jsZdgmdJz != undefined) {\r\n cellValJzZdgmd = sheet.getValue(chartExtJson.jsZdgmdJz.row, chartExtJson.jsZdgmdJz.col);\r\n }\r\n\r\n //如果界面输入的最大干密度大于了y轴最大值,则需要重新设置y轴的最大值\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(cellValJzZdgmd) && cellValJzZdgmd > yAxisMax) {\r\n yAxisMax = Number(EChartsUtilsComm.getRound(cellValJzZdgmd + 0.02, 0.01));\r\n }\r\n }\r\n\r\n let points = [];\r\n xData.forEach((item, index) => {\r\n points.push([item, yData[index]]);\r\n });\r\n\r\n // 构造范德蒙德矩阵的函数\r\n function vandermondeMatrix(x, N) {\r\n const matrix = [];\r\n for (let i = 0; i < x.length; i++) {\r\n const row = [];\r\n for (let j = 0; j <= N; j++) {\r\n // 注意这里从0到N,包含N\r\n row.push(math.pow(x[i], j));\r\n }\r\n matrix.push(row);\r\n }\r\n return math.matrix(matrix);\r\n }\r\n\r\n // 构造原始的范德蒙德矩阵\r\n const vandermonde_matrix = vandermondeMatrix(xData, dxsJs); // 注意这里N=4,因为我们从0开始计数\r\n\r\n // 使用最小二乘法求解\r\n const A = vandermonde_matrix;\r\n const AT = math.transpose(A);\r\n const ATA = math.multiply(AT, A);\r\n\r\n const ATb = math.multiply(AT, math.matrix(yData));\r\n\r\n // 解线性方程组\r\n let result: any = null,\r\n coefficients: any = [];\r\n try {\r\n result = math.lusolve(ATA, ATb);\r\n coefficients = result.valueOf();\r\n } catch (err) {\r\n for (let index = 0; index < xData.length; index++) {\r\n coefficients.push([0]);\r\n }\r\n // console.log('无法解决该线性系统');\r\n }\r\n // const result = math.lusolve(ATA, ATb);\r\n // const coefficients = result.valueOf();\r\n\r\n function funequation(x) {\r\n let y = 0;\r\n coefficients.forEach((item, index) => {\r\n //fx^0\r\n //fx^0+ax^1\r\n //fx^0+ax^1+bx^2\r\n //fx^0+ax^1+bx^2+cx^3\r\n //fx^0+x^1+x^2+x^3+x^4\r\n y += item * x ** index;\r\n });\r\n return y;\r\n }\r\n\r\n // console.log('计算公式:', coefficients);\r\n\r\n function lagrangeInterpolation(points, x) {\r\n let result = 0;\r\n for (let i = 0; i < points.length; i++) {\r\n let term = points[i][1];\r\n let xi = points[i][0];\r\n for (let j = 0; j < points.length; j++) {\r\n if (j !== i) {\r\n let xj = points[j][0];\r\n term *= (x - xj) / (xi - xj);\r\n }\r\n }\r\n result += term;\r\n }\r\n return result;\r\n }\r\n // x=[3.5, 4, 4.5, 5, 5.5,6 ],y= [2.262, 2.321, 2.319, 2.292, 2.285, 2.28]\r\n\r\n let arrX = [];\r\n let arrY = [];\r\n for (let i = xMin; i <= xMax; i += 0.01) {\r\n let temp = Number(EChartsUtilsComm.getRound(i, 0.01));\r\n //重新设置i,防止i丢失精度\r\n i = Number(temp);\r\n //arrY.push(lagrangeInterpolation(points, temp));\r\n arrY.push(funequation(temp));\r\n arrX.push(temp);\r\n }\r\n let max = Math.max(...arrY);\r\n\r\n // 找到最大值的索引\r\n let maxIndex = arrY.findIndex((value) => value === max);\r\n\r\n // console.log('最大点数据:', arrX[maxIndex], max);\r\n // console.log(chartExtJson);\r\n\r\n //默认输出精度\r\n let outJdZjhsl = 0.01,\r\n outJdZdgmd = 0.001;\r\n\r\n //顶点数据\r\n let outValZjhsl = 0,\r\n outValZdgmd = 0;\r\n\r\n //设置Sheet单元格的值(最佳含水率和最大干密度)\r\n if (chartExtJson != null) {\r\n // console.log(4444, chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, arrX[maxIndex]);\r\n\r\n if (chartExtJson.jsZjhslJd != null && chartExtJson.jsZjhslJd != undefined) {\r\n outJdZjhsl = chartExtJson.jsZjhslJd;\r\n }\r\n if (chartExtJson.jsZdgmdJd != null && chartExtJson.jsZdgmdJd != undefined) {\r\n outJdZdgmd = chartExtJson.jsZdgmdJd;\r\n }\r\n\r\n if (arrX[maxIndex] == 0 && max == 0) {\r\n sheet.setValue(chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, '/');\r\n sheet.setValue(chartExtJson.jsZdgmd.row, chartExtJson.jsZdgmd.col, '/');\r\n } else {\r\n outValZjhsl = EChartsUtilsComm.getRound(arrX[maxIndex], outJdZjhsl);\r\n outValZdgmd = EChartsUtilsComm.getRound(max, outJdZdgmd);\r\n\r\n sheet.setValue(chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, outValZjhsl);\r\n sheet.setValue(chartExtJson.jsZdgmd.row, chartExtJson.jsZdgmd.col, outValZdgmd);\r\n }\r\n }\r\n\r\n arrX.forEach((item, index) => {\r\n if (xData.includes(item)) {\r\n seriesData.push({ value: [item, arrY[index]] });\r\n } else {\r\n seriesData.push({\r\n value: [item, arrY[index]],\r\n symbol: 'none',\r\n });\r\n }\r\n });\r\n\r\n //xData.forEach((item, index) => {\r\n //seriesData.push([item, yData[index]]);\r\n //});\r\n\r\n //计算峰值----目前没有公式 值写死的\r\n const peakvalue = [arrX[maxIndex], Number(EChartsUtilsComm.getRound(max, outJdZdgmd))],\r\n coordX = [peakvalue[0], yAxisMin],\r\n coordY = [xAxisMin, peakvalue[1]];\r\n\r\n let markPointObj = {\r\n data: [\r\n {\r\n xAxis: EChartsUtilsComm.getRound(peakvalue[0], outJdZjhsl),\r\n yAxis: EChartsUtilsComm.getRound(peakvalue[1], outJdZdgmd),\r\n symbolOffset: [0, 15],\r\n symbol: 'circle',\r\n symbolSize: 6,\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n // 自定义标签内容\r\n if (Number(data.data.xAxis) == 0 && Number(data.data.yAxis) == 0) {\r\n return '';\r\n } else {\r\n return '( ' + data.data.xAxis + ',' + data.data.yAxis + ')';\r\n }\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ],\r\n },\r\n markLineObj = {\r\n symbol: ['none', 'none'], //去掉箭头\r\n itemStyle: {\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n width: 2,\r\n },\r\n },\r\n data: [\r\n [\r\n {\r\n coord: coordX,\r\n lineStyle: {\r\n color: '#333', //X轴\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: peakvalue,\r\n },\r\n ],\r\n [\r\n {\r\n coord: coordY,\r\n lineStyle: {\r\n color: '#333', //y轴\r\n type: 'dashed',\r\n },\r\n },\r\n {\r\n coord: peakvalue,\r\n },\r\n ],\r\n ],\r\n };\r\n\r\n //如果界面设置了校正最佳含水率和最大干密度,则显示界面中的顶点坐标(此时就不显示辅助线了)\r\n if (chartExtJson.jsIsJz && /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(cellValJzZjhsl) && /^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(cellValJzZdgmd)) {\r\n markLineObj = null;\r\n markPointObj.data[0].label = null;\r\n markPointObj.data[0].symbolOffset = null;\r\n markPointObj.data[0].itemStyle.color = '#F56C6C';\r\n markPointObj.data[0].xAxis = cellValJzZjhsl;\r\n markPointObj.data[0].yAxis = cellValJzZdgmd;\r\n markLineObj = null;\r\n }\r\n\r\n let seriesDataObj = {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[isTwoLineData ? 1 : 0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: isTwoLineData ? 'dotted' : 'solid',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[isTwoLineData ? 1 : 0].lineColor,\r\n },\r\n data: seriesData,\r\n markPoint: isShowMarkPoint ? markPointObj : null,\r\n markLine: isShowMarkLine ? markLineObj : null,\r\n };\r\n\r\n return {\r\n xAxisMin: xAxisMin,\r\n xAxisMax: xAxisMax,\r\n yAxisMin: yAxisMin,\r\n yAxisMax: yAxisMax,\r\n xData: xData,\r\n seriesDataObj: seriesDataObj,\r\n maxPointData: [arrX[maxIndex], max],\r\n };\r\n };\r\n\r\n let xAxisMin = 0,\r\n xAxisMax = 0,\r\n yAxisMin = 0,\r\n yAxisMax = 0,\r\n xData = [],\r\n seriesData = [],\r\n maxPointDataX = 0,\r\n maxPointDataY = 0;\r\n\r\n let lineObj1 = lineFunc(xDataSource1, yDataSource1, !isTwoLine, !isTwoLine, false),\r\n lineObj2;\r\n if (isTwoLine) {\r\n lineObj2 = lineFunc(xDataSource2, yDataSource2, false, false, true);\r\n }\r\n\r\n //此处的作用是,有可能x和y轴的数据都为空,造成lineObj1为undefined,避免报错\r\n if (lineObj1 == undefined || lineObj1 == null) {\r\n return;\r\n }\r\n\r\n //一条线的时候\r\n if (!isTwoLine) {\r\n xAxisMin = lineObj1.xAxisMin;\r\n xAxisMax = lineObj1.xAxisMax;\r\n yAxisMin = lineObj1.yAxisMin;\r\n yAxisMax = lineObj1.yAxisMax;\r\n xData = lineObj1.xData;\r\n seriesData.push(lineObj1.seriesDataObj);\r\n }\r\n //2条线的时候\r\n else {\r\n if (lineObj2 == undefined || lineObj2 == null) {\r\n return;\r\n }\r\n\r\n xAxisMax = lineObj1.xAxisMax;\r\n if (lineObj2.xAxisMax > xAxisMax) {\r\n xAxisMax = lineObj2.xAxisMax;\r\n }\r\n xAxisMin = lineObj1.xAxisMin;\r\n if (lineObj2.xAxisMin < xAxisMin) {\r\n xAxisMin = lineObj2.xAxisMin;\r\n }\r\n yAxisMax = lineObj1.yAxisMax;\r\n if (lineObj2.yAxisMax > yAxisMax) {\r\n yAxisMax = lineObj2.yAxisMax;\r\n }\r\n yAxisMin = lineObj1.yAxisMin;\r\n if (lineObj2.yAxisMin < yAxisMin) {\r\n yAxisMin = lineObj2.yAxisMin;\r\n }\r\n\r\n lineObj1.xData.forEach((item) => {\r\n xData.push(item);\r\n });\r\n lineObj2.xData.forEach((item) => {\r\n xData.push(item);\r\n });\r\n\r\n seriesData.push(lineObj1.seriesDataObj);\r\n seriesData.push(lineObj2.seriesDataObj);\r\n\r\n maxPointDataX = (lineObj1.maxPointData[0] + lineObj2.maxPointData[0]) / 2;\r\n maxPointDataY = (lineObj1.maxPointData[1] + lineObj2.maxPointData[1]) / 2;\r\n\r\n // console.log(\r\n // \t\"两条线最大点的平均值:\",\r\n // \tmaxPointDataX,\r\n // \tmaxPointDataY\r\n // );\r\n\r\n //默认输出精度\r\n let outJdZjhsl = 0.01,\r\n outJdZdgmd = 0.001;\r\n\r\n //顶点数据\r\n let outValZjhsl = 0,\r\n outValZdgmd = 0;\r\n\r\n //设置Sheet单元格的值(最佳含水率和最大干密度)\r\n if (chartExtJson != null) {\r\n // console.log(4444, chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, arrX[maxIndex]);\r\n\r\n if (chartExtJson.jsZjhslJd != null && chartExtJson.jsZjhslJd != undefined) {\r\n outJdZjhsl = chartExtJson.jsZjhslJd;\r\n }\r\n if (chartExtJson.jsZdgmdJd != null && chartExtJson.jsZdgmdJd != undefined) {\r\n outJdZdgmd = chartExtJson.jsZdgmdJd;\r\n }\r\n\r\n if (maxPointDataX == 0 && maxPointDataY == 0) {\r\n sheet.setValue(chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, '/');\r\n sheet.setValue(chartExtJson.jsZdgmd.row, chartExtJson.jsZdgmd.col, '/');\r\n } else {\r\n outValZjhsl = EChartsUtilsComm.getRound(maxPointDataX, outJdZjhsl);\r\n outValZdgmd = EChartsUtilsComm.getRound(maxPointDataY, outJdZdgmd);\r\n\r\n sheet.setValue(chartExtJson.jsZjhsl.row, chartExtJson.jsZjhsl.col, outValZjhsl);\r\n sheet.setValue(chartExtJson.jsZdgmd.row, chartExtJson.jsZdgmd.col, outValZdgmd);\r\n }\r\n }\r\n }\r\n\r\n //判断数据是否为/,‘’,null,undefined\r\n let yValIsAllNull = false;\r\n seriesData.forEach((item) => {\r\n yValIsAllNull = item.data[0].value.every((ele) => {\r\n return ele == 0;\r\n });\r\n });\r\n if (yValIsAllNull) {\r\n xAxisMin = null;\r\n xAxisMax = null;\r\n yAxisMin = null;\r\n yAxisMax = null;\r\n seriesData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n //console.log(datas,\" datas\")\r\n return datas && datas.length > 0\r\n ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + Number(EChartsUtilsComm.getRound(datas[0].value[1], 0.001))\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n max: xAxisMax,\r\n min: xAxisMin,\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n max: yAxisMax,\r\n min: yAxisMin,\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 40 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: seriesData,\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 筛分\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart50: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = '', //config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName;\r\n\r\n // x轴原始数据、y轴原始数据、y轴原始数据(上限)、y轴原始数据(下限)\r\n const xDataSourceOld = xDataArr[0],\r\n yDataSourceOld = yDataArr[0],\r\n yDataSourceSxOld = yDataArr[1],\r\n yDataSourceXxOld = yDataArr[2];\r\n const allData: any[] = [];\r\n xDataSourceOld.forEach((item, index) => {\r\n allData.push({\r\n x: item,\r\n y: yDataSourceOld[index],\r\n ySx: yDataSourceSxOld[index],\r\n yXx: yDataSourceXxOld[index],\r\n });\r\n });\r\n allData.sort(function (a, b) {\r\n return a.x - b.x;\r\n });\r\n\r\n const xDataSource: any[] = [],\r\n yDataSource: any[] = [],\r\n yDataSourceSx: any[] = [],\r\n yDataSourceXx: any[] = [];\r\n\r\n // 记录上限或下限中值为null的个数\r\n let sxValNullCount = 0;\r\n yDataSourceSxOld.forEach((item, index) => {\r\n if (item == null || item == '/') {\r\n sxValNullCount++;\r\n }\r\n });\r\n\r\n // 如果上限或下限值中的所有值都为null,则只展示筛分曲线的折线\r\n if (sxValNullCount == yDataSourceSxOld.length) {\r\n allData.forEach((item, index) => {\r\n xDataSource.push(item.x);\r\n yDataSource.push(item.y);\r\n yDataSourceSx.push(item.ySx);\r\n yDataSourceXx.push(item.yXx);\r\n });\r\n } else {\r\n // 只获取上限或下限中值不为null的点\r\n allData.forEach((item, index) => {\r\n if (item.ySx != null && item.ySx != '/' && item.yXx != null && item.yXx != '/') {\r\n xDataSource.push(item.x);\r\n yDataSource.push(item.y);\r\n yDataSourceSx.push(item.ySx);\r\n yDataSourceXx.push(item.yXx);\r\n }\r\n });\r\n }\r\n\r\n // x轴需要的数据(x轴原始数据的0.45次方,并修约0.01)、x轴需要的上限数据(x轴原始数据的0.45次方,并修约0.01)、x轴需要的下限数据(x轴原始数据的0.45次方,并修约0.01)、标记线需要的数据\r\n let xData: any[] = [],\r\n xDataSx: any[] = [],\r\n xDataXx: any[] = [],\r\n markLineData: any[] = [];\r\n\r\n // x和y轴的字体大小\r\n const xyFontSize = 10;\r\n\r\n // 组装数据\r\n xDataSource.forEach((item, index) => {\r\n // 得到x轴原始数据的0.45次方值,并修约0.001\r\n const val045 = Number(EChartsUtilsComm.getRound(item ** 0.45, 0.001));\r\n\r\n xData.push([val045, yDataSource[index]]);\r\n markLineData.push({\r\n name: item + '',\r\n xAxis: val045,\r\n label: {\r\n show: xDataSource.length >= 6 && index % 2 != 0 && index < 6 ? false : true, // 控制x轴的名称某些点是否显示,避免重叠的情况\r\n fontSize: xyFontSize,\r\n },\r\n });\r\n\r\n xDataSx.push([val045, yDataSourceSx[index]]);\r\n xDataXx.push([val045, yDataSourceXx[index]]);\r\n });\r\n\r\n /**\r\n * 获取series需要的3条线配置\r\n * @param type 线类型(1:筛分曲线、2:上限、3:下限)\r\n * @param data 对应的坐标点数据\r\n */\r\n const getLineObj = (type, data) => {\r\n const name = type == 1 ? '筛分曲线' : type == 2 ? '上限' : '下限';\r\n const symbol = type == 1 ? 'rect' : type == 2 ? 'triangle' : 'circle';\r\n const lineType = type == 1 ? 'solid' : type == 2 ? 'dotted' : [10, 5];\r\n const color = type == 1 ? lineData[0].lineColor : type == 2 ? lineData[1].lineColor : lineData[2].lineColor; //type == 1 ? '#F56C6C' : type == 2 ? '#409EFF' : '#000';\r\n\r\n let obj = {\r\n name: name,\r\n type: 'line',\r\n smooth: true, // 平滑的线条\r\n // 设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: symbol,\r\n symbolSize: 5,\r\n z: 10, // 控制曲线的浮动层级,避免在markLine下方被遮住\r\n // 线条的颜色\r\n lineStyle: {\r\n color: color,\r\n // 线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: lineType,\r\n },\r\n // 线条上数据点的颜色\r\n itemStyle: {\r\n color: color,\r\n },\r\n data: data,\r\n connectNulls: true, // 是否连接空数据\r\n markLine: {\r\n symbol: '', // 取消箭头\r\n silent: true, // 取消鼠标hover事件\r\n label: {\r\n // 标线的文本,模拟x轴显示的内容\r\n position: 'start', // 改变label位置\r\n //rotate: 45, // 设置文字旋转度数(注意:ECharts官网文档居然没有rotate这个属性的说明)\r\n // backgroundColor:'#fff'\r\n // color:'#f00',// 文字颜色\r\n formatter: (data) => {\r\n return data.name;\r\n },\r\n },\r\n lineStyle: { color: '#e0e6f1', type: 'solid' },\r\n data: markLineData,\r\n },\r\n };\r\n\r\n return obj;\r\n };\r\n\r\n // 验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (\r\n yDataSourceSxOld.some((item) => item != null && item != undefined && item != '/') ||\r\n yDataSourceXxOld.some((item) => item != null && item != undefined && item != '/')\r\n ) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,// 是否显示外边框线\r\n // borderColor: '#f00',// 外边框线颜色\r\n top: 20,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 35,\r\n containLabel: true,\r\n },\r\n // 提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n if (datas && datas[0].data.length > 1) {\r\n let xObj = markLineData.filter((item) => item.xAxis == datas[0].data[0]);\r\n\r\n return datas[0].seriesName + '(' + xObj[0].name + ')' + ':' + datas[0].data[1];\r\n } else {\r\n return datas[0].data;\r\n }\r\n },\r\n },\r\n // 顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 5,\r\n textStyle: {\r\n fontSize: 18,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n // 图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n left: 'center',\r\n data: ['筛分曲线', '上限', '下限'],\r\n selected: {\r\n 筛分曲线: true, // 显示\r\n 上限: true, // 显示\r\n 下限: true, // 显示\r\n },\r\n selectedMode: 'multiple', // 用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n axisTick: { show: false }, // 隐藏刻度线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n // 网格线,参考文档:https://echarts.apache.org/zh/option.html#xAxis.splitLine\r\n splitLine: {\r\n show: false, // 隐藏分割线\r\n },\r\n min: xData.length > 0 ? (xData[0][0] > 0.2 ? xData[0][0] - 0.2 : 0) : null, //控制x轴的最小值\r\n max: xData.length > 0 ? xData[xData.length - 1][0] + 0.1 : null,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', // '#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n splitNumber: 10, // 设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLabel: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n ],\r\n series: [getLineObj(1, xData), getLineObj(2, xDataSx), getLineObj(3, xDataXx)],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 界限含水率\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart70: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n //此图形排除了图形数据不正确的情况,如果数据不对,则直接返回{}\r\n if (\r\n xDataArr[0].some((item) => item == null || item == '' || item == undefined) ||\r\n yDataArr[0].some((item) => item == null || item == '' || item == undefined)\r\n ) {\r\n return {};\r\n }\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0], // [22.9, 32.4, 36.9],\r\n yData = yDataArr[0], // [2.2, 11.6, 19.8],\r\n ztzl = 100, //锥体质量(g),100或76\r\n cllx = '砂类土', //材料类型,砂类土或细粒土\r\n logx = [], // c,b,a\r\n logy = [];\r\n\r\n //获取锥体质量和材料类型\r\n if (chartExtJson != null) {\r\n let curZtzl = sheet.getValue(chartExtJson.jxhslZtzl.row, chartExtJson.jxhslZtzl.col),\r\n curCllx = sheet.getValue(chartExtJson.jxhslCllx.row, chartExtJson.jxhslCllx.col);\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curZtzl)) {\r\n curZtzl = Number(curZtzl);\r\n if (curZtzl == 100 || curZtzl == 76) {\r\n ztzl = curZtzl;\r\n }\r\n }\r\n if (curCllx == '砂类土' || curCllx == '细粒土') {\r\n cllx = curCllx;\r\n }\r\n }\r\n\r\n // console.log(ztzl, cllx);\r\n\r\n //先求对数\r\n for (const item1 of xData) {\r\n logx.push(Math.log(item1));\r\n }\r\n for (const item2 of yData) {\r\n logy.push(Math.log(item2));\r\n }\r\n //求ab / ac 斜率 公式k=y2-y1 / x2-x1\r\n let abk = (logy[2] - logy[1]) / (logx[2] - logx[1]);\r\n let ack = (logy[2] - logy[0]) / (logx[2] - logx[0]);\r\n\r\n const xMax = Math.max.apply(Math, xData),\r\n xMin = Math.min.apply(Math, xData),\r\n xAxisMax = xMax + 1,\r\n xAxisMin = xMin - 0.3,\r\n yMax = Math.max.apply(Math, yData),\r\n yMin = Math.min.apply(Math, yData),\r\n yAxisMax = yMax + 1,\r\n yAxisMin = yMin - 2,\r\n dropName = ['C', 'B', 'A'],\r\n seriesData = [];\r\n\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index], dropName[index]]);\r\n });\r\n\r\n //求ab / ac 延长线方法\r\n function getYOnLine(point1, point2, point3X) {\r\n const logX1 = Math.log(point1[0]);\r\n const logY1 = Math.log(point1[1]);\r\n const logX2 = Math.log(point2[0]);\r\n const logY2 = Math.log(point2[1]);\r\n const slope = (logY2 - logY1) / (logX2 - logX1);\r\n const logPoint3X = Math.log(point3X);\r\n const logY = logY1 + slope * (logPoint3X - logX1);\r\n return Math.exp(logY);\r\n }\r\n\r\n let point3X = 20;\r\n let abd3 = getYOnLine([xData[2], yData[2]], [xData[1], yData[1]], point3X);\r\n let zero_ab = [20, abd3];\r\n let acd3 = getYOnLine([xData[2], yData[2]], [xData[0], yData[0]], point3X);\r\n let zero_ac = [20, acd3];\r\n\r\n // console.log(zero_ab, 'zero_ab');\r\n // console.log(zero_ac, 'zero_ac');\r\n\r\n //第一次计算D-y值,代入A点的X坐标\r\n function HpCoordinates(wl) {\r\n let hp;\r\n if (cllx == '砂类土') {\r\n //砂类土\r\n hp = 29.6 - 1.22 * wl + 0.017 * wl * wl - 0.0000744 * wl * wl * wl;\r\n } else {\r\n //细粒土\r\n hp = wl / (0.524 * wl - 7.606);\r\n }\r\n return hp;\r\n }\r\n\r\n let coordX = [];\r\n let coordY = [];\r\n let point_hp = [];\r\n\r\n let Dy = HpCoordinates(xData[2]);\r\n let Dylog = Math.log(Dy);\r\n let hp0_xab = (abk * logx[2] - (logy[2] - Dylog)) / abk;\r\n let hp0_xac = (ack * logx[2] - (logy[2] - Dylog)) / ack;\r\n if (hp0_xab - hp0_xac >= 2) {\r\n //return '超差!';\r\n }\r\n let hp0_xcenter = Math.exp((hp0_xab + hp0_xac) / 2);\r\n let Dxlog = Math.log(hp0_xcenter);\r\n let adk = (logy[2] - Dylog) / (logx[2] - Dxlog); //AD 斜率\r\n\r\n //输出的hp、wl和wp\r\n let scHp, scWl, scWp;\r\n\r\n //判断锥数\r\n if (ztzl == 76) {\r\n //计算wl ad直线上y=17时,对应的x值\r\n let wly = Math.log(17);\r\n let wlx = (adk * logx[2] - (logy[2] - wly)) / adk;\r\n let wl = Math.exp(wlx);\r\n\r\n //计算WP:ad直线上y=2时,对应的x值\r\n let wpy = Math.log(2);\r\n let wpx = (adk * logx[2] - (logy[2] - wpy)) / adk;\r\n let wp = Math.exp(wpx);\r\n\r\n point_hp = [hp0_xcenter, Dy];\r\n coordX = [hp0_xcenter, yAxisMin];\r\n coordY = [xAxisMin, Dy];\r\n seriesData.push([hp0_xcenter, Dy, 'Hp']);\r\n\r\n scHp = Dy;\r\n scWl = wl;\r\n scWp = wp;\r\n // console.log('输出:', wp, wl, Dy);\r\n } else if (ztzl == 100) {\r\n //计算wl的值----先求AD斜率再代入y=20,求X (X即Wl的值)\r\n let wly = Math.log(20);\r\n let wlx = (adk * logx[2] - (logy[2] - wly)) / adk;\r\n let wl = Math.exp(wlx);\r\n\r\n //第二次计算hp值\r\n let hpy2 = HpCoordinates(wl);\r\n let hpylog2 = Math.log(hpy2);\r\n let hp0_xab2 = (abk * logx[2] - (logy[2] - hpylog2)) / abk;\r\n let hp0_xac2 = (ack * logx[2] - (logy[2] - hpylog2)) / ack;\r\n\r\n let hp0_xcenter2 = Math.exp((hp0_xab2 + hp0_xac2) / 2);\r\n let wp = hp0_xcenter2;\r\n\r\n point_hp = [hp0_xcenter2, hpy2];\r\n\r\n coordX = [hp0_xcenter2, yAxisMin];\r\n coordY = [xAxisMin, hpy2];\r\n seriesData.push([hp0_xcenter2, hpy2, 'Hp']);\r\n\r\n scHp = hpy2;\r\n scWl = wl;\r\n scWp = wp;\r\n // console.log('输出:', wp, wl, hpy2);\r\n }\r\n\r\n //判断是否是一个数字\r\n if (isNaN(scHp) || isNaN(scWl) || isNaN(scWp)) {\r\n scHp = 0;\r\n scWl = 0;\r\n scWp = 0;\r\n }\r\n\r\n //设置Sheet单元格的值(输出hp、wl和wp)\r\n if (chartExtJson != null) {\r\n //默认输出精度\r\n let outJdHp = 0.01,\r\n outJdWl = 0.01,\r\n outJdWp = 0.01;\r\n if (chartExtJson.jxhslScHpJd != null && chartExtJson.jxhslScHpJd != undefined) {\r\n outJdHp = chartExtJson.jxhslScHpJd;\r\n }\r\n if (chartExtJson.jxhslScWlJd != null && chartExtJson.jxhslScWlJd != undefined) {\r\n outJdWl = chartExtJson.jxhslScWlJd;\r\n }\r\n if (chartExtJson.jxhslScWpJd != null && chartExtJson.jxhslScWpJd != undefined) {\r\n outJdWp = chartExtJson.jxhslScWpJd;\r\n }\r\n\r\n if (chartExtJson.jxhslScHp != null && chartExtJson.jxhslScHp != undefined) {\r\n if (scHp == 0) {\r\n sheet.setValue(chartExtJson.jxhslScHp.row, chartExtJson.jxhslScHp.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.jxhslScHp.row, chartExtJson.jxhslScHp.col, EChartsUtilsComm.getRound(scHp, outJdHp));\r\n }\r\n }\r\n if (chartExtJson.jxhslScWl != null && chartExtJson.jxhslScWl != undefined) {\r\n if (scWl == 0) {\r\n sheet.setValue(chartExtJson.jxhslScWl.row, chartExtJson.jxhslScWl.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.jxhslScWl.row, chartExtJson.jxhslScWl.col, EChartsUtilsComm.getRound(scWl, outJdWl));\r\n }\r\n }\r\n if (chartExtJson.jxhslScWp != null && chartExtJson.jxhslScWp != undefined) {\r\n if (scWp == 0) {\r\n sheet.setValue(chartExtJson.jxhslScWp.row, chartExtJson.jxhslScWp.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.jxhslScWp.row, chartExtJson.jxhslScWp.col, EChartsUtilsComm.getRound(scWp, outJdWp));\r\n }\r\n }\r\n }\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (\r\n yData.some((item) => item != null && item != undefined && item != '/') ||\r\n yData.some((item) => item != null && item != undefined && item != '/')\r\n ) {\r\n yValIsAllNull = false;\r\n }\r\n let option = {\r\n grid: {\r\n top: 20,\r\n left: !yValIsAllNull ? 50 : 25,\r\n right: 10,\r\n bottom: 35,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + datas[0].value[1] : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'log',\r\n min: xAxisMin,\r\n max: xAxisMax,\r\n interval: 0,\r\n axisTick: {\r\n show: false,\r\n alignWithLabel: true,\r\n },\r\n splitLine: {\r\n show: false,\r\n },\r\n axisLabel: {\r\n show: false,\r\n },\r\n },\r\n yAxis: {\r\n type: 'log',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n min: yAxisMin,\r\n max: yAxisMax,\r\n interval: 0,\r\n axisTick: {\r\n show: false,\r\n alignWithLabel: true,\r\n },\r\n splitLine: {\r\n show: false,\r\n },\r\n axisLabel: {\r\n show: false,\r\n },\r\n },\r\n series: [\r\n {\r\n name: legendName,\r\n data: seriesData,\r\n type: 'scatter',\r\n symbol: 'circle',\r\n smooth: false,\r\n symbolSize: 6,\r\n label: {\r\n show: true,\r\n formatter: function (param) {\r\n return param.data[2];\r\n },\r\n position: 'right',\r\n minMargin: 2,\r\n },\r\n markLine: {\r\n symbol: ['none', 'none'],\r\n silent: true,\r\n label: {\r\n show: true,\r\n position: 'start',\r\n color: '#000000',\r\n },\r\n lineStyle: {\r\n type: 'solid',\r\n color: '#333',\r\n },\r\n data: [\r\n { xAxis: seriesData[0][0] },\r\n { xAxis: seriesData[1][0] },\r\n { xAxis: seriesData[2][0] },\r\n { yAxis: seriesData[0][1] },\r\n { yAxis: seriesData[1][1] },\r\n { yAxis: seriesData[2][1] },\r\n [\r\n {\r\n coord: coordX,\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed',\r\n },\r\n },\r\n { coord: point_hp }, //Hp---x\r\n ],\r\n [\r\n {\r\n coord: coordY,\r\n lineStyle: {\r\n color: '#333',\r\n type: 'dashed', //dashed dotted\r\n },\r\n },\r\n { coord: point_hp }, //Hp----y\r\n ],\r\n ],\r\n },\r\n },\r\n {\r\n //a-b连线\r\n type: 'line',\r\n data: [\r\n [xData[2], yData[2]],\r\n [xData[1], yData[1]],\r\n ],\r\n lineStyle: {\r\n color: '#0000FF',\r\n type: 'solid',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n {\r\n //a-b 延长线\r\n type: 'line',\r\n data: [\r\n [xData[1], yData[1]],\r\n [zero_ab[0], zero_ab[1]],\r\n ],\r\n lineStyle: {\r\n color: '#000000',\r\n type: 'dashed',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n {\r\n //a-c连线\r\n type: 'line',\r\n data: [\r\n [xData[2], yData[2]],\r\n [xData[0], yData[0]],\r\n ],\r\n lineStyle: {\r\n color: '#0000FF',\r\n type: 'solid',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n {\r\n //a-c 延长线\r\n type: 'line',\r\n data: [\r\n [xData[0], yData[0]],\r\n [zero_ac[0], zero_ac[1]],\r\n ],\r\n lineStyle: {\r\n color: '#000000',\r\n type: 'dashed',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n {\r\n //a-Hp连线\r\n type: 'line',\r\n data: [[xData[2], yData[2]], point_hp],\r\n lineStyle: {\r\n color: '#0000FF',\r\n type: 'solid',\r\n width: 1,\r\n },\r\n symbol: 'none',\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 水泥、石灰标准曲线\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart90: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n //y轴原始数据\r\n let yDataSource = yDataArr[0]; // [1.2, 5.6, 10.8, 16, 20.8];\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x轴的数据\r\n let xData = xDataArr[0]; // [0, 2, 4, 6, 8];\r\n\r\n //重新处理x轴和y轴的数据,排除x轴后面为0的数据(因为有可能在单元格中,最后一个单元格的值可能没有填,这时候默认传的是0)\r\n let xDataCl = [],\r\n yDataSourceCl = [];\r\n for (let i = 0; i < xData.length; i++) {\r\n if (xData[i] != '/' && (i == 0 || (i > 0 && xData[i] != 0))) {\r\n xDataCl.push(xData[i]);\r\n yDataSourceCl.push(yDataSource[i]);\r\n } else if (i > 0 && xData[i] == 0) {\r\n break;\r\n }\r\n }\r\n xData = xDataCl;\r\n yDataSource = yDataSourceCl;\r\n\r\n //series的data数据、series的markPoint的data数据、series的markLine的data数据\r\n let seriesData = [],\r\n markPointData = [],\r\n markLineData = [...xData];\r\n\r\n //此目的是显示更多的x轴数据\r\n //假设x轴原始数据为[0, 2, 4, 6, 8],在这个数组中没有1、3、5等数据,此时就可以通过下面的方式进行增加\r\n /*\r\n\t\tfor (let i = 0; i < 20; i++) {\r\n\t\t\tif (!markLineData.some((item) => item == i)) {\r\n\t\t\t\tmarkLineData.push(i);\r\n\t\t\t}\r\n\t\t}\r\n\t\t*/\r\n\r\n //获取y轴趋势公式对象\r\n const gsS = EChartsUtilsComm.calcTrend(xData, yDataSource, xData[0]);\r\n\r\n //输出方程表达式\r\n if (chartExtJson != null) {\r\n if (chartExtJson.jxhslSnShScfc != null && chartExtJson.jxhslSnShScfc != undefined) {\r\n // console.log('输出公式:',`Y=${getRound(gsS.xl,0.0001)}X+${getRound(gsS.jj,0.0001)}`)\r\n if (gsS.xl == '' || gsS.jj == '') {\r\n sheet.setValue(chartExtJson.jxhslSnShScfc.row, chartExtJson.jxhslSnShScfc.col, '/');\r\n } else {\r\n sheet.setValue(\r\n chartExtJson.jxhslSnShScfc.row,\r\n chartExtJson.jxhslSnShScfc.col,\r\n `Y=${EChartsUtilsComm.getRound(gsS.xl, 0.0001)}X+${EChartsUtilsComm.getRound(gsS.jj, 0.0001)}`\r\n );\r\n }\r\n }\r\n }\r\n\r\n let yDataCopy = [];\r\n //获取y轴原始数据对应的趋势数据\r\n xData.forEach((item, index) => {\r\n let curYData = Number(EChartsUtilsComm.getRound(eval(gsS.gs.replace('x', item + '')), 0.01));\r\n if (isNaN(curYData)) {\r\n curYData = 0;\r\n }\r\n\r\n seriesData.push([item, curYData]);\r\n yDataCopy.push(curYData);\r\n markPointData.push({\r\n xAxis: item,\r\n yAxis: yDataSource[index],\r\n symbol: 'circle',\r\n symbolSize: 6,\r\n });\r\n\r\n //console.log(curYData, \"curYData\")\r\n });\r\n\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == 0 || item[1] == null || item[1] == undefined) {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (yDataCopy.some((item) => item != 0 || item[1] == null || item[1] == undefined)) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 22,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 35,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].value[0] + ':' + datas[0].value[1] : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n splitLine: { show: false }, // 隐藏分割线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n opacity: 0,\r\n },\r\n data: seriesData,\r\n markPoint: {\r\n data: markPointData,\r\n },\r\n markLine: {\r\n symbol: false, //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n position: 'start', //改变label位置\r\n formatter: (obj) => obj.value, //格式化显示的x轴标签内容\r\n },\r\n lineStyle: { color: '#ddd', type: 'solid' },\r\n data: markLineData.map((val) => {\r\n return {\r\n xAxis: val,\r\n };\r\n }),\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 延迟时间-强度曲线\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart110: (\r\n config: EChartsUtilsConfigModel,\r\n xDataArr: Array<Array<any>>,\r\n yDataArr: Array<Array<any>>,\r\n xDataArrSource: Array<Array<any>>,\r\n yDataArrSource: Array<Array<any>>\r\n ) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n const xDataSource = xDataArrSource[0]; // ['0.0','1.0','2.0','3.0','4.0','5.0'];\r\n\r\n let xData = [];\r\n xDataSource.forEach((item, index) => {\r\n if (item == '/') {\r\n xData.push(item);\r\n } else {\r\n xData.push(Number(item));\r\n }\r\n });\r\n\r\n //y轴的数据\r\n let yData = yDataArr[0]; // [4.4,4.3,4.3,4.2,4.1,3.7];\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n if (item != '/' && item != undefined && item != null) {\r\n seriesData.push([item, yData[index]]);\r\n }\r\n });\r\n\r\n let yValIsAllNull = false;\r\n if (seriesData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 25,\r\n right: 15,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category', //设置x轴为对数坐标轴\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n let curXName = '';\r\n for (let i = 0; i < xData.length; i++) {\r\n if (xData[i] == value) {\r\n curXName = xDataSource[i];\r\n if (curXName == '/') {\r\n curXName = '';\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return curXName;\r\n },\r\n },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n },\r\n ],\r\n };\r\n return option;\r\n },\r\n /**\r\n * 颗粒组成(筛分法)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart130: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n // console.log(config);\r\n // console.log(xDataArr);\r\n // console.log(yDataArr);\r\n\r\n //x和y轴的数据\r\n const xData = xDataArr[0], // [60, 40, 20, 10, 5, 2, 1, 0.5, 0.25, 0.075],\r\n yData = yDataArr[0]; // [100.0, 100.0, 88.3, 69.3, 46.7, 27.0, 19.7, 5.6, 0.5, 0.3];\r\n let xMin = 0.01,\r\n xMax = 200;\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item == '筛底' ? 0 : item, yData[index]]);\r\n });\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n if (yValIsAllNull) {\r\n xMin = null;\r\n xMax = null;\r\n }\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 20,\r\n right: 15,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'log', //设置x轴为对数坐标轴\r\n logBase: 10, //可以设置对数轴的底数,默认为10\r\n inverse: true,\r\n min: xMin,\r\n max: xMax,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 回弹模量 (承载板法)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart150: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n const xData = xDataArr[0], // [25, 50, 100, 150, 200],\r\n yData = yDataArr[0]; // [0.72, 1.07, 1.87, 2.63, 3.48];\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 55,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 10,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 18,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n splitLine: { show: false }, // 隐藏分割线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n position: 'top', //设置x轴在顶部显示\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n markLine: {\r\n symbol: false, //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n position: 'start', //改变label位置\r\n formatter: (obj) => obj.value, //格式化显示的x轴标签内容\r\n },\r\n lineStyle: { color: '#ddd', type: 'solid' },\r\n data: xData.map((val) => {\r\n return {\r\n xAxis: val,\r\n };\r\n }),\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 土的回弹模量 (强度仪法)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart170: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n const xData = xDataArr[0], // [25, 50, 100, 150, 200],\r\n yData = yDataArr[0]; // [0.72, 1.07, 1.87, 2.63, 3.48];\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item[1] == null || item[1] == undefined || item[1] == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 55,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 10,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 18,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n splitLine: { show: false }, // 隐藏分割线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n position: 'top', //设置x轴在顶部显示\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n markLine: {\r\n symbol: false, //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n position: 'start', //改变label位置\r\n formatter: (obj) => obj.value, //格式化显示的x轴标签内容\r\n },\r\n lineStyle: { color: '#ddd', type: 'solid' },\r\n data: xData.map((val) => {\r\n return {\r\n xAxis: val,\r\n };\r\n }),\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 28d抗压强度与胶水比关系\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart190: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = '', // config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0], // [2.32, 2.5, 2.7],\r\n yData = yDataArr[0]; // [42.5, 47.1, 49.1];\r\n\r\n //处理数据\r\n xData = xData.filter((item) => item != null && item != undefined && item != '/' && (item._code == null || item._code == undefined));\r\n yData = yData.filter((item) => item != null && item != undefined && item != '/' && (item._code == null || item._code == undefined));\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item == null || item == undefined || item == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n xData = [];\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 18,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n if (value == '/') {\r\n return '';\r\n } else {\r\n return value;\r\n }\r\n },\r\n },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: yData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 混凝土拌合物含气量\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart210: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n //x和y轴的原始数据\r\n let xDataSource = xDataArr[0], // [0.093, 0.081, 0.068, 0.063, 0.057, 0.052, 0.049, 0.044, 0.041, 0.038, 0.036],\r\n yDataSource = yDataArr[0]; // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //series需要的数据\r\n const seriesData = [];\r\n\r\n for (let i = xDataSource.length - 1; i >= 0; i--) {\r\n const item = xDataSource[i];\r\n\r\n if (item != null && item != undefined && item != '/' && (item._error == null || item._error == undefined)) {\r\n seriesData.push([item, yDataSource[i]]);\r\n }\r\n }\r\n\r\n //x和y轴的字体大小\r\n const xyFontSize = 10;\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xDataSource.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xDataSource.forEach((item) => {\r\n if (item == null || item == undefined || item == '/' || (item._error != null && item._error != undefined)) {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xDataSource.length) {\r\n yValIsAllNull = true;\r\n //xDataSource = [];\r\n }\r\n if (yDataSource.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n const getXline = () => {\r\n let arr = [];\r\n [0, 0.02, 0.04, 0.06, 0.08, 0.1].forEach((val) => {\r\n xDataSource.forEach((item) => {\r\n let obj: any = { xAxis: '' };\r\n\r\n if (item == '/') {\r\n obj.xAxis = '';\r\n arr.push(obj);\r\n } else {\r\n obj.xAxis = val;\r\n arr.push(obj);\r\n }\r\n });\r\n });\r\n\r\n //去重\r\n let uniqueData = arr.filter((item, index, self) => index === self.findIndex((t) => t.xAxis == item.xAxis));\r\n return nullCount == xDataSource.length ? [] : uniqueData;\r\n };\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: !yValIsAllNull && seriesData.length > 0 ? 30 : 25,\r\n right: 10,\r\n bottom: 40,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].value[0] + ':' + datas[0].value[1] : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n splitLine: { show: false }, // 隐藏分割线\r\n axisLabel: { show: false }, // 隐藏刻度值\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull && seriesData.length > 0 ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n axisLabel: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n markLine: {\r\n symbol: false, //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n position: 'start', //改变label位置\r\n formatter: (obj) => obj.value, //格式化显示的x轴标签内容\r\n fontSize: xyFontSize,\r\n },\r\n lineStyle: { color: '#ddd', type: 'solid' },\r\n data: getXline(),\r\n // data: [0, 0.02, 0.04, 0.06, 0.08, 0.1].map((val) => {\r\n // return {\r\n // xAxis: val,\r\n // }\r\n // }),\r\n },\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 混凝土拌合物凝结时间\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart230: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n /*\r\n\t\t\t此处需要注意的是,如果单元格A3=A1-A2,就需要将A3=TEXT(A1-A2, \"h\"\":\"\"m\")\r\n\r\n\t\t\tExcel中默认时间相减得到的是天为单位,因此此处使用了TEXT函数来格式化相减的时间差格式\r\n\r\n\t\t\t=TEXT(A1-A2, \"h\"\":\"\"m\")\r\n\t\t\t=INT(A1-A2) & \"天\" & TEXT(A1-A2, \"h\"\"小时\"\"m\"\"分\"\"\")\r\n\r\n\t\t*/\r\n\r\n //折线的数量\r\n let lineCount = xDataArr.length;\r\n\r\n //原始数据\r\n let xDataSource1 = [], // ['6:20', '6:50', '7:20', '7:50', '7:56', '8:26', '8:56', '9:26', '9:56', '10:11'],\r\n xDataSource2 = [], // ['6:27', '6:57', '7:32', '8:02', '8:05', '8:35', '9:05', '9:35', '10:05', '10:22'],\r\n xDataSource3 = [], // ['6:10', '6:40', '7:10', '7:40', '8:03', '8:13', '8:42', '9:12', '9:40', '10:12'],\r\n yDataSource1 = [], // [0.8, 1.2, 2.2, 3.4, 3.6, 7.8, 11.8, 16.6, 24.6, 28.2],\r\n yDataSource2 = [], // [0.8, 1.3, 2.4, 3.4, 3.5, 7.7, 12.2, 16.7, 25, 28.2],\r\n yDataSource3 = []; // [0.7, 1, 1.9, 3, 3.3, 3.5, 8.2, 13.8, 20.2, 28.2];\r\n\r\n //折线1\r\n xDataSource1 = EChartsUtilsComm.filterNullEmptyErrArray(xDataArr[0]); // ['6:20', '6:50', '7:20', '7:50', '7:56', '8:26', '8:56', '9:26', '9:56', '10:11'],\r\n yDataSource1 = EChartsUtilsComm.filterNullEmptyErrArray(yDataArr[0]); // [0.8, 1.2, 2.2, 3.4, 3.6, 7.8, 11.8, 16.6, 24.6, 28.2],\r\n\r\n //折线2\r\n if (lineCount == 2) {\r\n xDataSource2 = EChartsUtilsComm.filterNullEmptyErrArray(xDataArr[1]); // ['6:27', '6:57', '7:32', '8:02', '8:05', '8:35', '9:05', '9:35', '10:05', '10:22'],\r\n yDataSource2 = EChartsUtilsComm.filterNullEmptyErrArray(yDataArr[1]); // [0.8, 1.3, 2.4, 3.4, 3.5, 7.7, 12.2, 16.7, 25, 28.2],\r\n }\r\n //折线3\r\n if (lineCount == 3) {\r\n xDataSource2 = EChartsUtilsComm.filterNullEmptyErrArray(xDataArr[1]); // ['6:27', '6:57', '7:32', '8:02', '8:05', '8:35', '9:05', '9:35', '10:05', '10:22'],\r\n yDataSource2 = EChartsUtilsComm.filterNullEmptyErrArray(yDataArr[1]); // [0.8, 1.3, 2.4, 3.4, 3.5, 7.7, 12.2, 16.7, 25, 28.2],\r\n xDataSource3 = EChartsUtilsComm.filterNullEmptyErrArray(xDataArr[2]); // ['6:10', '6:40', '7:10', '7:40', '8:03', '8:13', '8:42', '9:12', '9:40', '10:12'],\r\n yDataSource3 = EChartsUtilsComm.filterNullEmptyErrArray(yDataArr[2]); // [0.7, 1, 1.9, 3, 3.3, 3.5, 8.2, 13.8, 20.2, 28.2];\r\n }\r\n\r\n //3条线的x轴数据\r\n let xData1 = [],\r\n xData2 = [],\r\n xData3 = [];\r\n\r\n //组装数据\r\n\r\n xDataSource1.forEach((item, index) => {\r\n //js的时间格式\r\n if (typeof item == 'object') {\r\n xData1.push(item.getHours() * 60 + item.getMinutes());\r\n }\r\n //数字\r\n else if (typeof item == 'number') {\r\n xData1.push(item);\r\n }\r\n //文本格式\r\n else {\r\n const curArr = item.split(':');\r\n const curItemMins = Number(curArr[0]) * 60 + Number(curArr[1]);\r\n xData1.push(curItemMins);\r\n }\r\n });\r\n\r\n xDataSource2.forEach((item, index) => {\r\n //js的时间格式\r\n if (typeof item == 'object') {\r\n xData2.push(item.getHours() * 60 + item.getMinutes());\r\n }\r\n //数字\r\n else if (typeof item == 'number') {\r\n xData2.push(item);\r\n }\r\n //文本格式\r\n else {\r\n const curArr = item.split(':');\r\n const curItemMins = Number(curArr[0]) * 60 + Number(curArr[1]);\r\n xData2.push(curItemMins);\r\n }\r\n });\r\n\r\n xDataSource3.forEach((item, index) => {\r\n //js的时间格式\r\n if (typeof item == 'object') {\r\n xData3.push(item.getHours() * 60 + item.getMinutes());\r\n }\r\n //数字\r\n else if (typeof item == 'number') {\r\n xData3.push(item);\r\n }\r\n //文本格式\r\n else {\r\n const curArr = item.split(':');\r\n const curItemMins = Number(curArr[0]) * 60 + Number(curArr[1]);\r\n xData3.push(curItemMins);\r\n }\r\n });\r\n\r\n //x轴数据前后增加一个点,y轴数据前后也增加一个点\r\n if (xDataSource1.length > 0) {\r\n xData1.push(xData1[xData1.length - 1] + 20);\r\n xData1.unshift(xData1[0] - 20);\r\n yDataSource1.push(null);\r\n yDataSource1.unshift(null);\r\n }\r\n\r\n if (lineCount == 2) {\r\n if (xDataSource2.length > 0) {\r\n xData2.push(xData2[xData2.length - 1] + 20);\r\n xData2.unshift(xData2[0] - 20);\r\n yDataSource2.push(null);\r\n yDataSource2.unshift(null);\r\n }\r\n }\r\n if (lineCount == 3) {\r\n if (xDataSource3.length == 0) {\r\n xData2.push(xData2[xData2.length - 1] + 20);\r\n xData2.unshift(xData2[0] - 20);\r\n yDataSource2.push(null);\r\n yDataSource2.unshift(null);\r\n xData3.push(xData3[xData3.length - 1] + 20);\r\n xData3.unshift(xData3[0] - 20);\r\n yDataSource3.push(null);\r\n yDataSource3.unshift(null);\r\n }\r\n }\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName;\r\n\r\n //获取xAxis需要的数据\r\n const getxAxisObj = (type, data) => {\r\n return {\r\n type: 'category',\r\n data: data,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n show: type == 1,\r\n splitLine: {\r\n show: true,\r\n },\r\n };\r\n };\r\n\r\n let xAxisData = [getxAxisObj(1, xData1)];\r\n if (lineCount == 2) {\r\n xAxisData.push(getxAxisObj(2, xData2));\r\n }\r\n if (lineCount == 3) {\r\n xAxisData.push(getxAxisObj(2, xData2));\r\n xAxisData.push(getxAxisObj(3, xData3));\r\n }\r\n\r\n //获取series需要的数据\r\n const getLineObj = (type, data) => {\r\n const name = type == 1 ? '第一组' : type == 2 ? '第二组' : '第三组';\r\n const symbol = type == 1 ? 'rect' : type == 2 ? 'triangle' : 'circle';\r\n const lineType = type == 1 ? 'solid' : type == 2 ? 'dotted' : [10, 5];\r\n const color =\r\n type == 1 && lineData.length >= 1\r\n ? lineData[0].lineColor\r\n : type == 2 && lineData.length >= 2\r\n ? lineData[1].lineColor\r\n : type == 3 && lineData.length >= 3\r\n ? lineData[2].lineColor\r\n : '#000';\r\n\r\n let obj = {\r\n name: name,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: symbol, //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: color,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: lineType,\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: color,\r\n },\r\n data: data,\r\n };\r\n\r\n return obj;\r\n };\r\n\r\n //series: [getLineObj(1, yDataSource1), getLineObj(2, yDataSource2), getLineObj(3, yDataSource3)],\r\n let seriesData = [getLineObj(1, yDataSource1)];\r\n if (lineCount == 2) {\r\n if (yDataSource2.length > 0) {\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n }\r\n }\r\n if (lineCount == 3) {\r\n if (yDataSource2.length > 0) {\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n }\r\n if (yDataSource3.length > 0) {\r\n seriesData.push(getLineObj(3, yDataSource3));\r\n }\r\n }\r\n\r\n let legendData = lineCount == 1 ? ['第一组'] : lineCount == 2 ? ['第一组', '第二组'] : ['第一组', '第二组', '第三组'],\r\n legendSelected: any =\r\n lineCount == 1 ? { 第一组: true } : lineCount == 2 ? { 第一组: true, 第二组: true } : { 第一组: true, 第二组: true, 第三组: true };\r\n\r\n //console.log(xData1,xData2,xData3,seriesData)\r\n let yValIsAllNull = false;\r\n let xValIsAllNull = false;\r\n let topmargin = 0;\r\n //为空不展示\r\n if (xDataSource1.length == 0) {\r\n xValIsAllNull = true;\r\n topmargin = 15;\r\n\r\n legendData = ['第二组', '第三组'];\r\n legendSelected = { 第一组: false, 第二组: true, 第三组: true };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData2));\r\n xAxisData.push(getxAxisObj(3, xData3));\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n seriesData.push(getLineObj(3, yDataSource3));\r\n\r\n if (xDataSource2.length == 0) {\r\n topmargin = 35;\r\n\r\n legendData = ['第三组'];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: true };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData3));\r\n seriesData.push(getLineObj(3, yDataSource3));\r\n\r\n if (xDataSource3.length == 0) {\r\n topmargin = 0;\r\n\r\n yValIsAllNull = true;\r\n legendData = [];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: false };\r\n xAxisData = [];\r\n seriesData = [];\r\n xAxisData.push(getxAxisObj(1, []));\r\n seriesData.push(getLineObj(3, []));\r\n }\r\n }\r\n } else if (xDataSource2.length == 0) {\r\n topmargin = 15;\r\n xValIsAllNull = true;\r\n legendData = ['第一组', '第三组'];\r\n legendSelected = { 第一组: true, 第二组: false, 第三组: true };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData1));\r\n xAxisData.push(getxAxisObj(3, xData3));\r\n\r\n seriesData.push(getLineObj(1, yDataSource1));\r\n seriesData.push(getLineObj(3, yDataSource3));\r\n\r\n if (xDataSource1.length == 0) {\r\n topmargin = 35;\r\n\r\n legendData = ['第三组'];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: true };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData1));\r\n seriesData.push(getLineObj(3, yDataSource1));\r\n\r\n if (xDataSource3.length == 0) {\r\n topmargin = 0;\r\n\r\n yValIsAllNull = true;\r\n legendData = [];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: false };\r\n xAxisData = [];\r\n seriesData = [];\r\n xAxisData.push(getxAxisObj(1, []));\r\n seriesData.push(getLineObj(3, []));\r\n }\r\n }\r\n } else if (xDataSource3.length == 0) {\r\n topmargin = 15;\r\n xValIsAllNull = true;\r\n legendData = ['第一组', '第二组'];\r\n legendSelected = { 第一组: true, 第二组: true, 第三组: false };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n xAxisData.push(getxAxisObj(1, xData1));\r\n xAxisData.push(getxAxisObj(2, xData2));\r\n seriesData.push(getLineObj(1, yDataSource1));\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n\r\n if (xDataSource1.length == 0) {\r\n topmargin = 35;\r\n legendData = ['第二组'];\r\n legendSelected = { 第一组: false, 第二组: true, 第三组: false };\r\n\r\n xAxisData = [];\r\n seriesData = [];\r\n\r\n xAxisData.push(getxAxisObj(1, xData2));\r\n seriesData.push(getLineObj(2, yDataSource2));\r\n\r\n if (xDataSource2.length == 0) {\r\n topmargin = 0;\r\n yValIsAllNull = true;\r\n legendData = [];\r\n legendSelected = { 第一组: false, 第二组: false, 第三组: false };\r\n xAxisData = [];\r\n seriesData = [];\r\n xAxisData.push(getxAxisObj(1, []));\r\n seriesData.push(getLineObj(2, []));\r\n }\r\n }\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: !xValIsAllNull ? -5 : topmargin,\r\n left: 30,\r\n right: 10,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n left: 'center',\r\n top: 16,\r\n data: legendData,\r\n selected: legendSelected,\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: xAxisData,\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: seriesData,\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 颗粒组成(密度计法)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart250: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n const xData = xDataArr[0], // [0.0316, 0.0224, 0.0115, 0.0075, 0.0058, 0.0033, 0.0031, 0.0024, 0.001, 0.0008],\r\n yData = yDataArr[0]; // [83.0, 78.8, 53.8, 42.6, 33.7, 27.8, 23.2, 19.2, 13.0, 7.7];\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n\r\n let xmin = 0.001,\r\n xmax = 100;\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.length == 0) {\r\n yValIsAllNull = true;\r\n }\r\n let nullCount = 0;\r\n xData.forEach((item) => {\r\n if (item == null || item == undefined || item == '/') {\r\n nullCount++;\r\n }\r\n });\r\n if (nullCount == xData.length) {\r\n yValIsAllNull = true;\r\n xmin = null;\r\n xmax = null;\r\n }\r\n if (yData.some((item) => item != null && item != undefined && item != '/')) {\r\n yValIsAllNull = false;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 20,\r\n right: 15,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'log', //设置x轴为对数坐标轴\r\n logBase: 10, //可以设置对数轴的底数,默认为10\r\n inverse: true,\r\n min: xmin,\r\n max: xmax,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 承载比(CBR)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart270: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n // const xDataSource1 = xDataArr[0], // [36, 102, 316, 678, 917, 1177, 1396, 1478, 1620, 1651, 1753, 1789, 1855],\r\n // \txDataSource2 = xDataArr[1], // [56, 122, 357, 617, 958, 1223, 1376, 1493, 1631, 1682, 1783, 1824, 1885],\r\n // \txDataSource3 = xDataArr[2], // [66, 168, 443, 729, 994, 1213, 1411, 1529, 1651, 1722, 1783, 1824, 1890],\r\n // \tyDataSource1 = yDataArr[0], // [0.31, 0.51, 0.94, 1.47, 2.0, 2.48, 2.92, 3.41, 3.87, 4.37, 4.86, 5.36, 5.88],\r\n // \tyDataSource2 = yDataArr[1], // [0.26, 0.5, 1.01, 1.52, 2.02, 2.52, 2.98, 3.49, 3.99, 4.49, 4.98, 5.48, 5.98],\r\n // \tyDataSource3 = yDataArr[2]; // [0.32, 0.52, 1.01, 1.5, 1.99, 2.49, 2.98, 3.47, 3.96, 4.46, 4.95, 5.44, 5.93];\r\n\r\n let xDataSource1 = [],\r\n xDataSource2 = [],\r\n xDataSource3 = [],\r\n yDataSource1 = [],\r\n yDataSource2 = [],\r\n yDataSource3 = [];\r\n\r\n //排除原始数据为0的数据\r\n xDataArr[0].forEach((item, index) => {\r\n if (item != 0 && yDataArr[0][index] != 0) {\r\n xDataSource1.push(item);\r\n yDataSource1.push(yDataArr[0][index]);\r\n }\r\n });\r\n xDataArr[1].forEach((item, index) => {\r\n if (item != 0 && yDataArr[1][index] != 0) {\r\n xDataSource2.push(item);\r\n yDataSource2.push(yDataArr[1][index]);\r\n }\r\n });\r\n xDataArr[2].forEach((item, index) => {\r\n if (item != 0 && yDataArr[2][index] != 0) {\r\n xDataSource3.push(item);\r\n yDataSource3.push(yDataArr[2][index]);\r\n }\r\n });\r\n\r\n /**\r\n * 获取series需要的3条线配置\r\n * @param type 线类型(1:筛分曲线、2:上限、3:下限)\r\n * @param data 对应的坐标点数据\r\n */\r\n const getLineObj = (type, xData, yData) => {\r\n const name = `曲线${type}`;\r\n const symbol = type == 1 ? 'rect' : type == 2 ? 'triangle' : 'circle';\r\n const lineType = type == 1 ? 'solid' : type == 2 ? 'dotted' : [10, 5];\r\n const color = type == 1 ? lineData[0].lineColor : type == 2 ? lineData[1].lineColor : lineData[2].lineColor; //ttype == 1 ? '#F56C6C' : type == 2 ? '#409EFF' : '#000';\r\n\r\n const seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n\r\n return {\r\n name: name,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: symbol, //符号类型\r\n symbolSize: 5, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: color,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: lineType,\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: color,\r\n },\r\n data: seriesData,\r\n };\r\n };\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (\r\n xDataSource1.every((item) => item == '/') &&\r\n xDataSource2.every((item) => item == '/') &&\r\n xDataSource3.every((item) => item == '/') &&\r\n yDataSource1.every((item) => item == '/') &&\r\n yDataSource2.every((item) => item == '/') &&\r\n yDataSource3.every((item) => item == '/')\r\n ) {\r\n yValIsAllNull = true;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 35,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 20,\r\n bottom: 5,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].value[0] + ')' + ':' + datas[0].value[1] : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 16,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value', //category\r\n //data: xDataSource1,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n position: 'top', //设置x轴在顶部显示\r\n nameGap: 5, //坐标轴名称与轴线之间的距离\r\n nameLocation: 'end', //设置x轴显示的名称的位置在末端,注意:需要配置grid.right一起使用,不然可能会被遮住\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [getLineObj(1, xDataSource1, yDataSource1), getLineObj(2, xDataSource2, yDataSource2), getLineObj(3, xDataSource3, yDataSource3)],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 压实度-吸水量,膨胀率,CBR-279、280和281\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart279_280_281: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle, //压实度-吸水量关系曲线 压实度-膨胀率关系曲线 压实度-CBR关系曲线\r\n xName = config.chartXName, //压实度(%) 压实度(%) 压实度(%)\r\n yName = config.chartYName, //吸水量(g) 膨胀率(%) CBR(%)\r\n legendName = '图例1';\r\n\r\n //y轴最大最小数据加减数字\r\n let jjNum = config.chartType == 279 ? 5 : config.chartType == 280 ? 0.1 : 0.15;\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0], // [90.3, 95.6, 99.5],\r\n yData = yDataArr[0], // [245, 206, 163],\r\n xAxisMin = Math.min(...xData),\r\n yAxisMin = Number(EChartsUtilsComm.getRound(Math.min(...yData) - jjNum, 0.001)),\r\n yAxisMax = Number(EChartsUtilsComm.getRound(Math.max(...yData) + jjNum, 0.001));\r\n //yData1 = [245, 206, 163],\r\n //yData2 = [3.49, 2.69, 2.34];\r\n //yData3 = [4, 4.7, 5.7];\r\n //修约:0.001 0.001 0.001\r\n //y最大最小加减数:5 0.1 0.15\r\n\r\n xAxisMin = Number(EChartsUtilsComm.getRound(xAxisMin - xAxisMin * 0.01, 0.001));\r\n\r\n let seriesData = [];\r\n xData.forEach((item, index) => {\r\n seriesData.push([item, yData[index]]);\r\n });\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (yData.every((item) => item == '/')) {\r\n yValIsAllNull = true;\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 20,\r\n right: 15,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value', //设置x轴为对数坐标轴\r\n min: xAxisMin,\r\n max: 100,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n min: yAxisMin,\r\n max: yAxisMax,\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: seriesData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 承载比(CBR)(路强仪)\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart290: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xDataSource1 = xDataArr[0], // [36, 102, 316, 678, 917, 1177, 1396, 1478, 1620, 1651, 1753, 1789, 1855],\r\n xDataSource2 = xDataArr[0], // [56, 122, 357, 617, 958, 1223, 1376, 1493, 1631, 1682, 1783, 1824, 1885],\r\n xDataSource3 = xDataArr[0], // [66, 168, 443, 729, 994, 1213, 1411, 1529, 1651, 1722, 1783, 1824, 1890],\r\n yDataSource1 = yDataArr[0], // [0.31, 0.51, 0.94, 1.47, 2.0, 2.48, 2.92, 3.41, 3.87, 4.37, 4.86, 5.36, 5.88],\r\n yDataSource2 = yDataArr[1], // [0.26, 0.5, 1.01, 1.52, 2.02, 2.52, 2.98, 3.49, 3.99, 4.49, 4.98, 5.48, 5.98],\r\n yDataSource3 = yDataArr[2]; // [0.32, 0.52, 1.01, 1.5, 1.99, 2.49, 2.98, 3.47, 3.96, 4.46, 4.95, 5.44, 5.93];\r\n\r\n /**\r\n * 获取series需要的3条线配置\r\n * @param type 线类型(1:筛分曲线、2:上限、3:下限)\r\n * @param data 对应的坐标点数据\r\n */\r\n const getLineObj = (type, data) => {\r\n const name = `曲线${type}`;\r\n const symbol = type == 1 ? 'rect' : type == 2 ? 'triangle' : 'circle';\r\n const lineType = type == 1 ? 'solid' : type == 2 ? 'dotted' : [10, 5];\r\n const color = type == 1 ? lineData[0].lineColor : type == 2 ? lineData[1].lineColor : lineData[2].lineColor; //ttype == 1 ? '#F56C6C' : type == 2 ? '#409EFF' : '#000';\r\n\r\n return {\r\n name: name,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: symbol, //符号类型\r\n symbolSize: 5, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: color,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n type: lineType,\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: color,\r\n },\r\n data: data,\r\n };\r\n };\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (\r\n xDataSource1.every((item) => item == '/') &&\r\n xDataSource2.every((item) => item == '/') &&\r\n xDataSource3.every((item) => item == '/') &&\r\n yDataSource1.every((item) => item == '/') &&\r\n yDataSource2.every((item) => item == '/') &&\r\n yDataSource3.every((item) => item == '/')\r\n ) {\r\n yValIsAllNull = true;\r\n xDataSource1 = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 35,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 5,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 16,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: xDataSource1,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n splitLine: { show: true },\r\n position: 'top', //设置x轴在顶部显示\r\n nameGap: 5, //坐标轴名称与轴线之间的距离\r\n nameLocation: 'end', //设置x轴显示的名称的位置在末端,注意:需要配置grid.right一起使用,不然可能会被遮住\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n if (value == '/') {\r\n return '';\r\n } else {\r\n return value;\r\n }\r\n },\r\n },\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [getLineObj(1, yDataSource1), getLineObj(2, yDataSource2), getLineObj(3, yDataSource3)],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 土基回弹模量\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart310: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0], // [0.02, 0.04, 0.06, 0.08, 0.14, 0.18, 0.22, 0.26, 0.3, 0.34],\r\n yData = yDataArr[0]; // [6, 10, 12, 16, 20, 28, 36, 44, 54, 68];\r\n\r\n let xDataCl = [],\r\n yDataCl = [];\r\n xData.forEach((item, index) => {\r\n if (item != null && item != undefined && item != '/' && (item._code == null || item._code == undefined)) {\r\n xDataCl.push(item);\r\n yDataCl.push(yData[index]);\r\n }\r\n });\r\n xData = xDataCl;\r\n yData = yDataCl;\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (\r\n xData.every((item) => item == '/' || (item._code != null && item._code != undefined)) &&\r\n yData.every((item) => item == '/' || (item._code != null && item._code != undefined))\r\n ) {\r\n yValIsAllNull = true;\r\n xData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 35,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 20,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n top: 16,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: xData,\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n if (value == '/') {\r\n return '';\r\n } else {\r\n return value;\r\n }\r\n },\r\n },\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n axisLine: {\r\n //设置x轴箭头效果\r\n symbol: ['none', 'arrow'], //默认是['none', 'none'],可以设置为['arrow', 'none']或['none', 'arrow']等来分别控制起始和结束的箭头\r\n symbolSize: 10, //箭头大小\r\n },\r\n splitLine: { show: true },\r\n position: 'top', //设置x轴在顶部显示\r\n name: 'p', //设置x轴显示的名称\r\n nameGap: 5, //坐标轴名称与轴线之间的距离\r\n nameLocation: 'end', //设置x轴显示的名称的位置在末端,注意:需要配置grid.right一起使用,不然可能会被遮住\r\n },\r\n yAxis: [\r\n //双y轴,目的是使用第二个y轴来配置字符L显示在y轴下方箭头的位置\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 30 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n inverse: true, //y轴坐标轴向下\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n //设置y轴箭头效果\r\n show: true, //y轴默认是不显示的\r\n symbol: ['arrow', 'none'], //默认是['none', 'none'],可以设置为['arrow', 'none']或['none', 'arrow']等来分别控制起始和结束的箭头\r\n symbolSize: 10, //箭头大小\r\n },\r\n },\r\n {\r\n //配置符号L的显示\r\n name: 'L',\r\n nameRotate: 0,\r\n nameLocation: 'end',\r\n nameGap: 5, //坐标轴名称与轴线之间的距离\r\n position: 'left',\r\n inverse: true, //y轴坐标轴向下\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: yData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 布氏粘度计\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart330: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>, sheet: any) => {\r\n let lineData = JSON.parse(config.chartLinesJson);\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n let title = '', //config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //x和y轴的数据\r\n let xData = xDataArr[0],\r\n yData = yDataArr[0];\r\n\r\n //获取y轴趋势公式对象\r\n const gsS: any = EChartsUtilsComm.calcTrend(xData, yData, xData[0]);\r\n\r\n //黏度为0.15Pa·s、0.19Pa·s、0.25Pa·s、0.31Pa·s时的温度\r\n let wd015 = EChartsUtilsComm.getRound((0.15 - gsS.jj) / gsS.xl, 0),\r\n wd019 = EChartsUtilsComm.getRound((0.19 - gsS.jj) / gsS.xl, 0),\r\n wd025 = EChartsUtilsComm.getRound((0.25 - gsS.jj) / gsS.xl, 0),\r\n wd031 = EChartsUtilsComm.getRound((0.31 - gsS.jj) / gsS.xl, 0);\r\n\r\n if (wd015 == Infinity) {\r\n wd015 = 0;\r\n }\r\n if (wd019 == Infinity) {\r\n wd019 = 0;\r\n }\r\n if (wd025 == Infinity) {\r\n wd025 = 0;\r\n }\r\n if (wd031 == Infinity) {\r\n wd031 = 0;\r\n }\r\n //输出“拌合温度范围 ℃”和“压实成型温度范围 ℃”\r\n let wdBh = `${wd015}~${wd019}`,\r\n wdYs = `${wd025}~${wd031}`;\r\n // console.log('输出温度:', wdBh, wdYs);\r\n\r\n //设置Sheet单元格的值(拌合温度和压实成型温度范围)\r\n if (chartExtJson != null) {\r\n if (wd015 == 0 && wd019 == 0) {\r\n sheet.setValue(chartExtJson.bszdjBh.row, chartExtJson.bszdjBh.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.bszdjBh.row, chartExtJson.bszdjBh.col, wdBh);\r\n }\r\n if (wd025 == 0 && wd031 == 0) {\r\n sheet.setValue(chartExtJson.bszdjYs.row, chartExtJson.bszdjYs.col, '/');\r\n } else {\r\n sheet.setValue(chartExtJson.bszdjYs.row, chartExtJson.bszdjYs.col, wdYs);\r\n }\r\n }\r\n\r\n //验证是否没有任何数据,以便控制显示y轴的名称的距离位置\r\n let yValIsAllNull = false;\r\n if (xData.every((item) => item == '/') && yData.every((item) => item == '/')) {\r\n yValIsAllNull = true;\r\n xData = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 10,\r\n left: !yValIsAllNull ? 30 : 25,\r\n right: 10,\r\n bottom: 20,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas.length > 0 ? datas[0].seriesName + '(' + datas[0].name + ')' + ':' + datas[0].value : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 18,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'category',\r\n data: xData,\r\n axisTick: {\r\n alignWithLabel: true, //使得刻度线和标签对齐\r\n },\r\n axisLabel: {\r\n // 使用formatter格式化标签\r\n formatter: function (value) {\r\n if (value == '/') {\r\n return '';\r\n } else {\r\n return value;\r\n }\r\n },\r\n },\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !yValIsAllNull ? 25 : 5,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n //splitNumber: 10, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n axisLine: {\r\n show: true, //y轴默认是不显示的\r\n },\r\n },\r\n ],\r\n series: [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n smooth: true, //平滑的线条\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle', //符号类型\r\n symbolSize: 6, //符号大小\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineData[0].lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineData[0].lineColor,\r\n },\r\n data: yData,\r\n },\r\n ],\r\n };\r\n\r\n return option;\r\n },\r\n /**\r\n * 液限碟式仪\r\n * @param config 折线配置\r\n * @param xDataArr x轴原始数据(二维数组)\r\n * @param yDataArr y轴原始数据(二维数组)\r\n * @returns 返回ECharts配置项\r\n */\r\n chart350: (config: EChartsUtilsConfigModel, xDataArr: Array<Array<any>>, yDataArr: Array<Array<any>>) => {\r\n let lineData = JSON.parse(config.chartLinesJson),\r\n lineColor = lineData[0].lineColor;\r\n\r\n //击数N(次)、含水率w(%)、y轴第一个趋势数据、y轴第二个趋势数据、25的趋势数据、y轴最小值、y轴最大值\r\n const jsN = [xDataArr[0][0], xDataArr[0][1]], // [18, 30],\r\n hsl = [yDataArr[0][0], yDataArr[0][1]], // [22.1, 11.5],\r\n //通过calcTrend获取y轴第一个趋势数据、y轴第二个趋势数据、25的趋势数据\r\n yVal1 = Number(EChartsUtilsComm.getRound(EChartsUtilsComm.calcTrend(jsN, hsl, jsN[0]).y, 0.1)),\r\n yVal2 = Number(EChartsUtilsComm.getRound(EChartsUtilsComm.calcTrend(jsN, hsl, jsN[1]).y, 0.1)),\r\n yVal25 = Number(EChartsUtilsComm.getRound(EChartsUtilsComm.calcTrend(jsN, hsl, 25).y, 0.1)),\r\n //通过calcTrend获取y轴的趋势数据,然后分别-2和+2\r\n yAxisMin = Math.floor(Number(yVal2)) - 2,\r\n yAxisMax = Math.floor(Number(yVal1)) + 2;\r\n\r\n let title = config.chartTitle,\r\n xName = config.chartXName,\r\n yName = config.chartYName,\r\n legendName = '图例1';\r\n\r\n //检测是否所有数据都为空\r\n let isAllNull = true;\r\n isAllNull = xDataArr[0].filter((item) => item != null && item != undefined && item != '/').length == 0;\r\n if (isAllNull) {\r\n isAllNull = yDataArr[0].filter((item) => item != null && item != undefined && item != '/').length == 0;\r\n }\r\n\r\n //x和y轴的字体大小\r\n const xyFontSize = 8;\r\n\r\n let seriesObjs = [\r\n {\r\n name: legendName,\r\n type: 'line',\r\n //设置数据点形状(实心),参考文档:https://echarts.apache.org/zh/option.html#series-line.symbol\r\n symbol: 'circle',\r\n z: 10, //控制曲线的浮动层级,避免在markLine下方被遮住\r\n //线条的颜色\r\n lineStyle: {\r\n color: lineColor,\r\n //线条类型(solid:实线、dashed:粗虚线、dotted:细虚线)\r\n // type: 'dotted',\r\n },\r\n //线条上数据点的颜色\r\n itemStyle: {\r\n color: lineColor,\r\n },\r\n connectNulls: true, //是否连接空数据\r\n data: [\r\n [0, null],\r\n [2, null],\r\n [3.5, null],\r\n [4.9, null],\r\n [5.9, null],\r\n [6.9, null],\r\n {\r\n //延长线1\r\n value: [10.4, yVal25 - (2.7 * (yVal25 - yVal1)) / 2.1],\r\n symbol: 'none', //隐藏线条上的数据点\r\n },\r\n [11, yVal1], //第一个点\r\n [11.8, null],\r\n [13.1, yVal25], //第二个点\r\n [14.6, yVal2], //第三个点\r\n {\r\n //延长线2\r\n value: [15.2, (2.1 / 1.5) * (yVal2 - yVal25) + yVal25],\r\n symbol: 'none', //隐藏线条上的数据点\r\n },\r\n [16.4, null],\r\n [17.4, null],\r\n [18.9, null],\r\n [19.8, null],\r\n [20.7, null],\r\n [21.6, null],\r\n [22.6, null],\r\n ],\r\n markPoint: {\r\n data: [\r\n {\r\n xAxis: 13.1,\r\n yAxis: yVal25,\r\n symbolOffset: [40, 25],\r\n label: {\r\n show: true,\r\n color: '#000',\r\n formatter: function (data) {\r\n //显示25这个坐标点数据\r\n return isAllNull ? '' : '( ' + 25 + ' , ' + data.data.yAxis + ')';\r\n },\r\n },\r\n itemStyle: { color: 'transparent' },\r\n },\r\n ],\r\n },\r\n markLine: {\r\n symbol: '', //取消箭头\r\n silent: true, //取消鼠标hover事件\r\n label: {\r\n //标线的文本,模拟x轴显示的内容\r\n position: 'start', //改变label位置\r\n // rotate: 45, //设置文字旋转度数(注意:ECharts官网文档居然没有rotate这个属性的说明)\r\n // backgroundColor:'#fff'\r\n // color:'#f00',//文字颜色\r\n formatter: (data) => {\r\n return data.name;\r\n },\r\n },\r\n lineStyle: { color: '#e0e6f1', type: 'solid' },\r\n data: [\r\n {\r\n name: '5',\r\n xAxis: 0,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '6',\r\n xAxis: 2,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '7',\r\n xAxis: 3.5,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '8',\r\n xAxis: 4.9,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '9',\r\n xAxis: 5.9,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '10',\r\n xAxis: 6.9,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n //延长线1\r\n name: '',\r\n xAxis: 10.4,\r\n lineStyle: {\r\n opacity: 0,\r\n },\r\n },\r\n {\r\n //第一个点\r\n name: '',\r\n xAxis: 11,\r\n },\r\n {\r\n name: '20',\r\n xAxis: 11.8,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n //第二个点\r\n name: '25',\r\n xAxis: 13.1,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n //第三个点\r\n name: '30',\r\n xAxis: 14.6,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n //延长线2\r\n name: '',\r\n xAxis: 15.2,\r\n lineStyle: {\r\n opacity: 0,\r\n },\r\n },\r\n {\r\n name: '40',\r\n xAxis: 16.4,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '50',\r\n xAxis: 17.4,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n {\r\n name: '',\r\n xAxis: 18.9,\r\n },\r\n {\r\n name: '',\r\n xAxis: 19.8,\r\n },\r\n {\r\n name: '',\r\n xAxis: 20.7,\r\n },\r\n {\r\n name: '',\r\n xAxis: 21.6,\r\n },\r\n {\r\n name: '100',\r\n xAxis: 22.6,\r\n label: {\r\n fontSize: xyFontSize,\r\n },\r\n },\r\n\r\n //横线\r\n [\r\n {\r\n coord: [0, yVal25],\r\n lineStyle: {\r\n color: '#529b2e',\r\n type: 'solid',\r\n },\r\n },\r\n { coord: [13.1, yVal25] },\r\n ],\r\n //纵线\r\n [\r\n {\r\n coord: [13.1, yAxisMin],\r\n lineStyle: {\r\n color: '#000',\r\n type: 'silid',\r\n },\r\n },\r\n { coord: [13.1, yVal25] },\r\n ],\r\n ],\r\n },\r\n },\r\n ];\r\n if (isAllNull) {\r\n seriesObjs = [];\r\n }\r\n\r\n let option = {\r\n grid: {\r\n // show: true,//是否显示外边框线\r\n // borderColor: '#f00',//外边框线颜色\r\n top: 25,\r\n left: 30,\r\n right: 10,\r\n bottom: 35,\r\n containLabel: true,\r\n },\r\n //提示框组件,参考文档:https://echarts.apache.org/zh/option.html#tooltip\r\n tooltip: {\r\n trigger: 'axis',\r\n formatter: function (datas, ticket) {\r\n return datas && datas[0].data.length > 1\r\n ? datas[0].data[1] == null\r\n ? ''\r\n : datas[0].seriesName + '(' + datas[0].data[0] + ')' + ':' + datas[0].data[1]\r\n : datas[0].data;\r\n },\r\n },\r\n //顶部的标题,参考文档:https://echarts.apache.org/zh/option.html#title\r\n title: [\r\n {\r\n show: true,\r\n text: title,\r\n left: 'center',\r\n top: 0,\r\n textStyle: {\r\n fontSize: 14,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n {\r\n show: true,\r\n text: xName,\r\n left: 'center',\r\n bottom: 0,\r\n textStyle: {\r\n fontSize: 12,\r\n fontWeight: 'normal',\r\n },\r\n },\r\n ],\r\n //图例,参考文档:https://echarts.apache.org/zh/option.html#legend\r\n legend: {\r\n show: false,\r\n left: 'right',\r\n data: [legendName],\r\n selected: {\r\n legendName: true, //显示\r\n },\r\n selectedMode: 'multiple', //用于控制图例的选择模式(single:单选、multiple:多选、false:禁止选择)\r\n },\r\n xAxis: {\r\n type: 'value',\r\n axisTick: { show: false }, //隐藏刻度线\r\n axisLabel: { show: false }, //隐藏刻度值\r\n //网格线,参考文档:https://echarts.apache.org/zh/option.html#xAxis.splitLine\r\n splitLine: {\r\n show: false, //隐藏分割线\r\n },\r\n min: 0,\r\n max: 23.5,\r\n },\r\n yAxis: [\r\n {\r\n type: 'value',\r\n name: yName,\r\n nameGap: !isAllNull ? 30 : 10,\r\n nameRotate: 90,\r\n nameLocation: 'middle',\r\n splitLine: {\r\n show: true,\r\n lineStyle: {\r\n color: '#e0e6f1', //'#e0e6f1',\r\n type: 'solid',\r\n },\r\n },\r\n splitNumber: 4, //设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……\r\n min: !isAllNull ? yAxisMin : null,\r\n max: yAxisMax,\r\n axisLabel: {\r\n show: !isAllNull ? true : false,\r\n fontSize: xyFontSize,\r\n },\r\n axisTick: {\r\n show: !isAllNull ? true : false,\r\n },\r\n },\r\n ],\r\n series: seriesObjs,\r\n };\r\n\r\n return option;\r\n },\r\n};\r\n","import * as echarts from 'echarts';\r\nimport { type CellModel } from '../types/sheet';\r\nimport { type EChartsUtilsConfigModel, type EChartsUtilsChartLinesJsonModel } from '../types/echarts';\r\nimport { EChartsUtilsAll } from './echarts-all';\r\n\r\n/**\r\n * ECharts图表工具类\r\n */\r\nexport const EChartsUtils = {\r\n /**\r\n * 创建图表\r\n * @param GC GC对象\r\n * @param spread 工作簿对象\r\n * @param sheet 工作表对象\r\n * @param config 折现配置\r\n * @param isHideChart 是否隐藏图表\r\n */\r\n create: async (\r\n GC: any,\r\n spread: any,\r\n sheet: any,\r\n config: EChartsUtilsConfigModel,\r\n isHideChart: boolean = false\r\n ): Promise<{\r\n fObj: any;\r\n fObjPosition: {\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n };\r\n ecObj: echarts.ECharts;\r\n }> => {\r\n // 获取扩展配置\r\n const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);\r\n\r\n // 如果isShowCon配置存在,则验证isShowCon对应单元格的值是否和输入的配置chartExtJson.isShowVal相等,不相等的话,就不创建图表\r\n if (chartExtJson != null && chartExtJson.isShowCon != null && chartExtJson.isShowCon != undefined) {\r\n const conVal = sheet.getValue(chartExtJson.isShowCon.row, chartExtJson.isShowCon.col);\r\n\r\n if (conVal != chartExtJson.isShowVal) {\r\n sheet.floatingObjects.remove(config.chartId);\r\n return;\r\n }\r\n }\r\n\r\n // 获取图表单元格之上的所有行的高度总和、所有列的宽度总和、距离左侧的距离和图表所在单元格的高度\r\n let allRowsTotalHeight = 0,\r\n allRowsTotalWidth = 0,\r\n allRowsTotalLeft = 0,\r\n chartCellHeight = 0;\r\n for (let i = 0; i < config.row; i++) {\r\n allRowsTotalHeight += sheet.getRowHeight(i);\r\n }\r\n allRowsTotalHeight += sheet.getRowHeight(0, GC.Spread.Sheets.SheetArea.colHeader);\r\n for (let i = config.col; i < config.col + config.colCount; i++) {\r\n allRowsTotalWidth += sheet.getColumnWidth(i);\r\n }\r\n for (let i = 0; i < config.col; i++) {\r\n allRowsTotalLeft += sheet.getColumnWidth(i);\r\n }\r\n allRowsTotalLeft += sheet.getColumnWidth(0, GC.Spread.Sheets.SheetArea.rowHeader);\r\n for (let i = config.row; i < config.row + config.rowCount; i++) {\r\n chartCellHeight += sheet.getRowHeight(i);\r\n }\r\n\r\n // 设置浮动对象的呈现位置(实际情况根据需要进行调整)\r\n const fObjPosition = {\r\n x: allRowsTotalLeft - 40 + 2,\r\n y: allRowsTotalHeight - 20 + 2,\r\n w: allRowsTotalWidth - 6,\r\n h: chartCellHeight - 6,\r\n };\r\n\r\n // 获取浮动对象\r\n let fcObj = sheet.floatingObjects.get(config.chartId);\r\n\r\n // 浮动对象不存在时\r\n if (fcObj == null || fcObj == undefined) {\r\n // 创建浮动对象\r\n fcObj = new GC.Spread.Sheets.FloatingObjects.FloatingObject(config.chartId, fObjPosition.x, fObjPosition.y, fObjPosition.w, fObjPosition.h);\r\n\r\n // 不允许改变大小、不允许拖动\r\n fcObj.allowResize(false);\r\n fcObj.allowMove(false);\r\n\r\n // 将浮动对象添加到表单\r\n sheet.floatingObjects.add(fcObj);\r\n }\r\n // 浮动对象存在时\r\n else {\r\n fcObj.x(fObjPosition.x);\r\n fcObj.y(fObjPosition.y);\r\n fcObj.width(fObjPosition.w);\r\n fcObj.height(fObjPosition.h);\r\n }\r\n\r\n // 设置浮动对象的内容为divObj(当document.getElementById(config.chartId + '_ec')为null的时候)\r\n if (document.getElementById(config.chartId + '_ec') == null) {\r\n // 创建用于放置ECharts的div容器\r\n const divObj = document.createElement('div');\r\n divObj.setAttribute('style', `background-color:#fff;width:100%;height:100%;`);\r\n divObj.innerHTML = `<div id=\"${config.chartId}_ec\" style=\"width:100%;height:100%;\"></div>`;\r\n\r\n fcObj.content(divObj);\r\n }\r\n\r\n // 定义ECharts对象\r\n let ecObj: echarts.ECharts | null = null;\r\n\r\n // 获取ECharts对象的函数(这里使用到了Promise和setTimeout,原因是:ECharts所在的div可能还没有及时在浮动元素中渲染完成,导致ECharts展示部出来)\r\n const getEcObj = (): any => {\r\n return new Promise((resolve, reject) => {\r\n setTimeout(() => {\r\n // 初始化图表并获取ECharts对象\r\n resolve({ ecObj: EChartsUtils.initChart(spread, sheet, config, isHideChart) });\r\n }, 10);\r\n });\r\n };\r\n ecObj = (await getEcObj()).ecObj;\r\n\r\n return {\r\n fObj: fcObj,\r\n fObjPosition: fObjPosition,\r\n ecObj: ecObj,\r\n };\r\n },\r\n\r\n /**\r\n * 初始化图表\r\n * @param spread 工作簿对象\r\n * @param sheet 工作表对象\r\n * @param config 图表配置\r\n * @param isHideChart 是否隐藏图表\r\n */\r\n initChart: (spread: any, sheet: any, config: EChartsUtilsConfigModel, isHideChart: boolean = false): echarts.ECharts => {\r\n // 此时可能ECharts所在的div还没有渲染(如浮动元素还没有在可视区域的时候是不会创建的)\r\n if (document.getElementById(config.chartId + '_ec') == null) {\r\n return null;\r\n }\r\n\r\n // 获取多条x轴的数组(类似[[1,2,3,4],[1,2,3,4]])\r\n let xDataArr: any = [],\r\n yDataArr: any = [];\r\n\r\n // 获取多条x轴的数组(单元格原始数据,类似[['1.0','2.0','3.0'],['1.0','2.0','3.0']],此数据可能在有些情况下需要使用原始数据,如:原始数据为字符串的1.0,可能需要在x轴显示为1.0这个字符文本)\r\n let xDataArrSource: any = [],\r\n yDataArrSource: any = [];\r\n\r\n /**\r\n * 获取x或y轴单元格的值集合\r\n * @param spread 工作簿对象\r\n * @param sheet 工作表对象\r\n * @param sheetName x轴或y轴数据所在的Sheet名称,如果没有值,则说明是当前操作的Sheet\r\n * @param cells 单元格集合\r\n * @returns 返回x或y轴数据的值集合\r\n */\r\n const getCellVals = (\r\n spread: any,\r\n sheet: any,\r\n sheetName?: string,\r\n cells?: CellModel[]\r\n ): {\r\n dataOneArr: any[];\r\n dataOneSourceArr: any[];\r\n } => {\r\n let retArr: {\r\n dataOneArr: any[];\r\n dataOneSourceArr: any[];\r\n } = {\r\n dataOneArr: [],\r\n dataOneSourceArr: [],\r\n };\r\n\r\n // 获取x或y轴数据所在的Sheet对象(如果sheetName有值,则说明是跨Sheet的)\r\n let curSheet: any = null;\r\n if (sheetName != null && sheetName != undefined && sheetName.length > 0) {\r\n curSheet = spread.getSheetFromName(sheetName);\r\n }\r\n\r\n cells?.forEach((itemCell, indexCell) => {\r\n // 如果单元格的值为数字,就转换为数字,否则在后期参与各个ECharts图表计算的时候会出错\r\n const curCellVal = curSheet != null ? curSheet.getValue(itemCell.row, itemCell.col) : sheet.getValue(itemCell.row, itemCell.col);\r\n retArr.dataOneSourceArr.push(curCellVal);\r\n\r\n // 严格的数字验证(包括科学计数法)\r\n if (/^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$/.test(curCellVal)) {\r\n retArr.dataOneArr.push(Number(curCellVal));\r\n } else {\r\n retArr.dataOneArr.push(curCellVal == null ? 0 : curCellVal);\r\n }\r\n });\r\n\r\n return retArr;\r\n };\r\n\r\n let lineData: EChartsUtilsChartLinesJsonModel[] = JSON.parse(config.chartLinesJson);\r\n lineData.forEach((item, index) => {\r\n let xDataOne: any = [],\r\n yDataOne: any = [];\r\n let xDataOneSource: any = [],\r\n yDataOneSource: any = [];\r\n\r\n const curItemValsX = getCellVals(spread, sheet, item.sheetNameX, item.xCells);\r\n xDataOne = curItemValsX.dataOneArr;\r\n xDataOneSource = curItemValsX.dataOneSourceArr;\r\n const curItemValsY = getCellVals(spread, sheet, item.sheetNameY, item.yCells);\r\n yDataOne = curItemValsY.dataOneArr;\r\n yDataOneSource = curItemValsY.dataOneSourceArr;\r\n\r\n xDataArr.push(xDataOne);\r\n yDataArr.push(yDataOne);\r\n xDataArrSource.push(xDataOneSource);\r\n yDataArrSource.push(yDataOneSource);\r\n });\r\n\r\n // 获取ECharts图表所在div容器\r\n const ecDom = document.getElementById(config.chartId + '_ec') as HTMLElement;\r\n\r\n // 获取ECharts对象\r\n let ecObj = echarts.getInstanceByDom(ecDom);\r\n if (ecObj == null || ecObj == undefined) {\r\n ecObj = echarts.init(ecDom, null, {\r\n renderer: 'canvas',\r\n useDirtyRect: false,\r\n });\r\n }\r\n\r\n let option;\r\n\r\n if (config.chartType == 10) {\r\n option = EChartsUtilsAll.chart10(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 11) {\r\n option = EChartsUtilsAll.chart11(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 12) {\r\n option = EChartsUtilsAll.chart12(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 13) {\r\n option = EChartsUtilsAll.chart13(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 14) {\r\n option = EChartsUtilsAll.chart14(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 15) {\r\n option = EChartsUtilsAll.chart15(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 16) {\r\n option = EChartsUtilsAll.chart16(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 30) {\r\n option = EChartsUtilsAll.chart30(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 50) {\r\n option = EChartsUtilsAll.chart50(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 70) {\r\n option = EChartsUtilsAll.chart70(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 90) {\r\n option = EChartsUtilsAll.chart90(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 110) {\r\n option = EChartsUtilsAll.chart110(config, xDataArr, yDataArr, xDataArrSource, yDataArrSource);\r\n } else if (config.chartType == 130) {\r\n option = EChartsUtilsAll.chart130(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 150) {\r\n option = EChartsUtilsAll.chart150(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 170) {\r\n option = EChartsUtilsAll.chart170(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 190) {\r\n option = EChartsUtilsAll.chart190(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 210) {\r\n option = EChartsUtilsAll.chart210(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 230) {\r\n option = EChartsUtilsAll.chart230(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 250) {\r\n option = EChartsUtilsAll.chart250(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 270) {\r\n option = EChartsUtilsAll.chart270(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 279 || config.chartType == 280 || config.chartType == 281) {\r\n option = EChartsUtilsAll.chart279_280_281(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 290) {\r\n option = EChartsUtilsAll.chart290(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 310) {\r\n option = EChartsUtilsAll.chart310(config, xDataArr, yDataArr);\r\n } else if (config.chartType == 330) {\r\n option = EChartsUtilsAll.chart330(config, xDataArr, yDataArr, sheet);\r\n } else if (config.chartType == 350) {\r\n option = EChartsUtilsAll.chart350(config, xDataArr, yDataArr);\r\n }\r\n\r\n if (option && typeof option === 'object') {\r\n //如果是隐藏的图表,则需要禁用ECharts的动画效果\r\n //原因是:如果ECharts使用了动画效果,图表渲染完成可能需要0.5秒,但是在导出ECharts统计图为图片的场景下时,可能在图表还没有渲染完成(动画效果还没结束)前就要获取图像了,此时可能就会造成获取到的图像内容丢失的情况\r\n if (isHideChart) {\r\n option.animation = false;\r\n }\r\n\r\n ecObj.setOption(option);\r\n }\r\n\r\n ecObj.setOption(option);\r\n\r\n return ecObj;\r\n },\r\n\r\n /**\r\n * 获取ECharts对象\r\n * @param chartId 图表ID\r\n * @returns 返回ECharts对象,如果不存在则返回null\r\n */\r\n getEChartsObj: (chartId: string): echarts.ECharts | null => {\r\n // 获取ECharts图表所在div容器\r\n const ecDom = document.getElementById(chartId + '_ec') as HTMLElement;\r\n\r\n // 获取ECharts对象\r\n let ecObj = echarts.getInstanceByDom(ecDom);\r\n if (ecObj == null || ecObj == undefined) {\r\n return null;\r\n }\r\n\r\n return ecObj;\r\n },\r\n};\r\n","// 导出Excel文件所需的第三方包\r\nimport { saveAs } from 'file-saver';\r\nimport { RegisterFontModel } from '../types/wookbook';\r\n\r\n/**\r\n * SpreadJS工作簿工具函数属性\r\n */\r\nexport const WorkbookUtils = {\r\n /**\r\n * 加载在线sjs文件\r\n * @param spread 工作簿对象\r\n * @param fileUrl 在线sjs文件地址\r\n * @param succFunc 文件打开成功后的回调函数,返回的第一个参数为spread工作簿对象\r\n * @param errorFunc 文件打开失败后的回调函数,返回的第一个参数为错误信息\r\n */\r\n loadSjsFile: async (spread: any, fileUrl: string, succFunc?: (spreadObj) => Promise<void>, errorFunc?: (error) => Promise<void>): Promise<void> => {\r\n // 获取文件响应结果\r\n const response = await fetch(fileUrl, { method: 'GET' });\r\n\r\n // 获取成功\r\n if (response.ok) {\r\n // 文件的字节流对象\r\n const blob = await response.blob();\r\n // 将Blob转换为File或Blob对象\r\n // const file = new File([blob], 'template.sjs', { type: 'application/octet-stream' });\r\n const sjsBlob = new Blob([blob], { type: 'application/zip' });\r\n\r\n // SpreadJS打开文件\r\n spread.open(\r\n sjsBlob,\r\n async () => {\r\n if (typeof succFunc === 'function') {\r\n await succFunc(spread);\r\n\r\n // // 或者使用then回调\r\n // succFunc(spread).then((ret) => {\r\n // // return ret;\r\n // });\r\n }\r\n },\r\n async (e: any) => {\r\n if (typeof errorFunc === 'function') {\r\n await errorFunc(e);\r\n }\r\n }\r\n );\r\n }\r\n },\r\n\r\n /**\r\n * 获取工作簿的Blob对象\r\n * @param spread 工作簿实例\r\n * @returns 返回异步的Promise对象(Blob对象)\r\n * @example\r\n * const saveSpread = async (spread: any) => {\r\n * try {\r\n * const blob = await WorkbookUtils.getWookbookBlob(spread);\r\n * console.log('获取成功:', blob);\r\n * } catch (error) {\r\n * console.error('获取失败:', error);\r\n * }\r\n * };\r\n */\r\n getWookbookBlob: async (spread: any): Promise<Blob> => {\r\n return new Promise((resolve, reject) => {\r\n spread.save(\r\n // 成功回调\r\n (blob) => resolve(blob),\r\n // 失败回调\r\n (error) => reject(error)\r\n );\r\n });\r\n },\r\n\r\n /**\r\n * 打印所有工作表\r\n * @param GC GC对象\r\n * @param spread 工作簿实例\r\n */\r\n print: (GC: any, spread: any) => {\r\n // 得到Sheet个数\r\n const sheetCount = spread.getSheetCount();\r\n\r\n for (let i = 0; i < sheetCount; i++) {\r\n const sheet = spread.getSheet(i);\r\n\r\n // 获取每个工作表的打印信息\r\n let printInfo = sheet.printInfo();\r\n\r\n // 隐藏行和列的头部信息\r\n printInfo.showRowHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide);\r\n printInfo.showColumnHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide);\r\n\r\n // // 显示和隐藏打印区域的辅助线\r\n // spread.getSheet(0).isPrintLineVisible(true);\r\n // spread.getSheet(0).isPrintLineVisible(!true);\r\n\r\n // 设置打印区域,这里是固定的,在业务应用中需要根据实际情况修改打印区域\r\n printInfo.rowStart(0);\r\n printInfo.rowEnd(sheet.getRowCount()); //printInfo.rowEnd(41);\r\n printInfo.columnStart(0);\r\n printInfo.columnEnd(76);\r\n\r\n // 设置SpreadJS自身的边距为合适的距离\r\n printInfo.margin({\r\n /**\r\n * 设置默认边距\r\n * 单位是:以百分之一英寸为单位\r\n * 也就是,如果我们需要设置左边距为25mm,需要将25mm先转换为英寸,然后再用这个英寸*100就是要设置的边距\r\n * 即:(25mm转换为英寸的结果)*100\r\n *\r\n * 参考文档:\r\n * https://demo.grapecity.com.cn/spreadjs/help/api/classes/GC.Spread.Sheets.Print.PrintInfo#margin\r\n * https://www.67tool.com/converter/length\r\n */\r\n // 纵表\r\n top: 0.5905511999999999 * 100,\r\n bottom: 0.5905511999999999 * 100,\r\n left: 0.9842520000000001 * 100,\r\n right: 0.5905511999999999 * 100,\r\n\r\n // // 横表\r\n // top: 0.9842520000000001 * 100,\r\n // bottom: 0.5905511999999999 * 100,\r\n // left: 0.5905511999999999 * 100,\r\n // right: 0.5905511999999999 * 100,\r\n\r\n // top: 0,\r\n // bottom: 0,\r\n // left: 0,\r\n // right: 0,\r\n header: 0,\r\n footer: 0,\r\n });\r\n\r\n // 设置打印的纸张\r\n printInfo.paperSize(new GC.Spread.Sheets.Print.PaperSize(GC.Spread.Sheets.Print.PaperKind.a4));\r\n\r\n sheet.printInfo(printInfo);\r\n }\r\n\r\n // 调用打印方法\r\n spread.print();\r\n },\r\n\r\n /**\r\n * 导出为Excel文件\r\n * 如支持导出自定义公式的值等功能\r\n * @param GC Spread的GC对象\r\n * @param spread 原始Spread对象\r\n * @param fileName 导出的文件名称,不传则为第一个工作表的名称\r\n */\r\n exportToExcel: (GC: any, spread: any, fileName: string = '') => {\r\n // 导出模板为JSON对象,此处设置了参数includeBindingSource,改参数代表包含数据绑定的值\r\n const json = spread.toJSON({ includeBindingSource: true });\r\n\r\n // 需要移除的自定义公式名称集合(该变量的作用是,在导出Excel前,将工作簿中所有的自定义公式移除掉,其他内置的公式保留)\r\n const removeCustomFormulas = ['YJMAX', 'YJMIN', 'YJMID', 'YJGETNUM', 'YJGETS', 'YJGETCV', 'YJINTERPOLATIONMETHOD', 'YJINTERPOLATIONMETHOD_Y'];\r\n\r\n // 临时工作簿\r\n const tempSpread = new GC.Spread.Sheets.Workbook();\r\n tempSpread.fromJSON(json);\r\n\r\n // 暂停绘制\r\n tempSpread.suspendPaint();\r\n\r\n // 获取Sheet数量\r\n const sheetCount = tempSpread.getSheetCount();\r\n\r\n for (let iSheet = 0; iSheet < sheetCount; iSheet++) {\r\n // 当前工作表\r\n const sheet = tempSpread.getSheet(iSheet);\r\n\r\n // 暂停公式的计算,提高性能\r\n sheet.suspendCalcService();\r\n\r\n for (var i = 0; i < sheet.getRowCount(); i++) {\r\n for (var j = 0; j < sheet.getColumnCount(); j++) {\r\n // 获取单元格的公式\r\n const cellFormula = sheet.getFormula(i, j);\r\n\r\n // 如果cellFormula不为null或undefined,则说明该单元格引用了公式\r\n if (cellFormula != null && cellFormula != undefined && removeCustomFormulas.some((item) => cellFormula.indexOf(item) > -1)) {\r\n // 获取单元格的值\r\n const cellVal = sheet.getValue(i, j);\r\n\r\n // 移除单元格引用的公式\r\n sheet.getCell(i, j).formula(undefined);\r\n\r\n // 设置单元格的值\r\n sheet.setValue(i, j, cellVal);\r\n }\r\n }\r\n }\r\n\r\n // 恢复计算\r\n sheet.resumeCalcService(false);\r\n }\r\n\r\n // 恢复绘制\r\n tempSpread.resumePaint();\r\n\r\n if (fileName == '') {\r\n fileName = tempSpread.getSheet(0).name();\r\n }\r\n\r\n let options = {\r\n fileType: GC.Spread.Sheets.FileType.excel,\r\n includeBindingSource: true,\r\n includeStyles: true,\r\n includeFormulas: true,\r\n saveAsView: false,\r\n rowHeadersAsFrozenColumns: false,\r\n columnHeadersAsFrozenRows: false,\r\n includeAutoMergedCells: false,\r\n includeCalcModelCache: false,\r\n includeUnusedNames: true,\r\n includeEmptyRegionCells: true,\r\n };\r\n\r\n tempSpread.export(\r\n (blob: any) => {\r\n saveAs(blob, `${fileName}.xlsx`);\r\n },\r\n () => {},\r\n options\r\n );\r\n\r\n // 销毁临时工作簿\r\n tempSpread.destroy();\r\n },\r\n\r\n /**\r\n * 合并多个工作簿并导出Excel(同时返回合并后的工作簿实例)\r\n * @param GC Spread的GC对象\r\n * @param spreads 工作簿实例集合\r\n * @param isExcel 是否导出为Excel文件,默认为true(如果为false,则导出为PDF)\r\n * @param exportName 导出的文件名称,不传则为第一个Sheet的名称\r\n * @param regFonts 注册的字体集合,默认注册宋体和Arial字体\r\n * @returns 合并后的工作簿实例\r\n */\r\n mergeWorkbooksToExcelOrPdf: async (\r\n GC: any,\r\n spreads: any[],\r\n isExcel: boolean = true,\r\n exportName?: string,\r\n regFonts: RegisterFontModel[] = [\r\n { name: '宋体', type: 'normal', url: '/spreadJsFonts/simsun.ttf' },\r\n { name: 'Arial', type: 'normal', url: '/spreadJsFonts/arial.ttf' },\r\n ]\r\n ) => {\r\n if (!spreads || spreads.length == 0) {\r\n return;\r\n }\r\n\r\n // 导出PDF的时候,注册字体(必须在初始化Workbook前注册)\r\n if (!isExcel) {\r\n await WorkbookUtils.registerFont(GC, regFonts);\r\n }\r\n\r\n // 主工作簿\r\n const mainWorkbook = new GC.Spread.Sheets.Workbook();\r\n\r\n // 暂停绘制\r\n mainWorkbook.suspendPaint();\r\n\r\n mainWorkbook.fromJSON(spreads[0].toJSON());\r\n\r\n for (let i = 1; i < spreads.length; i++) {\r\n // 临时工作簿\r\n const tempSpread = new GC.Spread.Sheets.Workbook();\r\n\r\n // 暂停绘制\r\n tempSpread.suspendPaint();\r\n\r\n tempSpread.fromJSON(spreads[i].toJSON());\r\n\r\n // 重命名样式表\r\n const styleSign = i + '';\r\n tempSpread.getNamedStyles().forEach(function (namedStyle) {\r\n namedStyle.name = `new_${styleSign}_${namedStyle.name}`;\r\n mainWorkbook.addNamedStyle(namedStyle);\r\n });\r\n\r\n // 当前临时工作簿的第一个工作表\r\n let tempSheet = tempSpread.getSheet(0);\r\n // 导出为JSON字符串\r\n let tempSheetJSON = JSON.stringify(tempSheet.toJSON());\r\n // 替换当前JSON字符串的style或parentName配置,目的是重命名样式名称,和上述的tempSpread重命名样式表保持一致\r\n tempSheetJSON = tempSheetJSON.replace(/\"style\":\"/g, '\"style\":\"new_' + styleSign + '_');\r\n tempSheetJSON = tempSheetJSON.replace(/\"parentName\":\"/g, '\"parentName\":\"new_' + styleSign + '_');\r\n\r\n // 创建新的工作表并添加到主工作簿中\r\n let newSheet = new GC.Spread.Sheets.Worksheet(`newSheet${styleSign}_`);\r\n mainWorkbook.addSheet(mainWorkbook.getSheetCount(), newSheet);\r\n newSheet.fromJSON(JSON.parse(tempSheetJSON));\r\n\r\n // 获取新创建的工作表newSheet的行数\r\n const newSheetRowCount = newSheet.getRowCount();\r\n\r\n // 当前操作的主工作簿的Sheet\r\n const curMainSheet = mainWorkbook.getSheet(0);\r\n\r\n // 如果是表尾,则在表单的最后一行开始添加\r\n curMainSheet.addRows(curMainSheet.getRowCount(), newSheetRowCount);\r\n\r\n // 设置复制和粘贴的范围\r\n let pastedRangesStartRow = curMainSheet.getRowCount() - newSheetRowCount;\r\n\r\n const fromRanges = [new GC.Spread.Sheets.Range(-1, -1, -1, -1)],\r\n pastedRanges = [new GC.Spread.Sheets.Range(pastedRangesStartRow, 0, newSheetRowCount, newSheet.getColumnCount())];\r\n mainWorkbook.commandManager().execute({\r\n cmd: 'clipboardPaste',\r\n sheetName: curMainSheet.name(), //此参数的作用是:粘贴到某个名称的Sheet中\r\n fromSheet: newSheet,\r\n fromRanges: fromRanges,\r\n pastedRanges: pastedRanges,\r\n isCutting: false,\r\n clipboardText: '',\r\n pasteOption: GC.Spread.Sheets.ClipboardPasteOptions.all,\r\n });\r\n\r\n // 删除最后的Sheet,也就是newSheet对象\r\n mainWorkbook.removeSheet(mainWorkbook.getSheetCount() - 1);\r\n\r\n // 取消选中状态\r\n curMainSheet.clearSelection();\r\n\r\n // 恢复绘制\r\n tempSpread.resumePaint();\r\n\r\n // 销毁临时工作簿\r\n tempSpread.destroy();\r\n }\r\n\r\n // 获取当前活动的工作表\r\n const sheet = mainWorkbook.getActiveSheet();\r\n\r\n // 设置缩放比为1\r\n sheet.zoom(1);\r\n\r\n // 隐藏行和列的头部\r\n sheet.options.rowHeaderVisible = true;\r\n sheet.options.colHeaderVisible = true;\r\n\r\n // 隐藏Tab、水平和垂直的滚动条\r\n mainWorkbook.options.tabStripVisible = true;\r\n mainWorkbook.options.showHorizontalScrollbar = true;\r\n mainWorkbook.options.showVerticalScrollbar = true;\r\n\r\n // 滚动条是否与活动工作表的最后一行和最后一列对齐(避免滚动的时候出现灰色区域)\r\n mainWorkbook.options.scrollbarMaxAlign = false;\r\n\r\n // 导出PDF时\r\n if (!isExcel) {\r\n // 获取最后一个要打印的PDF工作表\r\n const pdfSheet = mainWorkbook.getSheet(mainWorkbook.getSheetCount() - 1);\r\n let printInfo = pdfSheet.printInfo();\r\n printInfo.margin({ top: 0, bottom: 0, left: 0, right: 0, header: 0, footer: 0 });\r\n printInfo.showBorder(false);\r\n printInfo.showGridLine(false);\r\n printInfo.blackAndWhite(false);\r\n printInfo.showRowHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide);\r\n printInfo.showColumnHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide);\r\n printInfo.zoomFactor(1.06); //1.06\r\n }\r\n\r\n // 恢复绘制\r\n mainWorkbook.resumePaint();\r\n\r\n // 导出Excel文件\r\n if (isExcel) {\r\n WorkbookUtils.exportToExcel(GC, mainWorkbook, exportName);\r\n } else {\r\n mainWorkbook.savePDF(function (blob) {\r\n saveAs(blob, `${exportName && exportName.length > 0 ? exportName : '文件'}.pdf`);\r\n }, console.log);\r\n }\r\n\r\n return mainWorkbook;\r\n },\r\n\r\n /**\r\n * 注册字体(主要为导出PDF使用)\r\n * @param GC Spread的GC对象\r\n * @param regFonts 字体配置集合\r\n */\r\n registerFont: async (GC: any, regFonts: RegisterFontModel[]) => {\r\n // 基于fetch\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n if (!regFonts || regFonts.length == 0) {\r\n resolve(null);\r\n }\r\n\r\n for (let i = 0; i < regFonts.length; i++) {\r\n const font = regFonts[i];\r\n\r\n const response = await fetch(font.url, { method: 'GET' });\r\n\r\n if (response.ok) {\r\n const blob = await response.blob();\r\n\r\n var reader = new FileReader();\r\n reader.readAsArrayBuffer(blob);\r\n reader.onload = function (e) {\r\n var fontArrayBuffer = reader.result;\r\n\r\n var fonts = {};\r\n fonts[font.type] = fontArrayBuffer;\r\n GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(font.name, fonts);\r\n\r\n resolve(blob);\r\n };\r\n }\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n\r\n // 基于XMLHttpRequest\r\n // return new Promise((resolve, reject) => {\r\n // try {\r\n // if (!regFonts || regFonts.length == 0) {\r\n // resolve(null);\r\n // }\r\n\r\n // for (let i = 0; i < regFonts.length; i++) {\r\n // const font = regFonts[i];\r\n\r\n // var xhr = new XMLHttpRequest();\r\n // xhr.open('GET', font.url, true);\r\n // xhr.responseType = 'blob';\r\n\r\n // xhr.onload = function (e) {\r\n // if (this.status == 200) {\r\n // var blob = this.response;\r\n\r\n // var reader = new FileReader();\r\n // reader.onload = function (e) {\r\n // var fontArrayBuffer = reader.result;\r\n\r\n // var fonts = {};\r\n // fonts[font.type] = fontArrayBuffer;\r\n // GC.Spread.Sheets.PDF.PDFFontsManager.registerFont(font.name, fonts);\r\n\r\n // resolve(blob);\r\n // };\r\n // reader.readAsArrayBuffer(blob);\r\n // }\r\n // };\r\n\r\n // xhr.send();\r\n // }\r\n // } catch (error) {\r\n // reject(error);\r\n // }\r\n // });\r\n },\r\n};\r\n"],"names":["__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","SuppressedError","CommonUtils","getFileBlob","fileUrl","response","fetch","method","ok","blob","getColLetterName","colIndex","letter","remainder","String","fromCharCode","Math","floor","toUpperCase","SheetUtils","getActiveSheetSelectCells","spread","getActiveSheet","getSelections","setActiveSheetSelectCells","cellObj","setSelection","row","col","rowCount","colCount","getAllCellObjsByRange","sheet","selectRange","isMulColOrder","getAllCellObjsByRanges","selectRanges","allCellObjs","forEach","item","index","getSpans","itemSpanCell","push","undefined","Error","i","j","getSpan","orderByJson","getSheetAllCellObjs","curSheetCellRange","getRowCount","getColumnCount","getSheetSelectCellObjs","getActiveSheetSelectCellObjs","getSheetCellObjsByGroup","cellRange","groupType","suspendPaint","valCells","groupByCells","groupByJson","retCells","forEachJson","curGroupCells","key","source","resumePaint","getSheetSelectVals","nullUndefinedReplaceVal","selectCells","selectCellVals","cell","cellVal","getValue","getActiveSheetSelectVals","getSheetRangeValsByGroup","retVals","curVals","getCellType","GC","cellTypeName","cellType","Spread","Sheets","CellTypes","Button","RadioButtonList","CheckBox","CheckBoxList","HyperLink","ComboBox","cellStyle","getStyle","cellButtons","length","command","dropDowns","option","showDateRange","setSheetZoom","scale","sheetCount","getSheetCount","getSheet","zoom","setActiveSheetSelectBgColor","color","sel","getRange","backColor","setSheetBgColor","cells","setSheetShowPrintPageLine","isShow","isPrintLineVisible","ignoreSheetShowStrs","ignoreStrs","ignorePaint","Text","prototype","paint","ctx","x","y","w","h","style","options","some","call","this","arguments","setSheetAuxiliaryLine","width","height","lineWidth","colorStr","isHb","floatBottom","FloatingObjects","FloatingObject","floatRight","divBottom","document","createElement","divRight","borderBottom","borderLeft","allowResize","allowMove","content","floatingObjects","add","setActiveSheetWatermark","getCell","watermark","title","setBindingPath","pathPrev","pathField","setSheetCellDate","isAutoSize","Style","imageType","ButtonImageType","dropdown","type","DropDownType","dateTimePicker","showTime","formatter","dateFormat","shrinkToFit","setStyle","getRangeStr","BusinessUtils","createTestObjectAttrsCells","gc","testObjectAttrs","isVertical","contentColStartIndex","contentTotalColCount","addRowHeight","titleCellColumnCount","titleCellValColumnCount","testObjectAttrsChunk","chunkJson","setRowCount","rowAttrArr","totalRowCount","addRows","setRowHeight","SheetArea","viewport","addRowRange","setBorder","LineBorder","LineStyle","thin","all","medium","left","right","hAlign","HorizontalAlign","center","vAlign","addSpan","setValue","colIndexTitle","colIndexValue","getTestObjectAttrsVals","rowTestObjectCount","allCells","allCellsChunk","newAllCellsChunk","retData","attrObjs","attrObj","fieldName","EChartsUtilsComm","getRound","roundingVal","accuracy","valIsNegative","abs","inputValStr","toString","indexOf","intVal","parseInt","split","decimalStr","parseFloat","coefficient","retNum","inputVal","decimalStrFirst","substring","calcRoundingRet","Number","toFixed","accuracyStr","retNumStr","zeroStr","xsPart","calcTrend","xVal","n","sumX","sumY","sumXY","sumXX","slope","intercept","gs","xl","jj","filterNullEmptyErrArray","dataSource","filter","_error","EChartsUtilsAll","chart10","config","xDataArr","yDataArr","lineJson","JSON","parse","chartLinesJson","chartExtJson","xDataSource","yDataSource","dxsJs","xData","yData","test","xMin","min","xMax","max","yMin","yMax","xAxisMax","xAxisMin","yAxisMax","yAxisMin","seriesData","points","A","N","matrix","math","pow","vandermondeMatrix","AT","transpose","ATA","multiply","ATb","coefficients","lusolve","valueOf","err","funequation","arrX","arrY","temp","maxIndex","findIndex","xName","chartXName","yName","chartYName","includes","symbol","peakvalue","coordX","lqhhlKs","lqhhlJs","lqhhlSc1","lineData","pointData","coord","lineStyle","xAxis","yAxis","symbolOffset","label","show","data","itemStyle","yValIsAllNull","every","ele","grid","top","bottom","containLabel","tooltip","trigger","datas","ticket","seriesName","text","textStyle","fontSize","fontWeight","legend","selected","legendName","selectedMode","axisTick","alignWithLabel","splitLine","name","nameGap","nameRotate","nameLocation","axisLine","series","smooth","symbolSize","lineColor","markPoint","markLine","chart11","ceil","upperLimit","lowerLimit","lqhhlSx","curVal","lqhhlXx","ifHaveIntersectionPoint","y1","y2","y3","y4","getIntersectionPoint","upperIntersectionPoint","lowerIntersectionPoint","upperIntersectionPointTrend","lowerIntersectionPointTrend","index1","validX1","validX2","chart12","avg","avgXIndex","chart13","chart14","chart15","chart16","lines","lqhhlHz","yAxisData","map","isNaN","lqhhlSc2","axisLabel","chart30","jsIsJz","isTwoLine","xDataSource1","xDataSource2","yDataSource1","yDataSource2","chartTitle","lineFunc","isShowMarkPoint","isShowMarkLine","isTwoLineData","cellValJzZjhsl","cellValJzZdgmd","trunc","jsZjhslJz","jsZdgmdJz","outJdZjhsl","outJdZdgmd","outValZjhsl","outValZdgmd","jsZjhslJd","jsZdgmdJd","jsZjhsl","jsZdgmd","coordY","markPointObj","markLineObj","seriesDataObj","maxPointData","lineObj2","maxPointDataX","maxPointDataY","lineObj1","chart50","xDataSourceOld","yDataSourceOld","yDataSourceSxOld","yDataSourceXxOld","allData","ySx","yXx","sort","a","b","yDataSourceSx","yDataSourceXx","sxValNullCount","xDataSx","xDataXx","markLineData","val045","getLineObj","lineType","obj","z","connectNulls","silent","position","nullCount","xObj","splitNumber","chart70","ztzl","cllx","logx","logy","curZtzl","jxhslZtzl","curCllx","jxhslCllx","item1","log","item2","abk","ack","dropName","getYOnLine","point1","point2","point3X","logX1","logY1","logX2","logY","exp","zero_ab","zero_ac","HpCoordinates","wl","hp","scHp","scWl","scWp","point_hp","Dy","Dylog","hp0_xab","hp0_xac","hp0_xcenter","Dxlog","adk","wly","wlx","wpy","wpx","wp","hpy2","hpylog2","hp0_xab2","hp0_xac2","hp0_xcenter2","outJdHp","outJdWl","outJdWp","jxhslScHpJd","jxhslScWlJd","jxhslScWpJd","jxhslScHp","jxhslScWl","jxhslScWp","interval","param","minMargin","chart90","xDataCl","yDataSourceCl","markPointData","gsS","jxhslSnShScfc","yDataCopy","curYData","eval","replace","opacity","val","chart110","xDataArrSource","yDataArrSource","curXName","chart130","logBase","inverse","chart150","chart170","chart190","_code","chart210","arr","uniqueData","self","t","getXline","chart230","lineCount","xDataSource3","yDataSource3","xData1","xData2","xData3","getHours","getMinutes","curArr","curItemMins","unshift","getxAxisObj","xAxisData","legendData","legendSelected","xValIsAllNull","topmargin","chart250","xmin","xmax","chart270","chart279_280_281","jjNum","chartType","chart290","chart310","yDataCl","chart330","wd015","wd019","wd025","wd031","Infinity","wdBh","wdYs","bszdjBh","bszdjYs","chart350","jsN","hsl","yVal1","yVal2","yVal25","isAllNull","seriesObjs","EChartsUtils","create","GC_1","spread_1","sheet_1","config_1","args_1","isHideChart","isShowCon","isShowVal","remove","chartId","allRowsTotalHeight","allRowsTotalWidth","allRowsTotalLeft","chartCellHeight","getRowHeight","colHeader","getColumnWidth","rowHeader","fObjPosition","fcObj","get","getElementById","divObj","setAttribute","innerHTML","ecObj","setTimeout","initChart","fObj","getCellVals","sheetName","retArr","dataOneArr","dataOneSourceArr","curSheet","getSheetFromName","itemCell","indexCell","curCellVal","xDataOne","yDataOne","xDataOneSource","yDataOneSource","curItemValsX","sheetNameX","xCells","curItemValsY","sheetNameY","yCells","ecDom","echarts","getInstanceByDom","init","renderer","useDirtyRect","animation","setOption","getEChartsObj","WorkbookUtils","loadSjsFile","succFunc","errorFunc","sjsBlob","Blob","open","getWookbookBlob","save","error","print","printInfo","showRowHeader","Print","PrintVisibilityType","hide","showColumnHeader","rowStart","rowEnd","columnStart","columnEnd","margin","header","footer","paperSize","PaperSize","PaperKind","a4","exportToExcel","fileName","json","toJSON","includeBindingSource","removeCustomFormulas","tempSpread","Workbook","fromJSON","iSheet","suspendCalcService","cellFormula","getFormula","formula","resumeCalcService","fileType","FileType","excel","includeStyles","includeFormulas","saveAsView","rowHeadersAsFrozenColumns","columnHeadersAsFrozenRows","includeAutoMergedCells","includeCalcModelCache","includeUnusedNames","includeEmptyRegionCells","export","saveAs","destroy","mergeWorkbooksToExcelOrPdf","spreads_1","spreads","isExcel","exportName","regFonts","url","registerFont","mainWorkbook","styleSign","getNamedStyles","namedStyle","addNamedStyle","tempSheet","tempSheetJSON","stringify","newSheet","Worksheet","addSheet","newSheetRowCount","curMainSheet","pastedRangesStartRow","fromRanges","Range","pastedRanges","commandManager","execute","cmd","fromSheet","isCutting","clipboardText","pasteOption","ClipboardPasteOptions","removeSheet","clearSelection","rowHeaderVisible","colHeaderVisible","tabStripVisible","showHorizontalScrollbar","showVerticalScrollbar","scrollbarMaxAlign","showBorder","showGridLine","blackAndWhite","zoomFactor","savePDF","console","font","reader","FileReader","readAsArrayBuffer","onload","fontArrayBuffer","fonts","PDF","PDFFontsManager"],"mappings":"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","x_google_ignoreList":[0]}