rapid-spreadjs 1.0.100 → 1.0.102

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
@@ -123,7 +123,8 @@ const SheetUtils = {
123
123
  let allCellObjs = [];
124
124
  selectRanges.forEach((item, index) => {
125
125
  // 得到当前item中所有合并的单元格对象集合
126
- const itemSpanCells = sheet.getSpans(item);
126
+ let itemSpanCells = sheet.getSpans(item);
127
+ itemSpanCells = orderByJson(itemSpanCells, !isMulColOrder ? ['row', 'col'] : ['col', 'row'], ['asc', 'asc']);
127
128
  itemSpanCells.forEach((itemSpanCell) => {
128
129
  allCellObjs.push({
129
130
  row: itemSpanCell.row,
@@ -4638,6 +4639,11 @@ const EChartsUtilsAll = {
4638
4639
  yDataSourceXxOld.some((item) => item != null && item != undefined && item != '/')) {
4639
4640
  yValIsAllNull = false;
4640
4641
  }
4642
+ if (xData.filter((x) => x[1] == 0).length == xData.length &&
4643
+ xDataSx.filter((x) => x[1] == 0).length == xDataSx.length &&
4644
+ xDataXx.filter((x) => x[1] == 0).length == xDataXx.length) {
4645
+ yValIsAllNull = true;
4646
+ }
4641
4647
  let option = {
4642
4648
  grid: {
4643
4649
  // show: true,// 是否显示外边框线
@@ -4710,7 +4716,7 @@ const EChartsUtilsAll = {
4710
4716
  {
4711
4717
  type: 'value',
4712
4718
  name: yName,
4713
- nameGap: !yValIsAllNull ? 30 : 5,
4719
+ nameGap: !yValIsAllNull ? 30 : 30,
4714
4720
  nameRotate: 90,
4715
4721
  nameLocation: 'middle',
4716
4722
  splitLine: {
@@ -4720,6 +4726,7 @@ const EChartsUtilsAll = {
4720
4726
  type: 'solid',
4721
4727
  },
4722
4728
  },
4729
+ max: 100,
4723
4730
  splitNumber: 10, // 设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……
4724
4731
  axisLabel: {
4725
4732
  fontSize: xyFontSize,
@@ -8604,6 +8611,174 @@ const EChartsUtilsAll = {
8604
8611
  };
8605
8612
  return option;
8606
8613
  },
8614
+ /**
8615
+ * 最大剪应力与法向应力关系曲线
8616
+ * @param config 折线配置
8617
+ * @param xDataArr x轴原始数据(二维数组)
8618
+ * @param yDataArr y轴原始数据(二维数组)
8619
+ * @returns 返回ECharts配置项
8620
+ */
8621
+ chart450: (config, xDataArr, yDataArr, sheet) => {
8622
+ let lineData = JSON.parse(config.chartLinesJson);
8623
+ // const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);
8624
+ let title = config.chartTitle, xName = config.chartXName, yName = config.chartYName, color = lineData[0].lineColor;
8625
+ // 原始数据
8626
+ const xData = xDataArr[0];
8627
+ const yData = yDataArr[0];
8628
+ // 计算线性回归参数(斜率和截距)
8629
+ function linearRegression(x, y) {
8630
+ const n = x.length;
8631
+ let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
8632
+ for (let i = 0; i < n; i++) {
8633
+ sumX += x[i];
8634
+ sumY += y[i];
8635
+ sumXY += x[i] * y[i];
8636
+ sumXX += x[i] * x[i];
8637
+ }
8638
+ const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
8639
+ const intercept = (sumY - slope * sumX) / n;
8640
+ return { slope, intercept };
8641
+ }
8642
+ const regression = linearRegression(xData, yData);
8643
+ // console.log('斜率:', regression.slope, '截距:', regression.intercept);
8644
+ // 计算趋势线的数据点
8645
+ // 前推0.0,后推50.0
8646
+ Math.min(...xData);
8647
+ const maxX = Math.max(...xData) + 50; // 后推50
8648
+ // 生成趋势线数据点,确保与y轴相交(x=0)
8649
+ const trendData = [];
8650
+ for (let x = 0; x <= maxX; x += 10) {
8651
+ const y = regression.slope * x + regression.intercept;
8652
+ trendData.push([x, y]);
8653
+ }
8654
+ let yValIsAllNull = false;
8655
+ if (xData.length == 0 ||
8656
+ yData.length == 0 ||
8657
+ (!xData.some((x) => x != '' && x != '/' && x != null && x != undefined) &&
8658
+ !yData.some((x) => x != '' && x != '/' && x != null && x != undefined))) {
8659
+ yValIsAllNull = true;
8660
+ }
8661
+ if (xData.filter((x) => x == 0).length == xData.length || yData.filter((x) => x == 0).length == yData.length) {
8662
+ yValIsAllNull = true;
8663
+ }
8664
+ // 配置图表选项
8665
+ const option = {
8666
+ title: [
8667
+ {
8668
+ show: true,
8669
+ text: title,
8670
+ left: 'center',
8671
+ top: 2,
8672
+ textStyle: {
8673
+ fontSize: 14,
8674
+ fontWeight: 'normal',
8675
+ },
8676
+ },
8677
+ {
8678
+ show: true,
8679
+ text: xName,
8680
+ left: 'center',
8681
+ bottom: 0,
8682
+ textStyle: {
8683
+ fontSize: 12,
8684
+ fontWeight: 'normal',
8685
+ },
8686
+ },
8687
+ ],
8688
+ grid: {
8689
+ top: 25,
8690
+ left: 25,
8691
+ right: 15,
8692
+ bottom: 20,
8693
+ containLabel: true,
8694
+ },
8695
+ tooltip: {
8696
+ trigger: 'axis',
8697
+ formatter: function (params) {
8698
+ let result = '';
8699
+ params.forEach((param) => {
8700
+ if (param.seriesName === '实际数据') {
8701
+ result += `法向应力: ${param.value[0]} kPA<br/>剪应力: ${param.value[1]} kPA`;
8702
+ }
8703
+ else if (param.seriesName === '趋势线') {
8704
+ result += `趋势线<br/>法向应力: ${param.value[0]} kPA<br/>预测剪应力: ${param.value[1].toFixed(2)} kPA`;
8705
+ }
8706
+ });
8707
+ return result;
8708
+ },
8709
+ },
8710
+ xAxis: {
8711
+ name: xName,
8712
+ nameLocation: 'end',
8713
+ nameGap: 20,
8714
+ nameTextStyle: {
8715
+ fontSize: 12,
8716
+ fontWeight: 'bold',
8717
+ },
8718
+ type: 'value',
8719
+ min: 0,
8720
+ max: 450,
8721
+ interval: 50,
8722
+ axisLine: {
8723
+ lineStyle: {
8724
+ color: '#333',
8725
+ },
8726
+ },
8727
+ },
8728
+ yAxis: {
8729
+ name: yName,
8730
+ nameGap: !yValIsAllNull ? 35 : 5,
8731
+ nameRotate: 90,
8732
+ nameLocation: 'middle',
8733
+ type: 'value',
8734
+ min: 0,
8735
+ interval: 50,
8736
+ axisLine: {
8737
+ lineStyle: {
8738
+ color: '#333',
8739
+ },
8740
+ },
8741
+ },
8742
+ series: [
8743
+ {
8744
+ name: '实际数据',
8745
+ type: 'scatter',
8746
+ data: !yValIsAllNull ? xData.map((x, i) => [x, yData[i]]) : [],
8747
+ symbolSize: 5,
8748
+ itemStyle: {
8749
+ color: color,
8750
+ },
8751
+ },
8752
+ {
8753
+ name: '趋势线',
8754
+ type: 'line',
8755
+ data: !yValIsAllNull ? trendData : [],
8756
+ symbol: 'none',
8757
+ lineStyle: {
8758
+ color: color,
8759
+ width: 1,
8760
+ type: 'solid',
8761
+ },
8762
+ /*
8763
+ markPoint: {
8764
+ data: [
8765
+ {
8766
+ type: 'min',
8767
+ symbol: 'circle',
8768
+ symbolSize: 6,
8769
+ label: {
8770
+ formatter: '起点',
8771
+ position: 'right'
8772
+ }
8773
+ }
8774
+ ]
8775
+ }
8776
+ */
8777
+ },
8778
+ ],
8779
+ };
8780
+ return option;
8781
+ },
8607
8782
  };
8608
8783
 
8609
8784
  /**
@@ -20267,6 +20442,83 @@ const FormulaUtils = {
20267
20442
  return sw;
20268
20443
  },
20269
20444
  },
20445
+ {
20446
+ funName: 'YJWDDLZ',
20447
+ funDesc: '马歇尔稳定度/流值',
20448
+ funDefaultVal: null,
20449
+ isAcceptArea: true,
20450
+ funParams: [
20451
+ {
20452
+ name: '数值1',
20453
+ repeatable: false,
20454
+ optional: false,
20455
+ },
20456
+ {
20457
+ name: '数值2',
20458
+ repeatable: false,
20459
+ optional: false,
20460
+ },
20461
+ {
20462
+ name: '数值3',
20463
+ repeatable: false,
20464
+ optional: false,
20465
+ },
20466
+ {
20467
+ name: '数值4',
20468
+ repeatable: false,
20469
+ optional: false,
20470
+ },
20471
+ {
20472
+ name: '数值5',
20473
+ repeatable: false,
20474
+ optional: false,
20475
+ },
20476
+ {
20477
+ name: '数值6',
20478
+ repeatable: false,
20479
+ optional: false,
20480
+ },
20481
+ {
20482
+ name: '超过比例,如:0.15、0.2',
20483
+ repeatable: false,
20484
+ optional: false,
20485
+ },
20486
+ ],
20487
+ funCallback: (spread, sheet, retData) => {
20488
+ //如果传递的参数小于7个,则返回空字符串
20489
+ if (retData.allCellVals.length < 7) {
20490
+ return '/';
20491
+ }
20492
+ const val1 = retData.allCellVals[0], val2 = retData.allCellVals[1], val3 = retData.allCellVals[2], val4 = retData.allCellVals[3], val5 = retData.allCellVals[4], val6 = retData.allCellVals[5], overVal = retData.allCellVals[6];
20493
+ // 参数类型检查 - 所有参数必须为数字类型
20494
+ const args = [val1, val2, val3, val4, val5, val6, overVal];
20495
+ for (let i = 0; i < args.length; i++) {
20496
+ if (typeof args[i] !== 'number' || isNaN(args[i])) {
20497
+ return '/';
20498
+ }
20499
+ }
20500
+ // 提取前6个值进行计算
20501
+ const values = [val1, val2, val3, val4, val5, val6];
20502
+ // 计算初始平均值avg
20503
+ const sum = values.reduce((acc, val) => preciseCalc(acc, val, 'add'), 0);
20504
+ const avg = preciseCalc(sum, values.length, 'div');
20505
+ // 检查是否有值与平均值a的差大于overVal(不取绝对值)
20506
+ const abnormalValues = values.filter((val) => preciseCalc(val, avg, 'sub') > preciseCalc(overVal, val, 'mul'));
20507
+ // 如果没有异常值,直接返回平均值a
20508
+ if (abnormalValues.length === 0) {
20509
+ return avg;
20510
+ }
20511
+ // 舍弃异常值后重新计算平均值
20512
+ const normalValues = values.filter((val) => preciseCalc(val, avg, 'sub') <= preciseCalc(overVal, val, 'mul'));
20513
+ // 确保至少有一个正常值
20514
+ if (normalValues.length === 0) {
20515
+ return '/';
20516
+ }
20517
+ // 计算剩余值的平均值
20518
+ const newSum = normalValues.reduce((acc, val) => preciseCalc(acc, val, 'add'), 0);
20519
+ return preciseCalc(newSum, normalValues.length, 'div');
20520
+ },
20521
+ },
20270
20522
  {
20271
20523
  funName: 'YJTREND',
20272
20524
  funDesc: '返回线性回归拟合线的一组纵坐标值(y值)',