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 CHANGED
@@ -96,7 +96,6 @@ const CommonUtils = {
96
96
  },
97
97
  };
98
98
 
99
- // 导入rapid-utils中的函数(注意:需要在tsconfig.json文件中设置moduleResolution为node,否则会提示:找不到模块“rapid-utils”。你的意思是要将 "moduleResolution" 选项设置为 "nodenext",还是要将别名添加到 "paths" 选项中?ts(2792))
100
99
  /**
101
100
  * SpreadJS工作表工具函数属性
102
101
  */
@@ -685,6 +684,130 @@ const SheetUtils = {
685
684
  });
686
685
  return '=' + cellStrings.join(',');
687
686
  },
687
+ /**
688
+ * 粘贴单元格的值
689
+ * @param sheet 工作表对象
690
+ * @param callFn 粘贴成功或失败的回调函数(该回调函数包含2个参数,第一个参数为是否粘贴成功,第二个参数为提示信息)
691
+ */
692
+ pasteCellValues: (sheet, callFn) => __awaiter(void 0, void 0, void 0, function* () {
693
+ // 检查浏览器是否支持Clipboard API
694
+ if (!navigator.clipboard || !navigator.clipboard.readText) {
695
+ // throw new Error("您的浏览器不支持剪贴板读取功能");
696
+ if (callFn != null && callFn != undefined && typeof callFn == 'function') {
697
+ callFn(false, '您的浏览器不支持剪贴板读取功能!');
698
+ }
699
+ return;
700
+ }
701
+ // 请求剪贴板读取权限
702
+ const permission = yield navigator.permissions.query({
703
+ name: 'clipboard-read',
704
+ });
705
+ if (permission.state === 'denied') {
706
+ // throw new Error("剪贴板读取权限被拒绝");
707
+ if (callFn != null && callFn != undefined && typeof callFn == 'function') {
708
+ callFn(false, '剪贴板读取权限被拒绝!');
709
+ }
710
+ return;
711
+ }
712
+ /**
713
+ * 解析从Excel复制的TSV格式数据,能处理单元格内换行符
714
+ * @param data 剪贴板中的原始TSV数据
715
+ * @returns 二维数组,代表行和列
716
+ */
717
+ function parseExcelData(data) {
718
+ const result = [];
719
+ let currentRow = [];
720
+ let currentCell = '';
721
+ let insideQuotes = false; // 标记是否正在读取一个被引号包裹的单元格
722
+ for (let i = 0; i < data.length; i++) {
723
+ const char = data[i];
724
+ if (char === '"') {
725
+ // 遇到引号,切换状态
726
+ if (insideQuotes && data[i + 1] === '"') {
727
+ // 处理转义的双引号 ("")
728
+ currentCell += '"';
729
+ i++; // 跳过下一个引号
730
+ }
731
+ else {
732
+ insideQuotes = !insideQuotes;
733
+ }
734
+ }
735
+ else if (char === '\t' && !insideQuotes) {
736
+ // 遇到制表符且不在引号内,结束当前单元格
737
+ currentRow.push(currentCell);
738
+ currentCell = '';
739
+ }
740
+ else if ((char === '\n' || char === '\r') && !insideQuotes) {
741
+ // 遇到换行符且不在引号内,结束当前行
742
+ // 处理可能是 \r\n 的情况
743
+ if (char === '\r' && data[i + 1] === '\n') {
744
+ i++; // 跳过 \n
745
+ }
746
+ currentRow.push(currentCell);
747
+ result.push(currentRow);
748
+ currentRow = [];
749
+ currentCell = '';
750
+ }
751
+ else {
752
+ // 普通字符,添加到当前单元格
753
+ currentCell += char;
754
+ }
755
+ }
756
+ // 处理最后一行(如果数据不是以换行符结尾)
757
+ if (currentCell !== '' || currentRow.length > 0) {
758
+ currentRow.push(currentCell);
759
+ result.push(currentRow);
760
+ }
761
+ // 过滤掉可能存在的空行(例如复制内容末尾的空白行)
762
+ return result.filter((row) => row.some((cell) => cell.trim() !== ''));
763
+ }
764
+ const allCells = SheetUtils.getSheetSelectCellObjs(sheet);
765
+ const allCellsGroup = rapidUtils.groupByJson(allCells, 'row');
766
+ const allCellsEw = [];
767
+ rapidUtils.forEachJson(allCellsGroup, (value, key, source) => {
768
+ allCellsEw.push(value);
769
+ });
770
+ // 读取剪贴板文本内容
771
+ const clipboardText = yield navigator.clipboard.readText();
772
+ // 得到剪贴板中的二维数组值
773
+ const clipboardData = parseExcelData(clipboardText);
774
+ // 验证剪贴板的二维数组内容和框选的单元格二维数组是否一致
775
+ let isRight = true;
776
+ if (allCellsEw.length != clipboardData.length) {
777
+ isRight = false;
778
+ }
779
+ else {
780
+ for (let i = 0; i < allCellsEw.length; i++) {
781
+ const row = allCellsEw[i];
782
+ const clipboardRow = clipboardData[i];
783
+ if (row.length != clipboardRow.length) {
784
+ isRight = false;
785
+ break;
786
+ }
787
+ }
788
+ }
789
+ if (!isRight && callFn != null && callFn != undefined && typeof callFn == 'function') {
790
+ callFn(false, '复制的内容区域和框选的表格区域不一致!');
791
+ return;
792
+ }
793
+ sheet.suspendPaint();
794
+ for (let i = 0; i < allCellsEw.length; i++) {
795
+ const row = allCellsEw[i];
796
+ for (let j = 0; j < row.length; j++) {
797
+ const cell = row[j];
798
+ const cellValue = clipboardData[i][j];
799
+ sheet.setValue(cell.row, cell.col, cellValue);
800
+ // 检查内容是否有换行,有就启用单元格自动换行的配置
801
+ if (cellValue && cellValue.includes('\n')) {
802
+ sheet.getCell(cell.row, cell.col).wordWrap(true);
803
+ }
804
+ }
805
+ }
806
+ sheet.resumePaint();
807
+ if (callFn != null && callFn != undefined && typeof callFn == 'function') {
808
+ callFn(true, '粘贴成功!');
809
+ }
810
+ }),
688
811
  };
689
812
 
690
813
  /**
@@ -21081,23 +21204,28 @@ const FormulaUtils = {
21081
21204
  return '/';
21082
21205
  }
21083
21206
  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];
21207
+ if (typeof overVal !== 'number' || isNaN(overVal)) {
21208
+ return '/';
21209
+ }
21084
21210
  // 参数类型检查 - 所有参数必须为数字类型
21085
- const args = [
21086
- parseFloat(val1),
21087
- parseFloat(val2),
21088
- parseFloat(val3),
21089
- parseFloat(val4),
21090
- parseFloat(val5),
21091
- parseFloat(val6),
21092
- parseFloat(overVal),
21093
- ];
21211
+ const args = [parseFloat(val1), parseFloat(val2), parseFloat(val3), parseFloat(val4), parseFloat(val5), parseFloat(val6)];
21212
+ let notNumCount = 0;
21213
+ // 提取前6个值进行计算
21214
+ let values = [];
21094
21215
  for (let i = 0; i < args.length; i++) {
21095
21216
  if (typeof args[i] !== 'number' || isNaN(args[i])) {
21096
- return '/';
21217
+ notNumCount++;
21218
+ // return "/";
21219
+ }
21220
+ else {
21221
+ values.push(args[i]);
21097
21222
  }
21098
21223
  }
21099
- // 提取前6个值进行计算
21100
- const values = [parseFloat(val1), parseFloat(val2), parseFloat(val3), parseFloat(val4), parseFloat(val5), parseFloat(val6)];
21224
+ if (notNumCount == args.length) {
21225
+ return '/';
21226
+ }
21227
+ // // 提取前6个值进行计算
21228
+ // const values = [parseFloat(val1), parseFloat(val2), parseFloat(val3), parseFloat(val4), parseFloat(val5), parseFloat(val6)];
21101
21229
  // 计算初始平均值avg
21102
21230
  const sum = values.reduce((acc, val) => rapidUtils.preciseCalc(acc, val, 'add'), 0);
21103
21231
  const avg = rapidUtils.preciseCalc(sum, values.length, 'div');