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.cjs.js +254 -2
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.cjs.min.js +1 -1
- package/dist/index.cjs.min.js.map +1 -1
- package/dist/index.esm.js +254 -2
- package/dist/index.esm.js.map +1 -1
- package/dist/index.esm.min.js +1 -1
- package/dist/index.esm.min.js.map +1 -1
- package/dist/utils/echarts-all.d.ts +97 -0
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -145,7 +145,8 @@ const SheetUtils = {
|
|
|
145
145
|
let allCellObjs = [];
|
|
146
146
|
selectRanges.forEach((item, index) => {
|
|
147
147
|
// 得到当前item中所有合并的单元格对象集合
|
|
148
|
-
|
|
148
|
+
let itemSpanCells = sheet.getSpans(item);
|
|
149
|
+
itemSpanCells = rapidUtils.orderByJson(itemSpanCells, !isMulColOrder ? ['row', 'col'] : ['col', 'row'], ['asc', 'asc']);
|
|
149
150
|
itemSpanCells.forEach((itemSpanCell) => {
|
|
150
151
|
allCellObjs.push({
|
|
151
152
|
row: itemSpanCell.row,
|
|
@@ -4660,6 +4661,11 @@ const EChartsUtilsAll = {
|
|
|
4660
4661
|
yDataSourceXxOld.some((item) => item != null && item != undefined && item != '/')) {
|
|
4661
4662
|
yValIsAllNull = false;
|
|
4662
4663
|
}
|
|
4664
|
+
if (xData.filter((x) => x[1] == 0).length == xData.length &&
|
|
4665
|
+
xDataSx.filter((x) => x[1] == 0).length == xDataSx.length &&
|
|
4666
|
+
xDataXx.filter((x) => x[1] == 0).length == xDataXx.length) {
|
|
4667
|
+
yValIsAllNull = true;
|
|
4668
|
+
}
|
|
4663
4669
|
let option = {
|
|
4664
4670
|
grid: {
|
|
4665
4671
|
// show: true,// 是否显示外边框线
|
|
@@ -4732,7 +4738,7 @@ const EChartsUtilsAll = {
|
|
|
4732
4738
|
{
|
|
4733
4739
|
type: 'value',
|
|
4734
4740
|
name: yName,
|
|
4735
|
-
nameGap: !yValIsAllNull ? 30 :
|
|
4741
|
+
nameGap: !yValIsAllNull ? 30 : 30,
|
|
4736
4742
|
nameRotate: 90,
|
|
4737
4743
|
nameLocation: 'middle',
|
|
4738
4744
|
splitLine: {
|
|
@@ -4742,6 +4748,7 @@ const EChartsUtilsAll = {
|
|
|
4742
4748
|
type: 'solid',
|
|
4743
4749
|
},
|
|
4744
4750
|
},
|
|
4751
|
+
max: 100,
|
|
4745
4752
|
splitNumber: 10, // 设置y轴分隔的段数,如0~100之间默认情况可能会按照0、20、40、60……的间隔显示,设置相应的数字后就会根据实际情况显示的更细,如0、10、20、30……
|
|
4746
4753
|
axisLabel: {
|
|
4747
4754
|
fontSize: xyFontSize,
|
|
@@ -8626,6 +8633,174 @@ const EChartsUtilsAll = {
|
|
|
8626
8633
|
};
|
|
8627
8634
|
return option;
|
|
8628
8635
|
},
|
|
8636
|
+
/**
|
|
8637
|
+
* 最大剪应力与法向应力关系曲线
|
|
8638
|
+
* @param config 折线配置
|
|
8639
|
+
* @param xDataArr x轴原始数据(二维数组)
|
|
8640
|
+
* @param yDataArr y轴原始数据(二维数组)
|
|
8641
|
+
* @returns 返回ECharts配置项
|
|
8642
|
+
*/
|
|
8643
|
+
chart450: (config, xDataArr, yDataArr, sheet) => {
|
|
8644
|
+
let lineData = JSON.parse(config.chartLinesJson);
|
|
8645
|
+
// const chartExtJson = config.chartExtJson == null || config.chartExtJson == undefined ? null : JSON.parse(config.chartExtJson);
|
|
8646
|
+
let title = config.chartTitle, xName = config.chartXName, yName = config.chartYName, color = lineData[0].lineColor;
|
|
8647
|
+
// 原始数据
|
|
8648
|
+
const xData = xDataArr[0];
|
|
8649
|
+
const yData = yDataArr[0];
|
|
8650
|
+
// 计算线性回归参数(斜率和截距)
|
|
8651
|
+
function linearRegression(x, y) {
|
|
8652
|
+
const n = x.length;
|
|
8653
|
+
let sumX = 0, sumY = 0, sumXY = 0, sumXX = 0;
|
|
8654
|
+
for (let i = 0; i < n; i++) {
|
|
8655
|
+
sumX += x[i];
|
|
8656
|
+
sumY += y[i];
|
|
8657
|
+
sumXY += x[i] * y[i];
|
|
8658
|
+
sumXX += x[i] * x[i];
|
|
8659
|
+
}
|
|
8660
|
+
const slope = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX);
|
|
8661
|
+
const intercept = (sumY - slope * sumX) / n;
|
|
8662
|
+
return { slope, intercept };
|
|
8663
|
+
}
|
|
8664
|
+
const regression = linearRegression(xData, yData);
|
|
8665
|
+
// console.log('斜率:', regression.slope, '截距:', regression.intercept);
|
|
8666
|
+
// 计算趋势线的数据点
|
|
8667
|
+
// 前推0.0,后推50.0
|
|
8668
|
+
Math.min(...xData);
|
|
8669
|
+
const maxX = Math.max(...xData) + 50; // 后推50
|
|
8670
|
+
// 生成趋势线数据点,确保与y轴相交(x=0)
|
|
8671
|
+
const trendData = [];
|
|
8672
|
+
for (let x = 0; x <= maxX; x += 10) {
|
|
8673
|
+
const y = regression.slope * x + regression.intercept;
|
|
8674
|
+
trendData.push([x, y]);
|
|
8675
|
+
}
|
|
8676
|
+
let yValIsAllNull = false;
|
|
8677
|
+
if (xData.length == 0 ||
|
|
8678
|
+
yData.length == 0 ||
|
|
8679
|
+
(!xData.some((x) => x != '' && x != '/' && x != null && x != undefined) &&
|
|
8680
|
+
!yData.some((x) => x != '' && x != '/' && x != null && x != undefined))) {
|
|
8681
|
+
yValIsAllNull = true;
|
|
8682
|
+
}
|
|
8683
|
+
if (xData.filter((x) => x == 0).length == xData.length || yData.filter((x) => x == 0).length == yData.length) {
|
|
8684
|
+
yValIsAllNull = true;
|
|
8685
|
+
}
|
|
8686
|
+
// 配置图表选项
|
|
8687
|
+
const option = {
|
|
8688
|
+
title: [
|
|
8689
|
+
{
|
|
8690
|
+
show: true,
|
|
8691
|
+
text: title,
|
|
8692
|
+
left: 'center',
|
|
8693
|
+
top: 2,
|
|
8694
|
+
textStyle: {
|
|
8695
|
+
fontSize: 14,
|
|
8696
|
+
fontWeight: 'normal',
|
|
8697
|
+
},
|
|
8698
|
+
},
|
|
8699
|
+
{
|
|
8700
|
+
show: true,
|
|
8701
|
+
text: xName,
|
|
8702
|
+
left: 'center',
|
|
8703
|
+
bottom: 0,
|
|
8704
|
+
textStyle: {
|
|
8705
|
+
fontSize: 12,
|
|
8706
|
+
fontWeight: 'normal',
|
|
8707
|
+
},
|
|
8708
|
+
},
|
|
8709
|
+
],
|
|
8710
|
+
grid: {
|
|
8711
|
+
top: 25,
|
|
8712
|
+
left: 25,
|
|
8713
|
+
right: 15,
|
|
8714
|
+
bottom: 20,
|
|
8715
|
+
containLabel: true,
|
|
8716
|
+
},
|
|
8717
|
+
tooltip: {
|
|
8718
|
+
trigger: 'axis',
|
|
8719
|
+
formatter: function (params) {
|
|
8720
|
+
let result = '';
|
|
8721
|
+
params.forEach((param) => {
|
|
8722
|
+
if (param.seriesName === '实际数据') {
|
|
8723
|
+
result += `法向应力: ${param.value[0]} kPA<br/>剪应力: ${param.value[1]} kPA`;
|
|
8724
|
+
}
|
|
8725
|
+
else if (param.seriesName === '趋势线') {
|
|
8726
|
+
result += `趋势线<br/>法向应力: ${param.value[0]} kPA<br/>预测剪应力: ${param.value[1].toFixed(2)} kPA`;
|
|
8727
|
+
}
|
|
8728
|
+
});
|
|
8729
|
+
return result;
|
|
8730
|
+
},
|
|
8731
|
+
},
|
|
8732
|
+
xAxis: {
|
|
8733
|
+
name: xName,
|
|
8734
|
+
nameLocation: 'end',
|
|
8735
|
+
nameGap: 20,
|
|
8736
|
+
nameTextStyle: {
|
|
8737
|
+
fontSize: 12,
|
|
8738
|
+
fontWeight: 'bold',
|
|
8739
|
+
},
|
|
8740
|
+
type: 'value',
|
|
8741
|
+
min: 0,
|
|
8742
|
+
max: 450,
|
|
8743
|
+
interval: 50,
|
|
8744
|
+
axisLine: {
|
|
8745
|
+
lineStyle: {
|
|
8746
|
+
color: '#333',
|
|
8747
|
+
},
|
|
8748
|
+
},
|
|
8749
|
+
},
|
|
8750
|
+
yAxis: {
|
|
8751
|
+
name: yName,
|
|
8752
|
+
nameGap: !yValIsAllNull ? 35 : 5,
|
|
8753
|
+
nameRotate: 90,
|
|
8754
|
+
nameLocation: 'middle',
|
|
8755
|
+
type: 'value',
|
|
8756
|
+
min: 0,
|
|
8757
|
+
interval: 50,
|
|
8758
|
+
axisLine: {
|
|
8759
|
+
lineStyle: {
|
|
8760
|
+
color: '#333',
|
|
8761
|
+
},
|
|
8762
|
+
},
|
|
8763
|
+
},
|
|
8764
|
+
series: [
|
|
8765
|
+
{
|
|
8766
|
+
name: '实际数据',
|
|
8767
|
+
type: 'scatter',
|
|
8768
|
+
data: !yValIsAllNull ? xData.map((x, i) => [x, yData[i]]) : [],
|
|
8769
|
+
symbolSize: 5,
|
|
8770
|
+
itemStyle: {
|
|
8771
|
+
color: color,
|
|
8772
|
+
},
|
|
8773
|
+
},
|
|
8774
|
+
{
|
|
8775
|
+
name: '趋势线',
|
|
8776
|
+
type: 'line',
|
|
8777
|
+
data: !yValIsAllNull ? trendData : [],
|
|
8778
|
+
symbol: 'none',
|
|
8779
|
+
lineStyle: {
|
|
8780
|
+
color: color,
|
|
8781
|
+
width: 1,
|
|
8782
|
+
type: 'solid',
|
|
8783
|
+
},
|
|
8784
|
+
/*
|
|
8785
|
+
markPoint: {
|
|
8786
|
+
data: [
|
|
8787
|
+
{
|
|
8788
|
+
type: 'min',
|
|
8789
|
+
symbol: 'circle',
|
|
8790
|
+
symbolSize: 6,
|
|
8791
|
+
label: {
|
|
8792
|
+
formatter: '起点',
|
|
8793
|
+
position: 'right'
|
|
8794
|
+
}
|
|
8795
|
+
}
|
|
8796
|
+
]
|
|
8797
|
+
}
|
|
8798
|
+
*/
|
|
8799
|
+
},
|
|
8800
|
+
],
|
|
8801
|
+
};
|
|
8802
|
+
return option;
|
|
8803
|
+
},
|
|
8629
8804
|
};
|
|
8630
8805
|
|
|
8631
8806
|
/**
|
|
@@ -20289,6 +20464,83 @@ const FormulaUtils = {
|
|
|
20289
20464
|
return sw;
|
|
20290
20465
|
},
|
|
20291
20466
|
},
|
|
20467
|
+
{
|
|
20468
|
+
funName: 'YJWDDLZ',
|
|
20469
|
+
funDesc: '马歇尔稳定度/流值',
|
|
20470
|
+
funDefaultVal: null,
|
|
20471
|
+
isAcceptArea: true,
|
|
20472
|
+
funParams: [
|
|
20473
|
+
{
|
|
20474
|
+
name: '数值1',
|
|
20475
|
+
repeatable: false,
|
|
20476
|
+
optional: false,
|
|
20477
|
+
},
|
|
20478
|
+
{
|
|
20479
|
+
name: '数值2',
|
|
20480
|
+
repeatable: false,
|
|
20481
|
+
optional: false,
|
|
20482
|
+
},
|
|
20483
|
+
{
|
|
20484
|
+
name: '数值3',
|
|
20485
|
+
repeatable: false,
|
|
20486
|
+
optional: false,
|
|
20487
|
+
},
|
|
20488
|
+
{
|
|
20489
|
+
name: '数值4',
|
|
20490
|
+
repeatable: false,
|
|
20491
|
+
optional: false,
|
|
20492
|
+
},
|
|
20493
|
+
{
|
|
20494
|
+
name: '数值5',
|
|
20495
|
+
repeatable: false,
|
|
20496
|
+
optional: false,
|
|
20497
|
+
},
|
|
20498
|
+
{
|
|
20499
|
+
name: '数值6',
|
|
20500
|
+
repeatable: false,
|
|
20501
|
+
optional: false,
|
|
20502
|
+
},
|
|
20503
|
+
{
|
|
20504
|
+
name: '超过比例,如:0.15、0.2',
|
|
20505
|
+
repeatable: false,
|
|
20506
|
+
optional: false,
|
|
20507
|
+
},
|
|
20508
|
+
],
|
|
20509
|
+
funCallback: (spread, sheet, retData) => {
|
|
20510
|
+
//如果传递的参数小于7个,则返回空字符串
|
|
20511
|
+
if (retData.allCellVals.length < 7) {
|
|
20512
|
+
return '/';
|
|
20513
|
+
}
|
|
20514
|
+
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];
|
|
20515
|
+
// 参数类型检查 - 所有参数必须为数字类型
|
|
20516
|
+
const args = [val1, val2, val3, val4, val5, val6, overVal];
|
|
20517
|
+
for (let i = 0; i < args.length; i++) {
|
|
20518
|
+
if (typeof args[i] !== 'number' || isNaN(args[i])) {
|
|
20519
|
+
return '/';
|
|
20520
|
+
}
|
|
20521
|
+
}
|
|
20522
|
+
// 提取前6个值进行计算
|
|
20523
|
+
const values = [val1, val2, val3, val4, val5, val6];
|
|
20524
|
+
// 计算初始平均值avg
|
|
20525
|
+
const sum = values.reduce((acc, val) => rapidUtils.preciseCalc(acc, val, 'add'), 0);
|
|
20526
|
+
const avg = rapidUtils.preciseCalc(sum, values.length, 'div');
|
|
20527
|
+
// 检查是否有值与平均值a的差大于overVal(不取绝对值)
|
|
20528
|
+
const abnormalValues = values.filter((val) => rapidUtils.preciseCalc(val, avg, 'sub') > rapidUtils.preciseCalc(overVal, val, 'mul'));
|
|
20529
|
+
// 如果没有异常值,直接返回平均值a
|
|
20530
|
+
if (abnormalValues.length === 0) {
|
|
20531
|
+
return avg;
|
|
20532
|
+
}
|
|
20533
|
+
// 舍弃异常值后重新计算平均值
|
|
20534
|
+
const normalValues = values.filter((val) => rapidUtils.preciseCalc(val, avg, 'sub') <= rapidUtils.preciseCalc(overVal, val, 'mul'));
|
|
20535
|
+
// 确保至少有一个正常值
|
|
20536
|
+
if (normalValues.length === 0) {
|
|
20537
|
+
return '/';
|
|
20538
|
+
}
|
|
20539
|
+
// 计算剩余值的平均值
|
|
20540
|
+
const newSum = normalValues.reduce((acc, val) => rapidUtils.preciseCalc(acc, val, 'add'), 0);
|
|
20541
|
+
return rapidUtils.preciseCalc(newSum, normalValues.length, 'div');
|
|
20542
|
+
},
|
|
20543
|
+
},
|
|
20292
20544
|
{
|
|
20293
20545
|
funName: 'YJTREND',
|
|
20294
20546
|
funDesc: '返回线性回归拟合线的一组纵坐标值(y值)',
|