rapid-spreadjs 1.0.111 → 1.0.113
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 +141 -13
- 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 +141 -13
- 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/sheet.d.ts +6 -0
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -74,7 +74,6 @@ const CommonUtils = {
|
|
|
74
74
|
},
|
|
75
75
|
};
|
|
76
76
|
|
|
77
|
-
// 导入rapid-utils中的函数(注意:需要在tsconfig.json文件中设置moduleResolution为node,否则会提示:找不到模块“rapid-utils”。你的意思是要将 "moduleResolution" 选项设置为 "nodenext",还是要将别名添加到 "paths" 选项中?ts(2792))
|
|
78
77
|
/**
|
|
79
78
|
* SpreadJS工作表工具函数属性
|
|
80
79
|
*/
|
|
@@ -663,6 +662,130 @@ const SheetUtils = {
|
|
|
663
662
|
});
|
|
664
663
|
return '=' + cellStrings.join(',');
|
|
665
664
|
},
|
|
665
|
+
/**
|
|
666
|
+
* 粘贴单元格的值
|
|
667
|
+
* @param sheet 工作表对象
|
|
668
|
+
* @param callFn 粘贴成功或失败的回调函数(该回调函数包含2个参数,第一个参数为是否粘贴成功,第二个参数为提示信息)
|
|
669
|
+
*/
|
|
670
|
+
pasteCellValues: (sheet, callFn) => __awaiter(void 0, void 0, void 0, function* () {
|
|
671
|
+
// 检查浏览器是否支持Clipboard API
|
|
672
|
+
if (!navigator.clipboard || !navigator.clipboard.readText) {
|
|
673
|
+
// throw new Error("您的浏览器不支持剪贴板读取功能");
|
|
674
|
+
if (callFn != null && callFn != undefined && typeof callFn == 'function') {
|
|
675
|
+
callFn(false, '您的浏览器不支持剪贴板读取功能!');
|
|
676
|
+
}
|
|
677
|
+
return;
|
|
678
|
+
}
|
|
679
|
+
// 请求剪贴板读取权限
|
|
680
|
+
const permission = yield navigator.permissions.query({
|
|
681
|
+
name: 'clipboard-read',
|
|
682
|
+
});
|
|
683
|
+
if (permission.state === 'denied') {
|
|
684
|
+
// throw new Error("剪贴板读取权限被拒绝");
|
|
685
|
+
if (callFn != null && callFn != undefined && typeof callFn == 'function') {
|
|
686
|
+
callFn(false, '剪贴板读取权限被拒绝!');
|
|
687
|
+
}
|
|
688
|
+
return;
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* 解析从Excel复制的TSV格式数据,能处理单元格内换行符
|
|
692
|
+
* @param data 剪贴板中的原始TSV数据
|
|
693
|
+
* @returns 二维数组,代表行和列
|
|
694
|
+
*/
|
|
695
|
+
function parseExcelData(data) {
|
|
696
|
+
const result = [];
|
|
697
|
+
let currentRow = [];
|
|
698
|
+
let currentCell = '';
|
|
699
|
+
let insideQuotes = false; // 标记是否正在读取一个被引号包裹的单元格
|
|
700
|
+
for (let i = 0; i < data.length; i++) {
|
|
701
|
+
const char = data[i];
|
|
702
|
+
if (char === '"') {
|
|
703
|
+
// 遇到引号,切换状态
|
|
704
|
+
if (insideQuotes && data[i + 1] === '"') {
|
|
705
|
+
// 处理转义的双引号 ("")
|
|
706
|
+
currentCell += '"';
|
|
707
|
+
i++; // 跳过下一个引号
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
insideQuotes = !insideQuotes;
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
else if (char === '\t' && !insideQuotes) {
|
|
714
|
+
// 遇到制表符且不在引号内,结束当前单元格
|
|
715
|
+
currentRow.push(currentCell);
|
|
716
|
+
currentCell = '';
|
|
717
|
+
}
|
|
718
|
+
else if ((char === '\n' || char === '\r') && !insideQuotes) {
|
|
719
|
+
// 遇到换行符且不在引号内,结束当前行
|
|
720
|
+
// 处理可能是 \r\n 的情况
|
|
721
|
+
if (char === '\r' && data[i + 1] === '\n') {
|
|
722
|
+
i++; // 跳过 \n
|
|
723
|
+
}
|
|
724
|
+
currentRow.push(currentCell);
|
|
725
|
+
result.push(currentRow);
|
|
726
|
+
currentRow = [];
|
|
727
|
+
currentCell = '';
|
|
728
|
+
}
|
|
729
|
+
else {
|
|
730
|
+
// 普通字符,添加到当前单元格
|
|
731
|
+
currentCell += char;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
// 处理最后一行(如果数据不是以换行符结尾)
|
|
735
|
+
if (currentCell !== '' || currentRow.length > 0) {
|
|
736
|
+
currentRow.push(currentCell);
|
|
737
|
+
result.push(currentRow);
|
|
738
|
+
}
|
|
739
|
+
// 过滤掉可能存在的空行(例如复制内容末尾的空白行)
|
|
740
|
+
return result.filter((row) => row.some((cell) => cell.trim() !== ''));
|
|
741
|
+
}
|
|
742
|
+
const allCells = SheetUtils.getSheetSelectCellObjs(sheet);
|
|
743
|
+
const allCellsGroup = groupByJson(allCells, 'row');
|
|
744
|
+
const allCellsEw = [];
|
|
745
|
+
forEachJson(allCellsGroup, (value, key, source) => {
|
|
746
|
+
allCellsEw.push(value);
|
|
747
|
+
});
|
|
748
|
+
// 读取剪贴板文本内容
|
|
749
|
+
const clipboardText = yield navigator.clipboard.readText();
|
|
750
|
+
// 得到剪贴板中的二维数组值
|
|
751
|
+
const clipboardData = parseExcelData(clipboardText);
|
|
752
|
+
// 验证剪贴板的二维数组内容和框选的单元格二维数组是否一致
|
|
753
|
+
let isRight = true;
|
|
754
|
+
if (allCellsEw.length != clipboardData.length) {
|
|
755
|
+
isRight = false;
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
for (let i = 0; i < allCellsEw.length; i++) {
|
|
759
|
+
const row = allCellsEw[i];
|
|
760
|
+
const clipboardRow = clipboardData[i];
|
|
761
|
+
if (row.length != clipboardRow.length) {
|
|
762
|
+
isRight = false;
|
|
763
|
+
break;
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
if (!isRight && callFn != null && callFn != undefined && typeof callFn == 'function') {
|
|
768
|
+
callFn(false, '复制的内容区域和框选的表格区域不一致!');
|
|
769
|
+
return;
|
|
770
|
+
}
|
|
771
|
+
sheet.suspendPaint();
|
|
772
|
+
for (let i = 0; i < allCellsEw.length; i++) {
|
|
773
|
+
const row = allCellsEw[i];
|
|
774
|
+
for (let j = 0; j < row.length; j++) {
|
|
775
|
+
const cell = row[j];
|
|
776
|
+
const cellValue = clipboardData[i][j];
|
|
777
|
+
sheet.setValue(cell.row, cell.col, cellValue);
|
|
778
|
+
// 检查内容是否有换行,有就启用单元格自动换行的配置
|
|
779
|
+
if (cellValue && cellValue.includes('\n')) {
|
|
780
|
+
sheet.getCell(cell.row, cell.col).wordWrap(true);
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
sheet.resumePaint();
|
|
785
|
+
if (callFn != null && callFn != undefined && typeof callFn == 'function') {
|
|
786
|
+
callFn(true, '粘贴成功!');
|
|
787
|
+
}
|
|
788
|
+
}),
|
|
666
789
|
};
|
|
667
790
|
|
|
668
791
|
/**
|
|
@@ -21059,23 +21182,28 @@ const FormulaUtils = {
|
|
|
21059
21182
|
return '/';
|
|
21060
21183
|
}
|
|
21061
21184
|
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];
|
|
21185
|
+
if (typeof overVal !== 'number' || isNaN(overVal)) {
|
|
21186
|
+
return '/';
|
|
21187
|
+
}
|
|
21062
21188
|
// 参数类型检查 - 所有参数必须为数字类型
|
|
21063
|
-
const args = [
|
|
21064
|
-
|
|
21065
|
-
|
|
21066
|
-
|
|
21067
|
-
parseFloat(val4),
|
|
21068
|
-
parseFloat(val5),
|
|
21069
|
-
parseFloat(val6),
|
|
21070
|
-
parseFloat(overVal),
|
|
21071
|
-
];
|
|
21189
|
+
const args = [parseFloat(val1), parseFloat(val2), parseFloat(val3), parseFloat(val4), parseFloat(val5), parseFloat(val6)];
|
|
21190
|
+
let notNumCount = 0;
|
|
21191
|
+
// 提取前6个值进行计算
|
|
21192
|
+
let values = [];
|
|
21072
21193
|
for (let i = 0; i < args.length; i++) {
|
|
21073
21194
|
if (typeof args[i] !== 'number' || isNaN(args[i])) {
|
|
21074
|
-
|
|
21195
|
+
notNumCount++;
|
|
21196
|
+
// return "/";
|
|
21197
|
+
}
|
|
21198
|
+
else {
|
|
21199
|
+
values.push(args[i]);
|
|
21075
21200
|
}
|
|
21076
21201
|
}
|
|
21077
|
-
|
|
21078
|
-
|
|
21202
|
+
if (notNumCount == args.length) {
|
|
21203
|
+
return '/';
|
|
21204
|
+
}
|
|
21205
|
+
// // 提取前6个值进行计算
|
|
21206
|
+
// const values = [parseFloat(val1), parseFloat(val2), parseFloat(val3), parseFloat(val4), parseFloat(val5), parseFloat(val6)];
|
|
21079
21207
|
// 计算初始平均值avg
|
|
21080
21208
|
const sum = values.reduce((acc, val) => preciseCalc(acc, val, 'add'), 0);
|
|
21081
21209
|
const avg = preciseCalc(sum, values.length, 'div');
|