爱迪生 发表于 2022-3-31 12:29:26

用SpreadJS和GCExcel实现模板语法的实时预览

我们在用GCExcel的模板语法时,每次在Excel中写完模板,去执行完扩展模板以后,需要再次打开扩展后的表格,非常不方便,因此结合SpreadJS,用SpreadJS进行模板编辑,以及扩展后的结果查看会事半功倍
1.加载模板,将模板展示到SpreadJS中

var spread = new GC.Spread.Sheets.Workbook(document.getElementById('ss'), {
                                sheetCount: 1
                        });
                        // 加载一级行模板
                        $("#loadA").click(function () {
                                var excelIo = new GC.Spread.Excel.IO();
                                // Download Excel file
                                var excelFilePath = 'span/一级行汇总.xlsx';
                                var xhr = new XMLHttpRequest();
                                xhr.open('GET', excelFilePath, true);
                                xhr.responseType = 'blob';
                                xhr.onload = function (e) {
                                        if (this.status == 200) {
                                                // get binary data as a response
                                                var blob = this.response;
                                                // convert Excel to JSON
                                                excelIo.open(blob, function (json) {
                                                        var workbookObj = json;
                                                        spread.fromJSON(workbookObj);
                                                }, function (e) {
                                                        // process error
                                                        alert(e.errorMessage);
                                                }, {});
                                        }
                                };
                                xhr.send();
                        })   页面如下:


2.保存模板(将修改后的模板传给后端保存到模板路径)前端代码:
$("#saveA").click(function () {
                                var json = spread.toJSON();
                                var excelIo = new GC.Spread.Excel.IO();
                                // here is excel IO API   
                                excelIo.save(json, function (blob) {
                                        var fd = new FormData();
                                        fd.append("file", blob);
                                        $.ajax({
                                                url: "exportExcelA",
                                                type: "POST",
                                                contentType: false,
                                                processData: false,
                                                data: fd,
                                                success: function (data) {
                                                        if (data.isSuccess == 1) {
                                                                alert("上传成功!");
                                                        } else {
                                                                alert(data.errorMessage);
                                                        }
                                                },
                                                error: function (ex) {
                                                        alert("上传失败:" + ex);
                                                }
                                        });
                                }, function (e) {
                                        alert(e);
                                });
                        })后端代码:// 保存一级行模板
        @RequestMapping(value = "/exportExcelA", method = RequestMethod.POST)
        @ResponseBody
        public Map<String, Object> exportExcelA(HttpServletRequest request, @RequestParam("file") MultipartFile file)
                        throws IOException, ServletException {
                String path = ClassUtils.getDefaultClassLoader().getResource("").getPath() + File.separator + "static"
                                + File.separator + "span";
                System.out.println(path);
                File floaderpath = new File(path);
                if (!floaderpath.exists()) {
                        floaderpath.mkdir();
                }
                // File newfile = new File(path + File.separator + new Date().getTime() +
                // ".xlsx");
                File newfile = new File(path + File.separator + "一级行汇总.xlsx");

                int result = 0;
                Map<String, Object> resultMap = new HashMap<String, Object>();
                try {
                        file.transferTo(newfile);
                        resultMap.put("isSuccess", 1);
                } catch (Exception e) {
                        resultMap.put("isSuccess", result);
                        resultMap.put("errorMessage", e.getMessage());
                        e.printStackTrace();
                }
                return resultMap;
        }3.模板扩展:
// 将二级行数据汇总到一级行
        @RequestMapping(value = "/spanExcelA", method = RequestMethod.GET)
        @ResponseBody
        public Map<String, Object> spanExcelA(HttpServletRequest request) throws IOException, ServletException {
                int result = 0;
                Map<String, Object> resultMap = new HashMap<String, Object>();
                String spanPath = ClassUtils.getDefaultClassLoader().getResource("").getPath() + File.separator + "static"
                                + File.separator + "result";
                String savePath = ClassUtils.getDefaultClassLoader().getResource("").getPath() + File.separator + "static"
                                + File.separator + "span";
                File savefloaderpath = new File(savePath);
                if (!savefloaderpath.exists()) {
                        savefloaderpath.mkdir();
                }
                try {
                        // 初始化合并workbook并载入合并模板
                        Workbook spanWorkbook = new Workbook();
                        spanWorkbook.open(FillInSpreadApplication.class.getClassLoader().getResourceAsStream("static/span/一级行汇总.xlsx"));
                        SalesData datasource = new SalesData();
                        datasource.salary = new ArrayList<SalesRecord>();

                        // #region Init Data
                        SalesRecord record1 = new SalesRecord();
                        record1.name = "二级行A";
                        record1.project = "1. 当年成本列支数(财务口径)";
                        record1.salariesPayable = 6000;
                        record1.otherSubjectsSalariesPayable = 3000;
                        record1.employeeWelfare = 2000;
                        record1.educationFunds = 4000;
                        record1.educationFundsOtherSubjects = 6000;
                        record1.tradeUnionFundsOtherSubjects = 7000;
                        datasource.salary.add(record1);

                        SalesRecord record2 = new SalesRecord();
                        record2.name = "二级行B";
                        record2.project = "1. 当年成本列支数(财务口径)";
                        record2.salariesPayable = 5000;
                        record2.otherSubjectsSalariesPayable = 3000;
                        record2.employeeWelfare = 2000;
                        record2.educationFunds = 4000;
                        record2.educationFundsOtherSubjects = 6000;
                        record2.tradeUnionFundsOtherSubjects = 7000;
                        datasource.salary.add(record2);

                        SalesRecord record3 = new SalesRecord();
                        record3.name = "二级行C";
                        record3.project = "1. 当年成本列支数(财务口径)";
                        record3.salariesPayable = 5000;
                        record3.otherSubjectsSalariesPayable = 3000;
                        record3.employeeWelfare = 2000;
                        record3.educationFunds = 4000;
                        record3.educationFundsOtherSubjects = 6000;
                        record3.tradeUnionFundsOtherSubjects = 7000;
                        datasource.salary.add(record3);

                        SalesRecord record4 = new SalesRecord();
                        record4.name = "二级行A";
                        record4.project = "2. 加:其他成本支出科目中核算金额";
                        record4.salariesPayable = 5000;
                        record4.otherSubjectsSalariesPayable = 3000;
                        record4.employeeWelfare = 2000;
                        record4.educationFunds = 4000;
                        record4.educationFundsOtherSubjects = 6000;
                        record4.tradeUnionFundsOtherSubjects = 7000;
                        datasource.salary.add(record4);

                        SalesRecord record5 = new SalesRecord();
                        record5.name = "二级行B";
                        record5.project = "2. 加:其他成本支出科目中核算金额";
                        record5.salariesPayable = 5000;
                        record5.otherSubjectsSalariesPayable = 3000;
                        record5.employeeWelfare = 2000;
                        record5.educationFunds = 4000;
                        record5.educationFundsOtherSubjects = 6000;
                        record5.tradeUnionFundsOtherSubjects = 7000;
                        datasource.salary.add(record5);

                        SalesRecord record6 = new SalesRecord();
                        record6.name = "二级行C";
                        record6.project = "2. 加:其他成本支出科目中核算金额";
                        record6.salariesPayable = 5000;
                        record6.otherSubjectsSalariesPayable = 3000;
                        record6.employeeWelfare = 2000;
                        record6.educationFunds = 4000;
                        record6.educationFundsOtherSubjects = 6000;
                        record6.tradeUnionFundsOtherSubjects = 7000;
                        datasource.salary.add(record6);

                        // #endregion
                        System.out.println(datasource.salary.size());

                        // Init template global settings
                        spanWorkbook.getNames().add("TemplateOptions.KeepLineSize", "true");

                        // Add data source
                        spanWorkbook.addDataSource("ds", datasource);
                        // Invoke to process the template
                        spanWorkbook.processTemplate();

                        // Save to an excel file
                        spanWorkbook.save(savePath + File.separator + "一级行汇总结果.xlsx");
                        resultMap.put("合并成功", 1);
                } catch (Exception e) {
                        resultMap.put("isSuccess", result);
                        resultMap.put("errorMessage", e.getMessage());
                        e.printStackTrace();
                }
                return resultMap;
        }4.加载模板扩展后的报表:
// 展示一级行汇总结果
                        $("#loadSpanA").click(function () {
                                var excelIo = new GC.Spread.Excel.IO();
                                // Download Excel file
                                var excelFilePath = 'span/一级行汇总结果.xlsx';
                                var xhr = new XMLHttpRequest();
                                xhr.open('GET', excelFilePath, true);
                                xhr.responseType = 'blob';
                                xhr.onload = function (e) {
                                        if (this.status == 200) {
                                                // get binary data as a response
                                                var blob = this.response;
                                                // convert Excel to JSON
                                                excelIo.open(blob, function (json) {
                                                        var workbookObj = json;
                                                        spread.fromJSON(workbookObj);
                                                        spread.setActiveSheet("工资三费");
                                                }, function (e) {
                                                        // process error
                                                        alert(e.errorMessage);
                                                }, {});
                                        }
                                };
                                xhr.send();
                        })SpreadJS的展示效果如下:

非常的方便,完整代码见附件

页: [1]
查看完整版本: 用SpreadJS和GCExcel实现模板语法的实时预览