是的,我刚才就是按照你说的思路对需求进行实现了。
虽然这样可以实现该需求,但是我担心会不会在效率上有所损失,毕竟是每个表单每个单元格去查找公式,一旦表单很多,不知效率如何。
具体实现参见如下代码:
- /**
- * 导出为Excel文件(保留自定义公式的值)
- * 如支持导出自定义公式的值等功能
- * @param spread 原始Spread对象
- * @param GC Spread的GC对象
- * @param fileName 导出的文件名称,不传则为第一个表单的名称
- */
- const exportToExcelPlus = (spread: any, GC: any, fileName: string = "") => {
- const json = spread.toJSON();
- //需要移除的自定义公式名称集合(该变量的作用是,在导出Excel前,将工作簿中所有的自定义公式移除掉,其他内置的公式保留)
- const removeCustomFormulas = [
- "YJMAX",
- "YJMIN",
- "YJMID",
- "YJGETNUM",
- "YJGETS",
- "YJGETCV",
- "YJINTERPOLATIONMETHOD",
- "YJINTERPOLATIONMETHOD_Y",
- ];
- //临时工作簿
- const tempSpread = new GC.Spread.Sheets.Workbook();
- tempSpread.fromJSON(json);
- //暂停绘制
- tempSpread.suspendPaint();
- //获取Sheet数量
- const sheetCount = tempSpread.getSheetCount();
- for (let iSheet = 0; iSheet < sheetCount; iSheet++) {
- //当前表单
- const sheet = tempSpread.getSheet(iSheet);
- //暂停公式的计算,提高新能
- sheet.suspendCalcService();
- for (var i = 0; i < sheet.getRowCount(); i++) {
- for (var j = 0; j < sheet.getColumnCount(); j++) {
- //获取单元格的公式
- const cellFormula = sheet.getFormula(i, j);
- //如果cellFormula不为null或undefined,则说明该单元格引用了公式
- if (
- cellFormula != null &&
- cellFormula != undefined &&
- removeCustomFormulas.some(
- (item) => cellFormula.indexOf(item) > -1
- )
- ) {
- //获取单元格的值
- const cellVal = sheet.getValue(i, j);
- //移除单元格引用的公式
- sheet.getCell(i, j).formula(undefined);
- //设置单元格的值
- sheet.setValue(i, j, cellVal);
- }
- }
- }
- //恢复计算
- sheet.resumeCalcService(false);
- }
- //恢复绘制
- tempSpread.resumePaint();
- if (fileName == "") {
- fileName = tempSpread.getSheet(0).name();
- }
- let options = {
- fileType: GC.Spread.Sheets.FileType.excel,
- includeBindingSource: true,
- includeStyles: true,
- includeFormulas: true,
- saveAsView: false,
- rowHeadersAsFrozenColumns: false,
- columnHeadersAsFrozenRows: false,
- includeAutoMergedCells: false,
- includeCalcModelCache: false,
- includeUnusedNames: true,
- includeEmptyRegionCells: true,
- };
- tempSpread.export(
- (blob) => {
- saveAs(blob, `${fileName}.xlsx`);
- },
- () => {},
- options
- );
- //销毁临时工作簿
- tempSpread.destroy();
- };
复制代码
|