rapid-spreadjs 1.0.15 → 1.0.16

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.cjs.min.js","sources":["../src/utils/common.ts","../src/utils/sheet.ts","../src/utils/wookbook.ts"],"sourcesContent":["/**\r\n * 公用工具函数属性\r\n */\r\nexport const CommonUtils = {\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 { orderByJson } 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 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 * 获取某工作表选中单元格的值集合\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 * 获取单元格类型名称\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","// 导出Excel文件所需的第三方包\r\nimport { saveAs } from \"file-saver\";\r\n\r\n/**\r\n * SpreadJS工作簿工具函数属性\r\n */\r\nexport const WorkbookUtils = {\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(\r\n GC.Spread.Sheets.Print.PrintVisibilityType.hide\r\n );\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(\r\n new GC.Spread.Sheets.Print.PaperSize(\r\n GC.Spread.Sheets.Print.PaperKind.a4\r\n )\r\n );\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 = [\r\n \"YJMAX\",\r\n \"YJMIN\",\r\n \"YJMID\",\r\n \"YJGETNUM\",\r\n \"YJGETS\",\r\n \"YJGETCV\",\r\n \"YJINTERPOLATIONMETHOD\",\r\n \"YJINTERPOLATIONMETHOD_Y\",\r\n ];\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 (\r\n cellFormula != null &&\r\n cellFormula != undefined &&\r\n removeCustomFormulas.some((item) => cellFormula.indexOf(item) > -1)\r\n ) {\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"],"names":["CommonUtils","getColLetterName","colIndex","letter","remainder","String","fromCharCode","Math","floor","toUpperCase","SheetUtils","getActiveSheetSelectCells","spread","getActiveSheet","getSelections","setActiveSheetSelectCells","cellObj","setSelection","row","col","rowCount","colCount","getAllCellObjsByRanges","sheet","selectRanges","isMulColOrder","allCellObjs","forEach","item","index","getSpans","itemSpanCell","push","undefined","Error","i","j","getSpan","orderByJson","getSheetAllCellObjs","curSheetCellRange","getRowCount","getColumnCount","getSheetSelectCellObjs","getActiveSheetSelectCellObjs","getSheetSelectVals","nullUndefinedReplaceVal","selectCells","selectCellVals","cell","cellVal","getValue","getActiveSheetSelectVals","getCellType","GC","cellTypeName","cellType","Spread","Sheets","CellTypes","Button","RadioButtonList","CheckBox","CheckBoxList","HyperLink","ComboBox","cellStyle","getStyle","cellButtons","length","command","dropDowns","option","showDateRange","setSheetZoom","scale","suspendPaint","sheetCount","getSheetCount","getSheet","zoom","resumePaint","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","WorkbookUtils","print","printInfo","showRowHeader","Print","PrintVisibilityType","hide","showColumnHeader","rowStart","rowEnd","columnStart","columnEnd","margin","top","bottom","left","right","header","footer","paperSize","PaperSize","PaperKind","a4","exportToExcel","fileName","json","toJSON","includeBindingSource","removeCustomFormulas","tempSpread","Workbook","fromJSON","iSheet","suspendCalcService","cellFormula","getFormula","indexOf","formula","setValue","resumeCalcService","name","fileType","FileType","excel","includeStyles","includeFormulas","saveAsView","rowHeadersAsFrozenColumns","columnHeadersAsFrozenRows","includeAutoMergedCells","includeCalcModelCache","includeUnusedNames","includeEmptyRegionCells","export","blob","saveAs","destroy"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.min.js","sources":["../src/utils/common.ts","../src/utils/ext-echarts-all.ts","../src/utils/ext-echarts.ts","../src/utils/sheet.ts","../src/utils/wookbook.ts"],"sourcesContent":["/**\r\n * 公用工具函数属性\r\n */\r\nexport const CommonUtils = {\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/ext-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/ext-echarts';\r\nimport { EChartsUtilsAll } from './ext-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: (\r\n GC: any,\r\n spread: any,\r\n sheet: any,\r\n config: EChartsUtilsConfigModel,\r\n isHideChart: boolean = false\r\n ): {\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 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 const ecObj = EChartsUtils.initChart(spread, sheet, config, isHideChart);\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 // 获取多条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","// 导入rapid-utils中的函数(注意:需要在tsconfig.json文件中设置moduleResolution为node,否则会提示:找不到模块“rapid-utils”。你的意思是要将 \"moduleResolution\" 选项设置为 \"nodenext\",还是要将别名添加到 \"paths\" 选项中?ts(2792))\r\nimport { orderByJson } 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 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 * 获取某工作表选中单元格的值集合\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 * 获取单元格类型名称\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","// 导出Excel文件所需的第三方包\r\nimport { saveAs } from \"file-saver\";\r\n\r\n/**\r\n * SpreadJS工作簿工具函数属性\r\n */\r\nexport const WorkbookUtils = {\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(\r\n GC.Spread.Sheets.Print.PrintVisibilityType.hide\r\n );\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(\r\n new GC.Spread.Sheets.Print.PaperSize(\r\n GC.Spread.Sheets.Print.PaperKind.a4\r\n )\r\n );\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 = [\r\n \"YJMAX\",\r\n \"YJMIN\",\r\n \"YJMID\",\r\n \"YJGETNUM\",\r\n \"YJGETS\",\r\n \"YJGETCV\",\r\n \"YJINTERPOLATIONMETHOD\",\r\n \"YJINTERPOLATIONMETHOD_Y\",\r\n ];\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 (\r\n cellFormula != null &&\r\n cellFormula != undefined &&\r\n removeCustomFormulas.some((item) => cellFormula.indexOf(item) > -1)\r\n ) {\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"],"names":["CommonUtils","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","length","calcRoundingRet","Number","toFixed","accuracyStr","retNumStr","zeroStr","index","xsPart","calcTrend","x","y","xVal","n","sumX","sumY","sumXY","sumXX","i","slope","intercept","gs","xl","jj","filterNullEmptyErrArray","dataSource","filter","item","undefined","_error","EChartsUtilsAll","chart10","config","xDataArr","yDataArr","sheet","lineJson","JSON","parse","chartLinesJson","chartExtJson","xDataSource","yDataSource","dxsJs","xData","yData","forEach","test","push","xMin","min","xMax","max","yMin","yMax","xAxisMax","xAxisMin","yAxisMax","yAxisMin","seriesData","points","A","N","matrix","row","j","math","pow","vandermondeMatrix","AT","transpose","ATA","multiply","ATb","result","coefficients","lusolve","valueOf","err","funequation","arrX","arrY","temp","maxIndex","findIndex","value","xName","chartXName","yName","chartYName","includes","symbol","peakvalue","coordX","lqhhlKs","setValue","col","lqhhlJs","lqhhlSc1","lineData","pointData","coord","lineStyle","color","type","xAxis","yAxis","symbolOffset","label","show","formatter","data","itemStyle","yValIsAllNull","every","ele","grid","top","left","right","bottom","containLabel","tooltip","trigger","datas","ticket","seriesName","title","text","textStyle","fontSize","fontWeight","legend","selected","legendName","selectedMode","axisTick","alignWithLabel","splitLine","name","nameGap","nameRotate","nameLocation","axisLine","series","smooth","symbolSize","lineColor","markPoint","markLine","width","chart11","ceil","upperLimit","lowerLimit","lqhhlSx","curVal","getValue","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","some","xObj","splitNumber","chart70","ztzl","cllx","logx","logy","curZtzl","jxhslZtzl","curCllx","jxhslCllx","item1","log","item2","abk","ack","apply","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","option","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","spread","isHideChart","isShowCon","isShowVal","floatingObjects","remove","chartId","allRowsTotalHeight","allRowsTotalWidth","allRowsTotalLeft","chartCellHeight","getRowHeight","Spread","Sheets","SheetArea","colHeader","colCount","getColumnWidth","rowHeader","rowCount","fObjPosition","w","h","fcObj","get","FloatingObjects","FloatingObject","allowResize","allowMove","add","height","document","getElementById","divObj","createElement","setAttribute","innerHTML","content","fObj","ecObj","initChart","getCellVals","sheetName","cells","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","SheetUtils","getActiveSheetSelectCells","getActiveSheet","getSelections","setActiveSheetSelectCells","cellObj","setSelection","getAllCellObjsByRanges","selectRanges","isMulColOrder","allCellObjs","getSpans","itemSpanCell","Error","getSpan","orderByJson","getSheetAllCellObjs","curSheetCellRange","getRowCount","getColumnCount","getSheetSelectCellObjs","getActiveSheetSelectCellObjs","getSheetSelectVals","nullUndefinedReplaceVal","selectCells","selectCellVals","cell","cellVal","getActiveSheetSelectVals","getCellType","cellTypeName","cellType","CellTypes","Button","RadioButtonList","CheckBox","CheckBoxList","HyperLink","ComboBox","cellStyle","getStyle","cellButtons","command","dropDowns","showDateRange","setSheetZoom","scale","suspendPaint","sheetCount","getSheetCount","getSheet","zoom","resumePaint","setActiveSheetSelectBgColor","sel","getRange","backColor","setSheetBgColor","setSheetShowPrintPageLine","isShow","isPrintLineVisible","ignoreSheetShowStrs","ignoreStrs","ignorePaint","Text","prototype","paint","ctx","style","options","call","this","arguments","setSheetAuxiliaryLine","lineWidth","colorStr","isHb","floatBottom","floatRight","divBottom","divRight","borderBottom","borderLeft","setActiveSheetWatermark","getCell","watermark","setBindingPath","pathPrev","pathField","setSheetCellDate","isAutoSize","Style","imageType","ButtonImageType","dropdown","DropDownType","dateTimePicker","showTime","dateFormat","shrinkToFit","setStyle","WorkbookUtils","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","blob","saveAs","destroy"],"mappings":"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"}