rapid-spreadjs 1.0.5 → 1.0.6
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/.markdownlint.json +13 -0
- package/CHANGELOG.md +35 -0
- package/dist/index.cjs.js +493 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.cjs.min.js +2 -0
- package/dist/index.cjs.min.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.esm.js +488 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.esm.min.js +2 -0
- package/dist/index.esm.min.js.map +1 -0
- package/dist/utils/common.d.ts +11 -0
- package/dist/utils/sheet.d.ts +85 -0
- package/dist/utils/wookbook.d.ts +19 -0
- package/markdownlint-config-schema.json +1596 -0
- package/package.json +17 -13
- package/rollup.config.js +51 -0
- package/src/index.ts +11 -0
- package/src/utils/common.ts +22 -0
- package/src/utils/sheet.ts +395 -1
- package/src/utils/wookbook.ts +188 -0
- package/tsconfig.json +8 -7
- package/.babelrc +0 -3
- package/dist/index.js +0 -27
- package/dist/types/index.d.ts +0 -1
- package/dist/types/types/wookbook.d.ts +0 -0
- package/dist/types/utils/sheet.d.ts +0 -24
- package/dist/types/utils/wookbook.d.ts +0 -0
- package/src/index.js +0 -2
- /package/dist/types/{types/sheet.d.ts → sheet.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.min.js","sources":["../src/utils/common.ts","../src/utils/sheet.ts","../src/utils/wookbook.ts"],"sourcesContent":["/**\r\n * 公用工具函数\r\n */\r\nexport const CommonUtils = {\r\n /**\r\n * 获取列的英文字母\r\n * @param colIndex 列的索引\r\n * @returns 返回英文字母\r\n */\r\n getColLetterName: (colIndex: number): string => {\r\n colIndex += 1;\r\n\r\n let letter = \"\";\r\n while (colIndex > 0) {\r\n const remainder = (colIndex - 1) % 26;\r\n letter = String.fromCharCode(remainder + 65) + letter;\r\n colIndex = Math.floor((colIndex - 1) / 26);\r\n }\r\n\r\n return letter.toUpperCase();\r\n },\r\n};\r\n","// 导入单元格实体\r\nimport { CellModel } from \"../types/sheet\";\r\n\r\n/**\r\n * SpreadJS工作表工具函数\r\n */\r\nexport const SheetUtils = {\r\n /**\r\n * 获取当前活动工作表选中的单元格集合\r\n * @param spread 工作簿对象\r\n * @returns 返回选中单元格的集合,格式如:[{row:,col:,rowCount:,colCount:}]\r\n */\r\n getActiveSheetSelectCells: (spread: any): Array<CellModel> => {\r\n const sheet = spread.getActiveSheet();\r\n\r\n return sheet.getSelections();\r\n },\r\n\r\n /**\r\n * 设置当前活动工作表某个单元格范围为选中状态\r\n * @param spread 工作簿对象\r\n * @param cellObj 设置选中的单元格,格式如:{row:0,col:0,rowCount:1,colCount:1}\r\n */\r\n setActiveSheetSelectCells: (spread: any, cellObj: CellModel) => {\r\n const sheet = spread.getActiveSheet();\r\n\r\n sheet.setSelection(\r\n cellObj.row,\r\n cellObj.col,\r\n cellObj.rowCount,\r\n cellObj.colCount\r\n );\r\n },\r\n\r\n /**\r\n * 获取某工作表中某范围集合中所有的单元格坐标对象集合\r\n * 该方法适用的场景如:手动选择了很多个单元格范围,在这些范围中可能包含独立的单元格,也可能包含合并的单元格,这时候就需要用到如下方法获取到所有单元格对象\r\n * @param sheet 工作表实例\r\n * @param selectRanges 单元格范围集合,格式如:[{ row: 0, col: 0, rowCount: 2, colCount: 2 }]\r\n * @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)\r\n * 返回数组集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n */\r\n getAllCellObjsByRanges: (\r\n sheet: any,\r\n selectRanges: Array<CellModel>,\r\n isMulColOrder: boolean = false\r\n ) => {\r\n // 得到所有的单元格坐标对象集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]\r\n let allCellObjs: Array<CellModel> = [];\r\n\r\n selectRanges.forEach((item, index) => {\r\n // 得到当前item中所有合并的单元格对象集合\r\n const itemSpanCells = sheet.getSpans(item);\r\n itemSpanCells.forEach((itemSpanCell: CellModel) => {\r\n allCellObjs.push({\r\n row: itemSpanCell.row,\r\n col: itemSpanCell.col,\r\n rowCount: itemSpanCell.rowCount,\r\n colCount: itemSpanCell.colCount,\r\n });\r\n });\r\n\r\n if (\r\n item.row === undefined ||\r\n item.col === undefined ||\r\n item.rowCount === undefined ||\r\n item.colCount === undefined\r\n ) {\r\n throw new Error(\"row、col、rowCount、colCount is required.\");\r\n }\r\n\r\n // 遍历item中涉及到的所有单元格\r\n for (let i = item.row; i < +item.row + item.rowCount; i++) {\r\n for (let j = item.col; j < item.col + item.colCount; j++) {\r\n const curSpanCellObj = sheet.getSpan(i, j);\r\n\r\n // 检查当前单元格是否为合并单元格\r\n if (curSpanCellObj == null) {\r\n allCellObjs.push({\r\n row: i,\r\n col: j,\r\n rowCount: 1,\r\n colCount: 1,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n // 常规顺序\r\n if (!isMulColOrder) {\r\n // 对单元格集合对象对象进行排序,先按row后按col进行升序排序(注意:此处非常重要,如果不排序,获取到的单元格顺序有可能是乱的【不完全按照模板顺序返回】)\r\n allCellObjs.sort((a: CellModel, b: CellModel) => {\r\n if (\r\n a.row === undefined ||\r\n b.row === undefined ||\r\n a.col === undefined ||\r\n b.col === undefined\r\n ) {\r\n throw new Error(\"row、col is required.\");\r\n }\r\n\r\n if (a.row == b.row) {\r\n return a.col - b.col;\r\n }\r\n\r\n return a.row - b.row;\r\n });\r\n }\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 获取某工作表中所有的单元格坐标对象集合\r\n * @param sheet 工作表实例\r\n * 返回数组集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]\r\n */\r\n getSheetAllCellObjs: (sheet: any): Array<CellModel> => {\r\n // 得到当前Sheet单元格范围\r\n const curSheetCellRange = [\r\n {\r\n row: 0,\r\n col: 0,\r\n rowCount: sheet.getRowCount(),\r\n colCount: sheet.getColumnCount(),\r\n },\r\n ];\r\n\r\n // 得到所有的单元格坐标对象集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]\r\n const allCellObjs = SheetUtils.getAllCellObjsByRanges(\r\n sheet,\r\n curSheetCellRange\r\n );\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 获取某工作表中选中的所有单元格坐标对象集合\r\n * @param spread 工作簿实例\r\n * 返回数组集合,格式如:[{ col: 0, row: 0 }]\r\n */\r\n getActiveSheetSelectCellObjs: (spread: any): Array<CellModel> => {\r\n // 当前激活的Sheet\r\n const sheet = spread.getActiveSheet();\r\n\r\n // 得到当前Sheet中选择的单元格范围集合\r\n const curSheetCellRange = sheet.getSelections();\r\n\r\n // 得到所有的单元格坐标对象集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]\r\n const allCellObjs = SheetUtils.getAllCellObjsByRanges(\r\n sheet,\r\n curSheetCellRange\r\n );\r\n\r\n return allCellObjs;\r\n },\r\n\r\n /**\r\n * 获取单元格类型名称\r\n * @param GC GC对象\r\n * @param sheet 工作表实例\r\n * @param row 单元格行索引\r\n * @param col 单元格列索引\r\n * @returns 返回单元格类型名称,如:button、radio、checkbox、checkboxList、hyperLink、comboBox、date、dateRange、calc\r\n */\r\n getCellType: (\r\n GC: any,\r\n sheet: any,\r\n row: number,\r\n col: number\r\n ): string | undefined => {\r\n let cellTypeName;\r\n\r\n // 先根据getCellType来获取\r\n const cellType = sheet.getCellType(row, col);\r\n\r\n if (cellType instanceof GC.Spread.Sheets.CellTypes.Button) {\r\n cellTypeName = \"button\";\r\n } else if (\r\n cellType instanceof GC.Spread.Sheets.CellTypes.RadioButtonList\r\n ) {\r\n cellTypeName = \"radio\";\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBox) {\r\n cellTypeName = \"checkbox\";\r\n } else if (\r\n cellType instanceof GC.Spread.Sheets.CellTypes.CheckBoxList\r\n ) {\r\n cellTypeName = \"checkboxList\";\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.HyperLink) {\r\n cellTypeName = \"hyperLink\";\r\n } else if (cellType instanceof GC.Spread.Sheets.CellTypes.ComboBox) {\r\n cellTypeName = \"comboBox\";\r\n }\r\n\r\n // 根据getStyle来获取\r\n if (cellTypeName == undefined || cellTypeName == null) {\r\n const cellStyle = sheet.getStyle(row, col);\r\n\r\n if (\r\n cellStyle &&\r\n cellStyle.cellButtons &&\r\n cellStyle.cellButtons.length > 0\r\n ) {\r\n if (cellStyle.cellButtons[0].command == \"openDateTimePicker\") {\r\n if (cellStyle.dropDowns && cellStyle.dropDowns.length > 0) {\r\n if (cellStyle.dropDowns[0].option.showDateRange) {\r\n cellTypeName = \"dateRange\";\r\n } else {\r\n cellTypeName = \"date\";\r\n }\r\n }\r\n } else if (\r\n cellStyle.cellButtons[0].command == \"openCalculator\"\r\n ) {\r\n cellTypeName = \"calc\";\r\n }\r\n }\r\n }\r\n\r\n return cellTypeName;\r\n },\r\n\r\n /**\r\n * 设置工作簿中所有工作表的缩放比例\r\n * @param scale 缩放比例,默认为:1(100%)\r\n */\r\n setSheetZoom: (spread: any, scale: number) => {\r\n // 暂停绘制\r\n spread.suspendPaint();\r\n\r\n const sheetCount = spread.getSheetCount();\r\n for (let i = 0; i < sheetCount; i++) {\r\n const sheet = spread.getSheet(i);\r\n\r\n sheet.zoom(scale);\r\n }\r\n\r\n // 恢复绘制\r\n spread.resumePaint();\r\n },\r\n\r\n /**\r\n * 设置当前激活的工作表中选中的单元格背景颜色\r\n * @param spread 工作簿实例\r\n * @param color 背景颜色\r\n */\r\n setActiveSheetBgColor: (spread: any, color: string) => {\r\n const sheet = spread.getActiveSheet();\r\n\r\n // 暂停绘制\r\n sheet.suspendPaint();\r\n\r\n //#region 方式1:通过getRange进行批量设置,推荐使用该方法来实现\r\n\r\n // 获取选择的多个单元格范围集合\r\n const selections = SheetUtils.getActiveSheetSelectCells(spread);\r\n\r\n // 循环每个选中的单元格范围\r\n selections.forEach((sel: CellModel) => {\r\n // 批量设置每个选中的单元格范围的背景颜色\r\n sheet\r\n .getRange(sel.row, sel.col, sel.rowCount, sel.colCount)\r\n .backColor(color);\r\n });\r\n\r\n //#endregion\r\n\r\n //#region 方式2:通过getCell获取单元格样式对每个单元格进行设置,此方式效率相对较低,不推荐\r\n\r\n // // 当前激活的工作表中所有选择的单元格\r\n // const selectCells = SheetUtils.getActiveSheetSelectCellObjs(spread);\r\n\r\n // selectCells.forEach(item => {\r\n // // 获取单元格对象\r\n // const cellObj = sheet.getCell(item.row, item.col);\r\n\r\n // // 获取单元格样式\r\n // let cellStyle = sheet.getStyle(item.row, item.col);\r\n // if (!cellStyle) {\r\n // // 不存在样式则new一个\r\n // cellStyle = new GC.Spread.Sheets.Style();\r\n // }\r\n\r\n // // 设置单元格背景颜色\r\n // cellStyle.backColor = color;\r\n\r\n // // 重新设置单元格样式\r\n // cellObj.setStyle(cellStyle);\r\n // });\r\n\r\n //#endregion\r\n\r\n // 恢复绘制\r\n sheet.resumePaint();\r\n },\r\n\r\n /**\r\n * 设置工作簿中所有工作表是否显示分页线\r\n * @param scale 缩放比例,默认为:1(100%)\r\n */\r\n setSheetShowPrintPageLine: (spread: any, isShow: boolean) => {\r\n // 暂停绘制\r\n spread.suspendPaint();\r\n\r\n const sheetCount = spread.getSheetCount();\r\n for (let i = 0; i < sheetCount; i++) {\r\n const sheet = spread.getSheet(i);\r\n\r\n var isVisible = sheet.isPrintLineVisible();\r\n sheet.isPrintLineVisible(!isVisible);\r\n }\r\n\r\n // 恢复绘制\r\n spread.resumePaint();\r\n },\r\n\r\n /**\r\n * 忽略工作工作表元格中指定字符串不显示,如:#DIV/0!、#VALUE!等\r\n * @param GC GC对象\r\n */\r\n ignoreSheetShowStrs: (GC: any) => {\r\n // 忽略的字符串集合\r\n const ignoreStrs: Array<string> = [\r\n \"#DIV/0!\",\r\n \"#VALUE!\",\r\n \"#NAME?\",\r\n \"#N/A\",\r\n \"#NULL!\",\r\n \"#NUM!\",\r\n \"#REF!\",\r\n ];\r\n\r\n // paint对象\r\n const ignorePaint = GC.Spread.Sheets.CellTypes.Text.prototype.paint;\r\n\r\n // 重写paint函数\r\n GC.Spread.Sheets.CellTypes.Text.prototype.paint = function (\r\n ctx: any,\r\n value: any,\r\n x: any,\r\n y: any,\r\n w: any,\r\n h: any,\r\n style: any,\r\n options: any\r\n ) {\r\n // 如果在忽略的字符串集合中有匹配的结果,则将其显示为空字符串\r\n if (ignoreStrs.some((item) => item == value)) {\r\n ignorePaint.call(this, ctx, \"/\", x, y, w, h, style, options);\r\n } else {\r\n ignorePaint.apply(this, arguments);\r\n }\r\n\r\n // // 或使用如下代码\r\n // if (ignoreStrs.some((item) => item == value)) {\r\n // \tvalue = '';\r\n // }\r\n // ignorePaint.apply(this, [ctx, value, x, y, w, h, style, options]);\r\n };\r\n },\r\n\r\n /**\r\n * 设置工作表显示辅助线(底部和右侧的辅助线)\r\n * @param sheet 工作表实例\r\n * @param width 宽度(像素)\r\n * @param height 高度(像素)\r\n * @param lineWidth 辅助线宽度(默认为:1像素)\r\n * @param colorStr 辅助线颜色(默认为:#409eff)\r\n * @param isHb 是否为横表(默认为:false)\r\n */\r\n setSheetAuxiliaryLine: (\r\n GC: any,\r\n sheet: any,\r\n width: number,\r\n height: number,\r\n lineWidth: number = 1,\r\n colorStr: string = \"#409eff\",\r\n isHb: boolean = false\r\n ) => {\r\n // 创建底部和右侧的浮动对象\r\n let floatBottom = new GC.Spread.Sheets.FloatingObjects.FloatingObject(\r\n `floatLineBottom${isHb ? \"Hb\" : \"\"}`,\r\n 0,\r\n height,\r\n width,\r\n lineWidth\r\n ),\r\n floatRight = new GC.Spread.Sheets.FloatingObjects.FloatingObject(\r\n `floatLineRight${isHb ? \"Hb\" : \"\"}`,\r\n width,\r\n 0,\r\n lineWidth,\r\n height\r\n );\r\n\r\n // 创建底部和右侧的div对象\r\n let divBottom = document.createElement(\"div\"),\r\n divRight = document.createElement(\"div\");\r\n\r\n // 设置底部div对象样式\r\n divBottom.style.width = `${width}px`;\r\n divBottom.style.height = \"1px\";\r\n divBottom.style.borderBottom = `${lineWidth}px dashed ${colorStr}`;\r\n\r\n // 设置右侧div对象样式\r\n divRight.style.width = \"1px\";\r\n divRight.style.height = `${height}px`;\r\n divRight.style.borderLeft = `${lineWidth}px dashed ${colorStr}`;\r\n\r\n // floatBottom.fixedPosition(true);\r\n // floatRight.fixedPosition(true);\r\n\r\n // 设置底部和右侧浮动对象不允许改变大小、不允许拖动和设置浮动对象的内容\r\n floatBottom.allowResize(false);\r\n floatBottom.allowMove(false);\r\n floatBottom.content(divBottom);\r\n floatRight.allowResize(false);\r\n floatRight.allowMove(false);\r\n floatRight.content(divRight);\r\n\r\n // 将浮动元素添加到工作表中\r\n sheet.floatingObjects.add(floatBottom);\r\n sheet.floatingObjects.add(floatRight);\r\n },\r\n};\r\n\r\n/**\r\n * 测试的函数\r\n * @param num 传入的参数\r\n * @returns 返回传入的参数+1\r\n */\r\nexport const TestFunc = (num: number) => {\r\n return num + 1;\r\n};\r\n","// 导出Excel文件所需的第三方包\r\nimport { saveAs } from \"file-saver\";\r\n\r\n/**\r\n * SpreadJS工作簿工具函数\r\n */\r\nexport const WorkbookUtils = {\r\n /**\r\n * 打印所有工作表\r\n * @param GC GC对象\r\n * @param spread 工作簿实例\r\n */\r\n print: (GC: any, spread: any) => {\r\n // 得到Sheet个数\r\n const sheetCount = spread.getSheetCount();\r\n\r\n for (let i = 0; i < sheetCount; i++) {\r\n const sheet = spread.getSheet(i);\r\n\r\n // 获取每个工作表的打印信息\r\n let printInfo = sheet.printInfo();\r\n\r\n // 隐藏行和列的头部信息\r\n printInfo.showRowHeader(\r\n GC.Spread.Sheets.Print.PrintVisibilityType.hide\r\n );\r\n printInfo.showColumnHeader(\r\n GC.Spread.Sheets.Print.PrintVisibilityType.hide\r\n );\r\n\r\n // // 显示和隐藏打印区域的辅助线\r\n // spread.getSheet(0).isPrintLineVisible(true);\r\n // spread.getSheet(0).isPrintLineVisible(!true);\r\n\r\n // 设置打印区域,这里是固定的,在业务应用中需要根据实际情况修改打印区域\r\n printInfo.rowStart(0);\r\n printInfo.rowEnd(sheet.getRowCount()); //printInfo.rowEnd(41);\r\n printInfo.columnStart(0);\r\n printInfo.columnEnd(76);\r\n\r\n // 设置SpreadJS自身的边距为合适的距离\r\n printInfo.margin({\r\n /**\r\n * 设置默认边距\r\n * 单位是:以百分之一英寸为单位\r\n * 也就是,如果我们需要设置左边距为25mm,需要将25mm先转换为英寸,然后再用这个英寸*100就是要设置的边距\r\n * 即:(25mm转换为英寸的结果)*100\r\n *\r\n * 参考文档:\r\n * https://demo.grapecity.com.cn/spreadjs/help/api/classes/GC.Spread.Sheets.Print.PrintInfo#margin\r\n * https://www.67tool.com/converter/length\r\n */\r\n // 纵表\r\n top: 0.5905511999999999 * 100,\r\n bottom: 0.5905511999999999 * 100,\r\n left: 0.9842520000000001 * 100,\r\n right: 0.5905511999999999 * 100,\r\n\r\n // // 横表\r\n // top: 0.9842520000000001 * 100,\r\n // bottom: 0.5905511999999999 * 100,\r\n // left: 0.5905511999999999 * 100,\r\n // right: 0.5905511999999999 * 100,\r\n\r\n // top: 0,\r\n // bottom: 0,\r\n // left: 0,\r\n // right: 0,\r\n header: 0,\r\n footer: 0,\r\n });\r\n\r\n // 设置打印的纸张\r\n printInfo.paperSize(\r\n new GC.Spread.Sheets.Print.PaperSize(\r\n GC.Spread.Sheets.Print.PaperKind.a4\r\n )\r\n );\r\n\r\n sheet.printInfo(printInfo);\r\n }\r\n\r\n // 调用打印方法\r\n spread.print();\r\n },\r\n\r\n /**\r\n * 导出为Excel文件\r\n * 如支持导出自定义公式的值等功能\r\n * @param GC Spread的GC对象\r\n * @param spread 原始Spread对象\r\n * @param fileName 导出的文件名称,不传则为第一个工作表的名称\r\n */\r\n exportToExcel: (GC: any, spread: any, fileName: string = \"\") => {\r\n // 导出模板为JSON对象,此处设置了参数includeBindingSource,改参数代表包含数据绑定的值\r\n const json = spread.toJSON({ includeBindingSource: true });\r\n\r\n // 需要移除的自定义公式名称集合(该变量的作用是,在导出Excel前,将工作簿中所有的自定义公式移除掉,其他内置的公式保留)\r\n const removeCustomFormulas = [\r\n \"YJMAX\",\r\n \"YJMIN\",\r\n \"YJMID\",\r\n \"YJGETNUM\",\r\n \"YJGETS\",\r\n \"YJGETCV\",\r\n \"YJINTERPOLATIONMETHOD\",\r\n \"YJINTERPOLATIONMETHOD_Y\",\r\n ];\r\n\r\n // 临时工作簿\r\n const tempSpread = new GC.Spread.Sheets.Workbook();\r\n tempSpread.fromJSON(json);\r\n\r\n // 暂停绘制\r\n tempSpread.suspendPaint();\r\n\r\n // 获取Sheet数量\r\n const sheetCount = tempSpread.getSheetCount();\r\n\r\n for (let iSheet = 0; iSheet < sheetCount; iSheet++) {\r\n // 当前工作表\r\n const sheet = tempSpread.getSheet(iSheet);\r\n\r\n // 暂停公式的计算,提高性能\r\n sheet.suspendCalcService();\r\n\r\n for (var i = 0; i < sheet.getRowCount(); i++) {\r\n for (var j = 0; j < sheet.getColumnCount(); j++) {\r\n // 获取单元格的公式\r\n const cellFormula = sheet.getFormula(i, j);\r\n\r\n // 如果cellFormula不为null或undefined,则说明该单元格引用了公式\r\n if (\r\n cellFormula != null &&\r\n cellFormula != undefined &&\r\n removeCustomFormulas.some(\r\n (item) => cellFormula.indexOf(item) > -1\r\n )\r\n ) {\r\n // 获取单元格的值\r\n const cellVal = sheet.getValue(i, j);\r\n\r\n // 移除单元格引用的公式\r\n sheet.getCell(i, j).formula(undefined);\r\n\r\n // 设置单元格的值\r\n sheet.setValue(i, j, cellVal);\r\n }\r\n }\r\n }\r\n\r\n // 恢复计算\r\n sheet.resumeCalcService(false);\r\n }\r\n\r\n // 恢复绘制\r\n tempSpread.resumePaint();\r\n\r\n if (fileName == \"\") {\r\n fileName = tempSpread.getSheet(0).name();\r\n }\r\n\r\n let options = {\r\n fileType: GC.Spread.Sheets.FileType.excel,\r\n includeBindingSource: true,\r\n includeStyles: true,\r\n includeFormulas: true,\r\n saveAsView: false,\r\n rowHeadersAsFrozenColumns: false,\r\n columnHeadersAsFrozenRows: false,\r\n includeAutoMergedCells: false,\r\n includeCalcModelCache: false,\r\n includeUnusedNames: true,\r\n includeEmptyRegionCells: true,\r\n };\r\n\r\n tempSpread.export(\r\n (blob: any) => {\r\n saveAs(blob, `${fileName}.xlsx`);\r\n },\r\n () => {},\r\n options\r\n );\r\n\r\n // 销毁临时工作簿\r\n tempSpread.destroy();\r\n },\r\n};\r\n"],"names":["CommonUtils","getColLetterName","colIndex","letter","remainder","String","fromCharCode","Math","floor","toUpperCase","SheetUtils","getActiveSheetSelectCells","spread","getActiveSheet","getSelections","setActiveSheetSelectCells","cellObj","setSelection","row","col","rowCount","colCount","getAllCellObjsByRanges","sheet","selectRanges","isMulColOrder","allCellObjs","forEach","item","index","getSpans","itemSpanCell","push","undefined","Error","i","j","getSpan","sort","a","b","getSheetAllCellObjs","curSheetCellRange","getRowCount","getColumnCount","getActiveSheetSelectCellObjs","getCellType","GC","cellTypeName","cellType","Spread","Sheets","CellTypes","Button","RadioButtonList","CheckBox","CheckBoxList","HyperLink","ComboBox","cellStyle","getStyle","cellButtons","length","command","dropDowns","option","showDateRange","setSheetZoom","scale","suspendPaint","sheetCount","getSheetCount","getSheet","zoom","resumePaint","setActiveSheetBgColor","color","sel","getRange","backColor","setSheetShowPrintPageLine","isShow","isVisible","isPrintLineVisible","ignoreSheetShowStrs","ignoreStrs","ignorePaint","Text","prototype","paint","ctx","value","x","y","w","h","style","options","some","call","this","apply","arguments","setSheetAuxiliaryLine","width","height","lineWidth","colorStr","isHb","floatBottom","FloatingObjects","FloatingObject","floatRight","divBottom","document","createElement","divRight","borderBottom","borderLeft","allowResize","allowMove","content","floatingObjects","add","WorkbookUtils","print","printInfo","showRowHeader","Print","PrintVisibilityType","hide","showColumnHeader","rowStart","rowEnd","columnStart","columnEnd","margin","top","bottom","left","right","header","footer","paperSize","PaperSize","PaperKind","a4","exportToExcel","fileName","json","toJSON","includeBindingSource","removeCustomFormulas","tempSpread","Workbook","fromJSON","iSheet","suspendCalcService","cellFormula","getFormula","indexOf","cellVal","getValue","getCell","formula","setValue","resumeCalcService","name","fileType","FileType","excel","includeStyles","includeFormulas","saveAsView","rowHeadersAsFrozenColumns","columnHeadersAsFrozenRows","includeAutoMergedCells","includeCalcModelCache","includeUnusedNames","includeEmptyRegionCells","export","blob","saveAs","destroy","num"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** 导出/types/sheet.ts中的所有type */
|
|
2
|
+
export * from "./types/sheet";
|
|
3
|
+
/** 导出/utils/common.ts中的所有属性或函数 */
|
|
4
|
+
export * from "./utils/common";
|
|
5
|
+
/** 导出/utils/sheet.ts中的所有属性或函数 */
|
|
6
|
+
export * from "./utils/sheet";
|
|
7
|
+
/** 导出/utils/wookbook.ts中的所有属性或函数 */
|
|
8
|
+
export * from "./utils/wookbook";
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { saveAs } from 'file-saver';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 公用工具函数
|
|
5
|
+
*/
|
|
6
|
+
const CommonUtils = {
|
|
7
|
+
/**
|
|
8
|
+
* 获取列的英文字母
|
|
9
|
+
* @param colIndex 列的索引
|
|
10
|
+
* @returns 返回英文字母
|
|
11
|
+
*/
|
|
12
|
+
getColLetterName: (colIndex) => {
|
|
13
|
+
colIndex += 1;
|
|
14
|
+
let letter = "";
|
|
15
|
+
while (colIndex > 0) {
|
|
16
|
+
const remainder = (colIndex - 1) % 26;
|
|
17
|
+
letter = String.fromCharCode(remainder + 65) + letter;
|
|
18
|
+
colIndex = Math.floor((colIndex - 1) / 26);
|
|
19
|
+
}
|
|
20
|
+
return letter.toUpperCase();
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* SpreadJS工作表工具函数
|
|
26
|
+
*/
|
|
27
|
+
const SheetUtils = {
|
|
28
|
+
/**
|
|
29
|
+
* 获取当前活动工作表选中的单元格集合
|
|
30
|
+
* @param spread 工作簿对象
|
|
31
|
+
* @returns 返回选中单元格的集合,格式如:[{row:,col:,rowCount:,colCount:}]
|
|
32
|
+
*/
|
|
33
|
+
getActiveSheetSelectCells: (spread) => {
|
|
34
|
+
const sheet = spread.getActiveSheet();
|
|
35
|
+
return sheet.getSelections();
|
|
36
|
+
},
|
|
37
|
+
/**
|
|
38
|
+
* 设置当前活动工作表某个单元格范围为选中状态
|
|
39
|
+
* @param spread 工作簿对象
|
|
40
|
+
* @param cellObj 设置选中的单元格,格式如:{row:0,col:0,rowCount:1,colCount:1}
|
|
41
|
+
*/
|
|
42
|
+
setActiveSheetSelectCells: (spread, cellObj) => {
|
|
43
|
+
const sheet = spread.getActiveSheet();
|
|
44
|
+
sheet.setSelection(cellObj.row, cellObj.col, cellObj.rowCount, cellObj.colCount);
|
|
45
|
+
},
|
|
46
|
+
/**
|
|
47
|
+
* 获取某工作表中某范围集合中所有的单元格坐标对象集合
|
|
48
|
+
* 该方法适用的场景如:手动选择了很多个单元格范围,在这些范围中可能包含独立的单元格,也可能包含合并的单元格,这时候就需要用到如下方法获取到所有单元格对象
|
|
49
|
+
* @param sheet 工作表实例
|
|
50
|
+
* @param selectRanges 单元格范围集合,格式如:[{ row: 0, col: 0, rowCount: 2, colCount: 2 }]
|
|
51
|
+
* @param isMulColOrder 是否按照多列的顺序排序单元格(true:按照第一列从上到下、第二列从上到下……的顺序获取单元格数据、false:按照第一行从左到右、第二行从左到右……的顺序获取单元格数据)
|
|
52
|
+
* 返回数组集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]
|
|
53
|
+
*/
|
|
54
|
+
getAllCellObjsByRanges: (sheet, selectRanges, isMulColOrder = false) => {
|
|
55
|
+
// 得到所有的单元格坐标对象集合,格式如:[{ row: 0, col: 0, rowCount: 1, colCount: 1 }]
|
|
56
|
+
let allCellObjs = [];
|
|
57
|
+
selectRanges.forEach((item, index) => {
|
|
58
|
+
// 得到当前item中所有合并的单元格对象集合
|
|
59
|
+
const itemSpanCells = sheet.getSpans(item);
|
|
60
|
+
itemSpanCells.forEach((itemSpanCell) => {
|
|
61
|
+
allCellObjs.push({
|
|
62
|
+
row: itemSpanCell.row,
|
|
63
|
+
col: itemSpanCell.col,
|
|
64
|
+
rowCount: itemSpanCell.rowCount,
|
|
65
|
+
colCount: itemSpanCell.colCount,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
if (item.row === undefined ||
|
|
69
|
+
item.col === undefined ||
|
|
70
|
+
item.rowCount === undefined ||
|
|
71
|
+
item.colCount === undefined) {
|
|
72
|
+
throw new Error("row、col、rowCount、colCount is required.");
|
|
73
|
+
}
|
|
74
|
+
// 遍历item中涉及到的所有单元格
|
|
75
|
+
for (let i = item.row; i < +item.row + item.rowCount; i++) {
|
|
76
|
+
for (let j = item.col; j < item.col + item.colCount; j++) {
|
|
77
|
+
const curSpanCellObj = sheet.getSpan(i, j);
|
|
78
|
+
// 检查当前单元格是否为合并单元格
|
|
79
|
+
if (curSpanCellObj == null) {
|
|
80
|
+
allCellObjs.push({
|
|
81
|
+
row: i,
|
|
82
|
+
col: j,
|
|
83
|
+
rowCount: 1,
|
|
84
|
+
colCount: 1,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// 常规顺序
|
|
91
|
+
if (!isMulColOrder) {
|
|
92
|
+
// 对单元格集合对象对象进行排序,先按row后按col进行升序排序(注意:此处非常重要,如果不排序,获取到的单元格顺序有可能是乱的【不完全按照模板顺序返回】)
|
|
93
|
+
allCellObjs.sort((a, b) => {
|
|
94
|
+
if (a.row === undefined ||
|
|
95
|
+
b.row === undefined ||
|
|
96
|
+
a.col === undefined ||
|
|
97
|
+
b.col === undefined) {
|
|
98
|
+
throw new Error("row、col is required.");
|
|
99
|
+
}
|
|
100
|
+
if (a.row == b.row) {
|
|
101
|
+
return a.col - b.col;
|
|
102
|
+
}
|
|
103
|
+
return a.row - b.row;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return allCellObjs;
|
|
107
|
+
},
|
|
108
|
+
/**
|
|
109
|
+
* 获取某工作表中所有的单元格坐标对象集合
|
|
110
|
+
* @param sheet 工作表实例
|
|
111
|
+
* 返回数组集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]
|
|
112
|
+
*/
|
|
113
|
+
getSheetAllCellObjs: (sheet) => {
|
|
114
|
+
// 得到当前Sheet单元格范围
|
|
115
|
+
const curSheetCellRange = [
|
|
116
|
+
{
|
|
117
|
+
row: 0,
|
|
118
|
+
col: 0,
|
|
119
|
+
rowCount: sheet.getRowCount(),
|
|
120
|
+
colCount: sheet.getColumnCount(),
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
// 得到所有的单元格坐标对象集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]
|
|
124
|
+
const allCellObjs = SheetUtils.getAllCellObjsByRanges(sheet, curSheetCellRange);
|
|
125
|
+
return allCellObjs;
|
|
126
|
+
},
|
|
127
|
+
/**
|
|
128
|
+
* 获取某工作表中选中的所有单元格坐标对象集合
|
|
129
|
+
* @param spread 工作簿实例
|
|
130
|
+
* 返回数组集合,格式如:[{ col: 0, row: 0 }]
|
|
131
|
+
*/
|
|
132
|
+
getActiveSheetSelectCellObjs: (spread) => {
|
|
133
|
+
// 当前激活的Sheet
|
|
134
|
+
const sheet = spread.getActiveSheet();
|
|
135
|
+
// 得到当前Sheet中选择的单元格范围集合
|
|
136
|
+
const curSheetCellRange = sheet.getSelections();
|
|
137
|
+
// 得到所有的单元格坐标对象集合,格式如:[{ col: 0, colCount: 2, row: 0, rowCount: 1 }]
|
|
138
|
+
const allCellObjs = SheetUtils.getAllCellObjsByRanges(sheet, curSheetCellRange);
|
|
139
|
+
return allCellObjs;
|
|
140
|
+
},
|
|
141
|
+
/**
|
|
142
|
+
* 获取单元格类型名称
|
|
143
|
+
* @param GC GC对象
|
|
144
|
+
* @param sheet 工作表实例
|
|
145
|
+
* @param row 单元格行索引
|
|
146
|
+
* @param col 单元格列索引
|
|
147
|
+
* @returns 返回单元格类型名称,如:button、radio、checkbox、checkboxList、hyperLink、comboBox、date、dateRange、calc
|
|
148
|
+
*/
|
|
149
|
+
getCellType: (GC, sheet, row, col) => {
|
|
150
|
+
let cellTypeName;
|
|
151
|
+
// 先根据getCellType来获取
|
|
152
|
+
const cellType = sheet.getCellType(row, col);
|
|
153
|
+
if (cellType instanceof GC.Spread.Sheets.CellTypes.Button) {
|
|
154
|
+
cellTypeName = "button";
|
|
155
|
+
}
|
|
156
|
+
else if (cellType instanceof GC.Spread.Sheets.CellTypes.RadioButtonList) {
|
|
157
|
+
cellTypeName = "radio";
|
|
158
|
+
}
|
|
159
|
+
else if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBox) {
|
|
160
|
+
cellTypeName = "checkbox";
|
|
161
|
+
}
|
|
162
|
+
else if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBoxList) {
|
|
163
|
+
cellTypeName = "checkboxList";
|
|
164
|
+
}
|
|
165
|
+
else if (cellType instanceof GC.Spread.Sheets.CellTypes.HyperLink) {
|
|
166
|
+
cellTypeName = "hyperLink";
|
|
167
|
+
}
|
|
168
|
+
else if (cellType instanceof GC.Spread.Sheets.CellTypes.ComboBox) {
|
|
169
|
+
cellTypeName = "comboBox";
|
|
170
|
+
}
|
|
171
|
+
// 根据getStyle来获取
|
|
172
|
+
if (cellTypeName == undefined || cellTypeName == null) {
|
|
173
|
+
const cellStyle = sheet.getStyle(row, col);
|
|
174
|
+
if (cellStyle &&
|
|
175
|
+
cellStyle.cellButtons &&
|
|
176
|
+
cellStyle.cellButtons.length > 0) {
|
|
177
|
+
if (cellStyle.cellButtons[0].command == "openDateTimePicker") {
|
|
178
|
+
if (cellStyle.dropDowns && cellStyle.dropDowns.length > 0) {
|
|
179
|
+
if (cellStyle.dropDowns[0].option.showDateRange) {
|
|
180
|
+
cellTypeName = "dateRange";
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
cellTypeName = "date";
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (cellStyle.cellButtons[0].command == "openCalculator") {
|
|
188
|
+
cellTypeName = "calc";
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return cellTypeName;
|
|
193
|
+
},
|
|
194
|
+
/**
|
|
195
|
+
* 设置工作簿中所有工作表的缩放比例
|
|
196
|
+
* @param scale 缩放比例,默认为:1(100%)
|
|
197
|
+
*/
|
|
198
|
+
setSheetZoom: (spread, scale) => {
|
|
199
|
+
// 暂停绘制
|
|
200
|
+
spread.suspendPaint();
|
|
201
|
+
const sheetCount = spread.getSheetCount();
|
|
202
|
+
for (let i = 0; i < sheetCount; i++) {
|
|
203
|
+
const sheet = spread.getSheet(i);
|
|
204
|
+
sheet.zoom(scale);
|
|
205
|
+
}
|
|
206
|
+
// 恢复绘制
|
|
207
|
+
spread.resumePaint();
|
|
208
|
+
},
|
|
209
|
+
/**
|
|
210
|
+
* 设置当前激活的工作表中选中的单元格背景颜色
|
|
211
|
+
* @param spread 工作簿实例
|
|
212
|
+
* @param color 背景颜色
|
|
213
|
+
*/
|
|
214
|
+
setActiveSheetBgColor: (spread, color) => {
|
|
215
|
+
const sheet = spread.getActiveSheet();
|
|
216
|
+
// 暂停绘制
|
|
217
|
+
sheet.suspendPaint();
|
|
218
|
+
//#region 方式1:通过getRange进行批量设置,推荐使用该方法来实现
|
|
219
|
+
// 获取选择的多个单元格范围集合
|
|
220
|
+
const selections = SheetUtils.getActiveSheetSelectCells(spread);
|
|
221
|
+
// 循环每个选中的单元格范围
|
|
222
|
+
selections.forEach((sel) => {
|
|
223
|
+
// 批量设置每个选中的单元格范围的背景颜色
|
|
224
|
+
sheet
|
|
225
|
+
.getRange(sel.row, sel.col, sel.rowCount, sel.colCount)
|
|
226
|
+
.backColor(color);
|
|
227
|
+
});
|
|
228
|
+
//#endregion
|
|
229
|
+
//#region 方式2:通过getCell获取单元格样式对每个单元格进行设置,此方式效率相对较低,不推荐
|
|
230
|
+
// // 当前激活的工作表中所有选择的单元格
|
|
231
|
+
// const selectCells = SheetUtils.getActiveSheetSelectCellObjs(spread);
|
|
232
|
+
// selectCells.forEach(item => {
|
|
233
|
+
// // 获取单元格对象
|
|
234
|
+
// const cellObj = sheet.getCell(item.row, item.col);
|
|
235
|
+
// // 获取单元格样式
|
|
236
|
+
// let cellStyle = sheet.getStyle(item.row, item.col);
|
|
237
|
+
// if (!cellStyle) {
|
|
238
|
+
// // 不存在样式则new一个
|
|
239
|
+
// cellStyle = new GC.Spread.Sheets.Style();
|
|
240
|
+
// }
|
|
241
|
+
// // 设置单元格背景颜色
|
|
242
|
+
// cellStyle.backColor = color;
|
|
243
|
+
// // 重新设置单元格样式
|
|
244
|
+
// cellObj.setStyle(cellStyle);
|
|
245
|
+
// });
|
|
246
|
+
//#endregion
|
|
247
|
+
// 恢复绘制
|
|
248
|
+
sheet.resumePaint();
|
|
249
|
+
},
|
|
250
|
+
/**
|
|
251
|
+
* 设置工作簿中所有工作表是否显示分页线
|
|
252
|
+
* @param scale 缩放比例,默认为:1(100%)
|
|
253
|
+
*/
|
|
254
|
+
setSheetShowPrintPageLine: (spread, isShow) => {
|
|
255
|
+
// 暂停绘制
|
|
256
|
+
spread.suspendPaint();
|
|
257
|
+
const sheetCount = spread.getSheetCount();
|
|
258
|
+
for (let i = 0; i < sheetCount; i++) {
|
|
259
|
+
const sheet = spread.getSheet(i);
|
|
260
|
+
var isVisible = sheet.isPrintLineVisible();
|
|
261
|
+
sheet.isPrintLineVisible(!isVisible);
|
|
262
|
+
}
|
|
263
|
+
// 恢复绘制
|
|
264
|
+
spread.resumePaint();
|
|
265
|
+
},
|
|
266
|
+
/**
|
|
267
|
+
* 忽略工作工作表元格中指定字符串不显示,如:#DIV/0!、#VALUE!等
|
|
268
|
+
* @param GC GC对象
|
|
269
|
+
*/
|
|
270
|
+
ignoreSheetShowStrs: (GC) => {
|
|
271
|
+
// 忽略的字符串集合
|
|
272
|
+
const ignoreStrs = [
|
|
273
|
+
"#DIV/0!",
|
|
274
|
+
"#VALUE!",
|
|
275
|
+
"#NAME?",
|
|
276
|
+
"#N/A",
|
|
277
|
+
"#NULL!",
|
|
278
|
+
"#NUM!",
|
|
279
|
+
"#REF!",
|
|
280
|
+
];
|
|
281
|
+
// paint对象
|
|
282
|
+
const ignorePaint = GC.Spread.Sheets.CellTypes.Text.prototype.paint;
|
|
283
|
+
// 重写paint函数
|
|
284
|
+
GC.Spread.Sheets.CellTypes.Text.prototype.paint = function (ctx, value, x, y, w, h, style, options) {
|
|
285
|
+
// 如果在忽略的字符串集合中有匹配的结果,则将其显示为空字符串
|
|
286
|
+
if (ignoreStrs.some((item) => item == value)) {
|
|
287
|
+
ignorePaint.call(this, ctx, "/", x, y, w, h, style, options);
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
ignorePaint.apply(this, arguments);
|
|
291
|
+
}
|
|
292
|
+
// // 或使用如下代码
|
|
293
|
+
// if (ignoreStrs.some((item) => item == value)) {
|
|
294
|
+
// value = '';
|
|
295
|
+
// }
|
|
296
|
+
// ignorePaint.apply(this, [ctx, value, x, y, w, h, style, options]);
|
|
297
|
+
};
|
|
298
|
+
},
|
|
299
|
+
/**
|
|
300
|
+
* 设置工作表显示辅助线(底部和右侧的辅助线)
|
|
301
|
+
* @param sheet 工作表实例
|
|
302
|
+
* @param width 宽度(像素)
|
|
303
|
+
* @param height 高度(像素)
|
|
304
|
+
* @param lineWidth 辅助线宽度(默认为:1像素)
|
|
305
|
+
* @param colorStr 辅助线颜色(默认为:#409eff)
|
|
306
|
+
* @param isHb 是否为横表(默认为:false)
|
|
307
|
+
*/
|
|
308
|
+
setSheetAuxiliaryLine: (GC, sheet, width, height, lineWidth = 1, colorStr = "#409eff", isHb = false) => {
|
|
309
|
+
// 创建底部和右侧的浮动对象
|
|
310
|
+
let floatBottom = new GC.Spread.Sheets.FloatingObjects.FloatingObject(`floatLineBottom${isHb ? "Hb" : ""}`, 0, height, width, lineWidth), floatRight = new GC.Spread.Sheets.FloatingObjects.FloatingObject(`floatLineRight${isHb ? "Hb" : ""}`, width, 0, lineWidth, height);
|
|
311
|
+
// 创建底部和右侧的div对象
|
|
312
|
+
let divBottom = document.createElement("div"), divRight = document.createElement("div");
|
|
313
|
+
// 设置底部div对象样式
|
|
314
|
+
divBottom.style.width = `${width}px`;
|
|
315
|
+
divBottom.style.height = "1px";
|
|
316
|
+
divBottom.style.borderBottom = `${lineWidth}px dashed ${colorStr}`;
|
|
317
|
+
// 设置右侧div对象样式
|
|
318
|
+
divRight.style.width = "1px";
|
|
319
|
+
divRight.style.height = `${height}px`;
|
|
320
|
+
divRight.style.borderLeft = `${lineWidth}px dashed ${colorStr}`;
|
|
321
|
+
// floatBottom.fixedPosition(true);
|
|
322
|
+
// floatRight.fixedPosition(true);
|
|
323
|
+
// 设置底部和右侧浮动对象不允许改变大小、不允许拖动和设置浮动对象的内容
|
|
324
|
+
floatBottom.allowResize(false);
|
|
325
|
+
floatBottom.allowMove(false);
|
|
326
|
+
floatBottom.content(divBottom);
|
|
327
|
+
floatRight.allowResize(false);
|
|
328
|
+
floatRight.allowMove(false);
|
|
329
|
+
floatRight.content(divRight);
|
|
330
|
+
// 将浮动元素添加到工作表中
|
|
331
|
+
sheet.floatingObjects.add(floatBottom);
|
|
332
|
+
sheet.floatingObjects.add(floatRight);
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
/**
|
|
336
|
+
* 测试的函数
|
|
337
|
+
* @param num 传入的参数
|
|
338
|
+
* @returns 返回传入的参数+1
|
|
339
|
+
*/
|
|
340
|
+
const TestFunc = (num) => {
|
|
341
|
+
return num + 1;
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
// 导出Excel文件所需的第三方包
|
|
345
|
+
/**
|
|
346
|
+
* SpreadJS工作簿工具函数
|
|
347
|
+
*/
|
|
348
|
+
const WorkbookUtils = {
|
|
349
|
+
/**
|
|
350
|
+
* 打印所有工作表
|
|
351
|
+
* @param GC GC对象
|
|
352
|
+
* @param spread 工作簿实例
|
|
353
|
+
*/
|
|
354
|
+
print: (GC, spread) => {
|
|
355
|
+
// 得到Sheet个数
|
|
356
|
+
const sheetCount = spread.getSheetCount();
|
|
357
|
+
for (let i = 0; i < sheetCount; i++) {
|
|
358
|
+
const sheet = spread.getSheet(i);
|
|
359
|
+
// 获取每个工作表的打印信息
|
|
360
|
+
let printInfo = sheet.printInfo();
|
|
361
|
+
// 隐藏行和列的头部信息
|
|
362
|
+
printInfo.showRowHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide);
|
|
363
|
+
printInfo.showColumnHeader(GC.Spread.Sheets.Print.PrintVisibilityType.hide);
|
|
364
|
+
// // 显示和隐藏打印区域的辅助线
|
|
365
|
+
// spread.getSheet(0).isPrintLineVisible(true);
|
|
366
|
+
// spread.getSheet(0).isPrintLineVisible(!true);
|
|
367
|
+
// 设置打印区域,这里是固定的,在业务应用中需要根据实际情况修改打印区域
|
|
368
|
+
printInfo.rowStart(0);
|
|
369
|
+
printInfo.rowEnd(sheet.getRowCount()); //printInfo.rowEnd(41);
|
|
370
|
+
printInfo.columnStart(0);
|
|
371
|
+
printInfo.columnEnd(76);
|
|
372
|
+
// 设置SpreadJS自身的边距为合适的距离
|
|
373
|
+
printInfo.margin({
|
|
374
|
+
/**
|
|
375
|
+
* 设置默认边距
|
|
376
|
+
* 单位是:以百分之一英寸为单位
|
|
377
|
+
* 也就是,如果我们需要设置左边距为25mm,需要将25mm先转换为英寸,然后再用这个英寸*100就是要设置的边距
|
|
378
|
+
* 即:(25mm转换为英寸的结果)*100
|
|
379
|
+
*
|
|
380
|
+
* 参考文档:
|
|
381
|
+
* https://demo.grapecity.com.cn/spreadjs/help/api/classes/GC.Spread.Sheets.Print.PrintInfo#margin
|
|
382
|
+
* https://www.67tool.com/converter/length
|
|
383
|
+
*/
|
|
384
|
+
// 纵表
|
|
385
|
+
top: 0.5905511999999999 * 100,
|
|
386
|
+
bottom: 0.5905511999999999 * 100,
|
|
387
|
+
left: 0.9842520000000001 * 100,
|
|
388
|
+
right: 0.5905511999999999 * 100,
|
|
389
|
+
// // 横表
|
|
390
|
+
// top: 0.9842520000000001 * 100,
|
|
391
|
+
// bottom: 0.5905511999999999 * 100,
|
|
392
|
+
// left: 0.5905511999999999 * 100,
|
|
393
|
+
// right: 0.5905511999999999 * 100,
|
|
394
|
+
// top: 0,
|
|
395
|
+
// bottom: 0,
|
|
396
|
+
// left: 0,
|
|
397
|
+
// right: 0,
|
|
398
|
+
header: 0,
|
|
399
|
+
footer: 0,
|
|
400
|
+
});
|
|
401
|
+
// 设置打印的纸张
|
|
402
|
+
printInfo.paperSize(new GC.Spread.Sheets.Print.PaperSize(GC.Spread.Sheets.Print.PaperKind.a4));
|
|
403
|
+
sheet.printInfo(printInfo);
|
|
404
|
+
}
|
|
405
|
+
// 调用打印方法
|
|
406
|
+
spread.print();
|
|
407
|
+
},
|
|
408
|
+
/**
|
|
409
|
+
* 导出为Excel文件
|
|
410
|
+
* 如支持导出自定义公式的值等功能
|
|
411
|
+
* @param GC Spread的GC对象
|
|
412
|
+
* @param spread 原始Spread对象
|
|
413
|
+
* @param fileName 导出的文件名称,不传则为第一个工作表的名称
|
|
414
|
+
*/
|
|
415
|
+
exportToExcel: (GC, spread, fileName = "") => {
|
|
416
|
+
// 导出模板为JSON对象,此处设置了参数includeBindingSource,改参数代表包含数据绑定的值
|
|
417
|
+
const json = spread.toJSON({ includeBindingSource: true });
|
|
418
|
+
// 需要移除的自定义公式名称集合(该变量的作用是,在导出Excel前,将工作簿中所有的自定义公式移除掉,其他内置的公式保留)
|
|
419
|
+
const removeCustomFormulas = [
|
|
420
|
+
"YJMAX",
|
|
421
|
+
"YJMIN",
|
|
422
|
+
"YJMID",
|
|
423
|
+
"YJGETNUM",
|
|
424
|
+
"YJGETS",
|
|
425
|
+
"YJGETCV",
|
|
426
|
+
"YJINTERPOLATIONMETHOD",
|
|
427
|
+
"YJINTERPOLATIONMETHOD_Y",
|
|
428
|
+
];
|
|
429
|
+
// 临时工作簿
|
|
430
|
+
const tempSpread = new GC.Spread.Sheets.Workbook();
|
|
431
|
+
tempSpread.fromJSON(json);
|
|
432
|
+
// 暂停绘制
|
|
433
|
+
tempSpread.suspendPaint();
|
|
434
|
+
// 获取Sheet数量
|
|
435
|
+
const sheetCount = tempSpread.getSheetCount();
|
|
436
|
+
for (let iSheet = 0; iSheet < sheetCount; iSheet++) {
|
|
437
|
+
// 当前工作表
|
|
438
|
+
const sheet = tempSpread.getSheet(iSheet);
|
|
439
|
+
// 暂停公式的计算,提高性能
|
|
440
|
+
sheet.suspendCalcService();
|
|
441
|
+
for (var i = 0; i < sheet.getRowCount(); i++) {
|
|
442
|
+
for (var j = 0; j < sheet.getColumnCount(); j++) {
|
|
443
|
+
// 获取单元格的公式
|
|
444
|
+
const cellFormula = sheet.getFormula(i, j);
|
|
445
|
+
// 如果cellFormula不为null或undefined,则说明该单元格引用了公式
|
|
446
|
+
if (cellFormula != null &&
|
|
447
|
+
cellFormula != undefined &&
|
|
448
|
+
removeCustomFormulas.some((item) => cellFormula.indexOf(item) > -1)) {
|
|
449
|
+
// 获取单元格的值
|
|
450
|
+
const cellVal = sheet.getValue(i, j);
|
|
451
|
+
// 移除单元格引用的公式
|
|
452
|
+
sheet.getCell(i, j).formula(undefined);
|
|
453
|
+
// 设置单元格的值
|
|
454
|
+
sheet.setValue(i, j, cellVal);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
// 恢复计算
|
|
459
|
+
sheet.resumeCalcService(false);
|
|
460
|
+
}
|
|
461
|
+
// 恢复绘制
|
|
462
|
+
tempSpread.resumePaint();
|
|
463
|
+
if (fileName == "") {
|
|
464
|
+
fileName = tempSpread.getSheet(0).name();
|
|
465
|
+
}
|
|
466
|
+
let options = {
|
|
467
|
+
fileType: GC.Spread.Sheets.FileType.excel,
|
|
468
|
+
includeBindingSource: true,
|
|
469
|
+
includeStyles: true,
|
|
470
|
+
includeFormulas: true,
|
|
471
|
+
saveAsView: false,
|
|
472
|
+
rowHeadersAsFrozenColumns: false,
|
|
473
|
+
columnHeadersAsFrozenRows: false,
|
|
474
|
+
includeAutoMergedCells: false,
|
|
475
|
+
includeCalcModelCache: false,
|
|
476
|
+
includeUnusedNames: true,
|
|
477
|
+
includeEmptyRegionCells: true,
|
|
478
|
+
};
|
|
479
|
+
tempSpread.export((blob) => {
|
|
480
|
+
saveAs(blob, `${fileName}.xlsx`);
|
|
481
|
+
}, () => { }, options);
|
|
482
|
+
// 销毁临时工作簿
|
|
483
|
+
tempSpread.destroy();
|
|
484
|
+
},
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
export { CommonUtils, SheetUtils, TestFunc, WorkbookUtils };
|
|
488
|
+
//# sourceMappingURL=index.esm.js.map
|