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.esm.js
CHANGED
|
@@ -123,7 +123,8 @@ const SheetUtils = {
|
|
|
123
123
|
let allCellObjs = [];
|
|
124
124
|
selectRanges.forEach((item, index) => {
|
|
125
125
|
// 得到当前item中所有合并的单元格对象集合
|
|
126
|
-
|
|
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 :
|
|
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值)',
|