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