rapid-spreadjs 1.0.57 → 1.0.59

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.
package/dist/index.cjs.js CHANGED
@@ -7871,6 +7871,201 @@ const EChartsUtilsAll = {
7871
7871
  };
7872
7872
  return option;
7873
7873
  },
7874
+ /**
7875
+ * 土工合成材料(垂直渗透系数)
7876
+ * @param config 折线配置
7877
+ * @param xDataArr x轴原始数据(二维数组)
7878
+ * @param yDataArr y轴原始数据(二维数组)
7879
+ * @returns 返回ECharts配置项
7880
+ */
7881
+ chart370: (config, xDataArr, yDataArr, sheet) => {
7882
+ let lineData = JSON.parse(config.chartLinesJson);
7883
+ const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);
7884
+ // console.log(config);
7885
+ // 多项式阶数
7886
+ let dxsJs = chartExtJson != null ? chartExtJson.dxsJs : 5;
7887
+ // 趋势线和标注点的颜色
7888
+ const linePointColor = lineData[0].lineColor;
7889
+ // 原始数据
7890
+ var xData = xDataArr[0]; //[0.26, 0.16, 0.22, 0.22, 0.17];
7891
+ var yData = yDataArr[0]; // [90, 56, 42, 28, 14];
7892
+ /*var xData = [];
7893
+ var yData = [];*/
7894
+ // 计算多项式回归系数(强制截距为0):y = a*x^2 + b*x
7895
+ var sum_x4 = 0, sum_x3 = 0, sum_x2 = 0, sum_x2y = 0, sum_xy = 0;
7896
+ for (var i = 0; i < xData.length; i++) {
7897
+ var x = xData[i];
7898
+ var y = yData[i];
7899
+ var x2 = x * x;
7900
+ var x3 = x2 * x;
7901
+ var x4 = x3 * x;
7902
+ sum_x4 += x4;
7903
+ sum_x3 += x3;
7904
+ sum_x2 += x2;
7905
+ sum_x2y += x2 * y;
7906
+ sum_xy += x * y;
7907
+ }
7908
+ // 解方程:a * Σx^4 + b * Σx^3 = Σx^2y ; a * Σx^3 + b * Σx^2 = Σxy
7909
+ var det = sum_x4 * sum_x2 - sum_x3 * sum_x3; // 行列式
7910
+ var a = (sum_x2y * sum_x2 - sum_xy * sum_x3) / det;
7911
+ var b = (sum_x4 * sum_xy - sum_x3 * sum_x2y) / det;
7912
+ // 计算当 y=50 时的 x 值:解方程 a*x^2 + b*x - 50 = 0
7913
+ var discriminant = b * b + 4 * a * 50; // 判别式 D = b^2 + 4*a*50
7914
+ var x50 = (-b + Math.sqrt(discriminant)) / (dxsJs * a); // 取正根(基于数据范围)
7915
+ // 验证根的有效性(确保在数据范围内)
7916
+ if (x50 < 0 || x50 > Math.max(...xData) + Math.min(...xData)) {
7917
+ x50 = (-b - Math.sqrt(discriminant)) / (dxsJs * a); // 尝试负根
7918
+ }
7919
+ // 生成趋势线数据点(从 x=0 开始,后推 0.16)
7920
+ var trendLineX = [];
7921
+ var trendLineY = [];
7922
+ var xStart = 0; // 从 x=0 开始
7923
+ var xEnd = Math.max(...xData) + Math.min(...xData); // 后推 0.16
7924
+ for (var x = xStart; x <= xEnd; x += 0.01) {
7925
+ trendLineX.push(x);
7926
+ trendLineY.push(a * x * x + b * x); // y = a*x^2 + b*x
7927
+ }
7928
+ // 判断y轴数据是否为/、‘’、null、undefined或者没有数据
7929
+ let yValIsAllNull = false;
7930
+ if (trendLineY.length == 0) {
7931
+ yValIsAllNull = true;
7932
+ }
7933
+ else {
7934
+ let noDataCount = 0;
7935
+ trendLineY.forEach((item) => {
7936
+ if (item == null || item == undefined || item == '/' || item == '') {
7937
+ noDataCount++;
7938
+ }
7939
+ });
7940
+ if (noDataCount == trendLineY.length) {
7941
+ yValIsAllNull = true;
7942
+ }
7943
+ }
7944
+ const seriesData = trendLineX.map((x, idx) => [x, trendLineY[idx]]);
7945
+ // 默认输出精度
7946
+ let outJdDzvi = 0.01;
7947
+ // 输出数据
7948
+ let outValDzvi = 0;
7949
+ // 设置Sheet单元格的值(输出:单值VI₅₀(mm/s))
7950
+ if (chartExtJson != null) {
7951
+ if (chartExtJson.jsDzviJd != null && chartExtJson.jsDzviJd != undefined) {
7952
+ outJdDzvi = chartExtJson.jsDzviJd;
7953
+ }
7954
+ outValDzvi = EChartsUtilsComm.getRound(x50, outJdDzvi);
7955
+ sheet.setValue(chartExtJson.jsDzvi.row, chartExtJson.jsDzvi.col, outValDzvi);
7956
+ }
7957
+ // 配置图表选项
7958
+ var option = {
7959
+ title: [
7960
+ /*{
7961
+ text: '散点图与多项式趋势线 (y = ax² + bx, 截距=0)',
7962
+ left: 'center',
7963
+ textStyle: { fontSize: 14 }
7964
+ },*/
7965
+ {
7966
+ show: true,
7967
+ text: 'V₂₀(mm/s)',
7968
+ left: 'center',
7969
+ bottom: 0,
7970
+ textStyle: {
7971
+ fontSize: 12,
7972
+ fontWeight: 'normal',
7973
+ },
7974
+ },
7975
+ ],
7976
+ grid: {
7977
+ // show: true,//是否显示外边框线
7978
+ // borderColor: '#f00',//外边框线颜色
7979
+ top: 10,
7980
+ left: !yValIsAllNull ? 25 : 25,
7981
+ right: 10,
7982
+ bottom: 20,
7983
+ containLabel: true,
7984
+ },
7985
+ /*tooltip: {
7986
+ trigger: 'item',
7987
+ formatter: function (params) {
7988
+ if (params.seriesName === '趋势线') {
7989
+ return '趋势线<br/>x: ' + params.value[0].toFixed(3) + ', y: ' + params.value[1].toFixed(3);
7990
+ } else if (params.seriesName === '散点') {
7991
+ return '数据点<br/>x: ' + params.value[0].toFixed(3) + ', y: ' + params.value[1].toFixed(3);
7992
+ }
7993
+ return params.name + ': ' + params.value;
7994
+ }
7995
+ },*/
7996
+ xAxis: {
7997
+ type: 'value',
7998
+ name: 'X轴',
7999
+ min: 0, // 从 x=0 开始
8000
+ max: xEnd, // 扩展到后推位置
8001
+ axisLine: { show: true },
8002
+ },
8003
+ yAxis: {
8004
+ type: 'value',
8005
+ name: 'Δh (mm)',
8006
+ nameGap: !yValIsAllNull ? 30 : 5,
8007
+ nameRotate: 90,
8008
+ nameLocation: 'middle',
8009
+ min: 0, // 向下多显示 -10
8010
+ max: Math.max(...yData) + 10, // 基于数据最大值
8011
+ interval: 10, // 设置刻度间隔为10
8012
+ axisLine: { show: true },
8013
+ },
8014
+ series: [
8015
+ /*{
8016
+ name: '散点',
8017
+ type: 'scatter',
8018
+ data: xData.map((x, idx) => [x, yData[idx]]), // 散点数据
8019
+ symbolSize: 8,
8020
+ itemStyle: { color: '#5470c6' }
8021
+ },*/
8022
+ {
8023
+ name: '趋势线',
8024
+ type: 'line',
8025
+ data: seriesData, // 趋势线数据
8026
+ symbol: 'none', // 不显示数据点标记
8027
+ lineStyle: {
8028
+ color: linePointColor,
8029
+ // width: 2,
8030
+ type: 'solid', // 实线
8031
+ },
8032
+ smooth: true, // 平滑曲线
8033
+ },
8034
+ {
8035
+ name: 'y=50 标注点',
8036
+ type: 'scatter',
8037
+ data: [[x50, 50]], // 标注点位置
8038
+ symbolSize: 10,
8039
+ itemStyle: { color: linePointColor },
8040
+ label: {
8041
+ show: true,
8042
+ position: 'right',
8043
+ formatter: '(' + x50.toFixed(2) + ', 50)', // 显示坐标
8044
+ color: '#333',
8045
+ fontSize: 12,
8046
+ },
8047
+ markLine: {
8048
+ symbol: 'none', // 不显示箭头
8049
+ lineStyle: {
8050
+ color: '#333',
8051
+ type: 'dashed',
8052
+ width: 1,
8053
+ },
8054
+ data: [
8055
+ // 横向虚线:从(0,50)到(x50,50)
8056
+ [{ coord: [0, 50] }, { coord: [x50, 50] }],
8057
+ // 纵向虚线:从(x50,50)到(x50,-10)
8058
+ [{ coord: [x50, 50] }, { coord: [x50, 0] }],
8059
+ ],
8060
+ },
8061
+ },
8062
+ ],
8063
+ };
8064
+ // console.log('输出公式:', 'y = ' + a.toFixed(4) + 'x² + ' + b.toFixed(4) + 'x');
8065
+ // console.log('当 y=50 时,x 的计算公式:', 'x = [-b ± √(b² + 4a*50)] / (2a)');
8066
+ // console.log('计算值x =', x50.toFixed(2));
8067
+ return option;
8068
+ },
7874
8069
  };
7875
8070
 
7876
8071
  /**
@@ -8116,6 +8311,9 @@ const EChartsUtils = {
8116
8311
  else if (config.chartType == 350) {
8117
8312
  option = EChartsUtilsAll.chart350(config, xDataArr, yDataArr);
8118
8313
  }
8314
+ else if (config.chartType == 370) {
8315
+ option = EChartsUtilsAll.chart370(config, xDataArr, yDataArr, sheet);
8316
+ }
8119
8317
  if (option && typeof option === 'object') {
8120
8318
  //如果是隐藏的图表,则需要禁用ECharts的动画效果
8121
8319
  //原因是:如果ECharts使用了动画效果,图表渲染完成可能需要0.5秒,但是在导出ECharts统计图为图片的场景下时,可能在图表还没有渲染完成(动画效果还没结束)前就要获取图像了,此时可能就会造成获取到的图像内容丢失的情况