找回密码
 立即注册

QQ登录

只需一步,快速开始

Fiooona
论坛元老   /  发表于:2020-9-23 15:08  /   查看:3140  /  回复:0
本帖最后由 Fiooona 于 2020-9-23 15:11 编辑

       一般在做出重要的财务和投资计划选择时,了解企业的​​财务状况、销售额至关重要。例如,查看公司的财务情况可以帮助您在扩展业务时判断投资回报率。

SpreadJS可用于创建财务应用程序,以帮助您跟踪公司的支出和销售额。本文将演示如何使用JavaScript创建财务应用程序。

image.png865887145.png
附件中可下载本文中使用的示例。

创建模板
为了使应用程序的设计更加容易,我们可以使用SpreadJS 设计器设置单元格类型,样式和间距。就本教程而言,我已经创建了可以使用的模板:
image.png48702086.png


该模板有一下几个工作表:
  • CompanyDashboard:应用程序的主视图,使用一些图表总结其他工作表
  • Banking:查看公司的所有付款以及帐户的当前余额
  • Expenses:公司每天的支出清单
  • SalesTransactions:公司对客户的所有销售列表
  • CheckingTemplate:“银行”工作表上支票账户余额的范围模板
  • DashboardBalanceTemplate:“ CompanyDashboard”工作表上支票账户余额的范围模板


创建JavaScript应用程序

首先,我们需要创建一个HTML文件来加载所有必需的库和文件,包括SJS引用,JS数据文件和模板:
  1. <font size="4"><!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <meta charset="utf-8" />
  5.     <title>Spread JS</title>
  6. <blockquote> <link href="gc.spread.sheets.excel2013white.13.0.0.css" rel="stylesheet" type="text/css" />
复制代码
在这种情况下,我使用的是来自NPM的SpreadJS文件,可以使用以下命令在应用程序的文件夹中运行该文件,将其安装在您的应用程序中:
  1. <font size="4">npm install @grapecity/spread-excelio @grapecity/spread-sheets @grapecity/spread-sheets-charts</font>
复制代码
接下来,我们可以使用刚刚创建的模板来初始化工作簿,以及为工作表设置一些变量:
  1. <font size="4">window.onload = function() {
  2.     var spread = new GC.Spread.Sheets.Workbook(document.getElementById("spreadSheet"), { sheetCount: 3 });
  3.     spread.fromJSON(FinancialTemplate);
  4.     spread.options.allowDynamicArray = true;
  5.     spread.setActiveSheetIndex(0);
  6.     var bankingSheet = spread.getSheet(1);
  7.     var expensesSheet = spread.getSheet(2);
  8.     var salesTransactionsSheet = spread.getSheet(3);
  9. }</font>
复制代码
然后,我们创建一些函数来加载每个工作表以设置数据和公式,下面是我们调用这些函数的代码:
  1. <font size="4">spread.suspendPaint();
  2. setBankingSheet(spread);
  3. setExpensesSheet(expensesSheet);
  4. setSalesTransactionsSheet(salesTransactionsSheet);
  5. setDashboardSheet(spread);
  6. sheetsInitialized[0] = true;
  7. spread.resumePaint();</font>
复制代码
使用“ sheetsInitialized”数组来确定是否需要在工作表上首次设置图表。该工作簿中的图表将在特定单元格的像素位置进行初始化,因此我们需要分别初始化每个工作表,然后再初始化工作表的图表。使用“ sheetsInitialized”数组,可以在ActiveSheetChanged事件中调用用于设置这些图表的函数:
  1. <font size="4">spread.bind(GC.Spread.Sheets.Events.ActiveSheetChanged, function(sender, args) {
  2.     switch (args.newSheet.name()) {
  3.         case "Banking":
  4.             (!sheetsInitialized[1]) && setBankingChartLocations(bankingSheet);
  5.             sheetsInitialized[1] = true;
  6.             break;
  7.         case "Expenses":
  8.             (!sheetsInitialized[2]) && setExpensesChartLocations(expensesSheet);
  9.             sheetsInitialized[2] = true;
  10.             break;
  11.         case "SalesTransactions":
  12.             (!sheetsInitialized[3]) && setSalesChartLocations(salesTransactionsSheet);
  13.             sheetsInitialized[3] = true;
  14.             break;
  15.     }
  16. });</font>
复制代码
隐藏范围模板表并设置工作簿的滚动条设置:
  1. <font size="4">spread.getSheet(4).visible(false);
  2. spread.getSheet(5).visible(false);
  3. spread.options.scrollbarMaxAlign = true;</font>
复制代码

初始化Sheet

该工作簿中的大多数工作表都具有相似的结构:1个或多个图表,一个范围模板和一个数据绑定表:
image.png646273193.png
在使用范围模板或设置图表之前,我们需要在表格中设置数据。在本示例中,我整理了一些样本数据,这些样本数据包含在3个不同的JS文件中,这些文件已在本文的前面加载。从每个文件中,我们可以为tableColumns 创建一个数组来初始化表,以及格式化表中的数据:
  1. <font size="4">function setBankingSheet(spread) {
  2.     var sheet = spread.getSheet(1);
  3.     // 冻结行头
  4.     sheet.frozenRowCount(16);
  5.     // 设置数据从checkingRegisterData.js
  6.     var tableColumns = [],
  7.         names = ['Date', 'Payee', 'Memo', 'Payment', 'Deposit', 'Balance', 'Type', 'Account', 'Added in Banking'],
  8.         labels = ['Date', 'Payee', 'Memo', 'Payment', 'Deposit', 'Balance', 'Type', 'Account', ' Added in Banking'];
  9.     var table = sheet.tables.add('checkingRegisterTable', 15, 0, checkingRegisterData.data.length, 8, GC.Spread.Sheets.Tables.TableThemes.medium21);
  10.     table.autoGenerateColumns(false);
  11.     names.forEach(function (name, index) {
  12.         var tableColumn = new GC.Spread.Sheets.Tables.TableColumn();
  13.         tableColumn.name(labels[index]);
  14.         tableColumn.dataField(name);
  15.         tableColumns.push(tableColumn);
  16.     });
  17.     table.bind(tableColumns, 'data', checkingRegisterData);

  18.     // 将string转换为number
  19.     for (var r = 16; r < 16 + checkingRegisterData.data.length; r++) {
  20.         sheet.setValue(r, 0, new Date(sheet.getValue(r, 0)));
  21.         (sheet.getValue(r, 3) != "") && sheet.setValue(r, 3, parseFloat(sheet.getText(r, 3).replace(/,/g,'')));
  22.         (sheet.getValue(r, 4) != "") && sheet.setValue(r, 4, parseFloat(sheet.getText(r, 4).replace(/,/g,'')));
  23.         (sheet.getValue(r, 5) != "") && sheet.setValue(r, 5, parseFloat(sheet.getText(r, 5).replace(/,/g,'')));
  24.     }
  25.     // 格式化
  26.     sheet.getRange(16, 3, checkingRegisterData.data.length, 3).formatter('_($* #,##0.00_);_($* (#,##0.00);_($* "-"??_);_(@_)');
  27. }</font>
复制代码

图表数据排序
为了更轻松地创建图表,我们可以使用公式对数据进行排序,并且仅使用值,而无需在图表中设置格式:
  1. <font size="4">sheet.setText(0, 9, "Date");
  2. sheet.setText(0, 10, "Date String");
  3. sheet.setText(0, 11, "Total");
  4. // 排序日期并按毫秒获取所有唯一值
  5. sheet.setFormula(1, 9, "SORT(UNIQUE(checkingRegisterTable[[#Data],[Date]]))");
  6. sheet.setFormula(1, 11, "SUMIF(checkingRegisterTable[[#Data],[Date]],$J2,checkingRegisterTable[[#Data],[Balance]]");
  7. startRange = new GC.Spread.Sheets.Range(1, 11, 1, 1);
  8. wholeRange = new GC.Spread.Sheets.Range(1, 11, 25, 1);
  9. sheet.fillAuto(startRange, wholeRange, {
  10.     fillType: GC.Spread.Sheets.Fill.FillType.auto,
  11.     series: GC.Spread.Sheets.Fill.FillSeries.column,
  12.     fillDirection:GC.Spread.Sheets.Fill.FillDirection.down
  13. });

  14. // 创建一个单独的列,以将那些唯一的排序毫秒值格式化为字符串
  15. for (var r = 1; r < 26; r++) {
  16.     sheet.setValue(r, 10, formatDateString(sheet.getValue(r, 9)));
  17. }

  18. sheet.setText(0, 13, "Type");
  19. sheet.setText(0, 14, "Payment");
  20. sheet.setFormula(1, 13, "SORT(UNIQUE(checkingRegisterTable[[#Data],[Type]]))");
  21. sheet.setFormula(1, 14, "SUMIF(checkingRegisterTable[[#Data],[Type]],$N2,checkingRegisterTable[[#Data],[Payment]])");
  22. var startRange = new GC.Spread.Sheets.Range(1, 14, 1, 1);
  23. var wholeRange = new GC.Spread.Sheets.Range(1, 14, 10, 1);
  24. sheet.fillAuto(startRange, wholeRange, {
  25.     fillType: GC.Spread.Sheets.Fill.FillType.auto,
  26.     series: GC.Spread.Sheets.Fill.FillSeries.column,
  27.     fillDirection:GC.Spread.Sheets.Fill.FillDirection.down
  28. });</font>
复制代码

创建范围模板
用在CheckingTemplate工作表中定义的范围的模板工作表,我们可以创建范围模板单元格类型并将其设置在工作表中:
  1. <font size="4">// Create range template
  2. var templateSheet = spread.getSheetFromName("CheckingTemplate");
  3. var cellType = new GC.Spread.Sheets.CellTypes.RangeTemplate(templateSheet);
  4. sheet.setCellType(0, 0, cellType, GC.Spread.Sheets.SheetArea.viewport);
  5. // Bind data for the range template
  6. var balanceInfo = {
  7.     CurrentBalance: sheet.getValue(16, 5)
  8. };
  9. // The value for the cell is used as the data source for the range template
  10. sheet.setValue(0, 0, balanceInfo);</font>
复制代码

范围模板将使用使用单元格类型的单元格的值,在这种情况下,该单元格将是只有一个属性的对象:CurrentBalance。模板表中仅定义了一个数据源模板,并在其中一个单元格中设置了CurrentBalance属性。
image.png760717773.png

创建图表
获得排序的数据后,我们可以根据该数据创建图表。这些图表仅在工作表中的位置0、0处初始化,默认大小为(100 px x 100 px)。我们之前绑定的activeSheetChanged事件将与自定义函数一起使用,以在初始加载工作表后更改每个图表的大小和位置:
  1. <font size="4">// 创建图表
  2. var lineChart = sheet.charts.add('line', GC.Spread.Sheets.Charts.ChartType.line, 0, 0, 100, 100, "K1:L26");
  3. var lineTitle = lineChart.title();
  4. lineTitle.text = "Balance Over Time";
  5. lineChart.title(lineTitle);
  6. var lineLegend = lineChart.legend();
  7. lineLegend.visible = false;
  8. lineChart.legend(lineLegend);
  9. lineChart.ignoreHidden(false);
  10. lineChart.useAnimation(true);

  11. var pieChart = sheet.charts.add('pie', GC.Spread.Sheets.Charts.ChartType.pie, 0, 100, 100, 100, "N1:O11");
  12. var pieTitle = pieChart.title();
  13. pieTitle.text = "Payments by Type";
  14. pieChart.title(pieTitle);
  15. var pieLegend = pieChart.legend();
  16. pieLegend.position = GC.Spread.Sheets.Charts.LegendPosition.right;
  17. pieChart.legend(pieLegend);
  18. pieChart.ignoreHidden(false);
  19. pieChart.useAnimation(true);
  20. Once the sheet is navigated to and set as the active sheet, the ActiveSheetChanged event calls the function to set the size and position manually:

  21. function setBankingChartLocations(sheet) {
  22.     var lineChart = sheet.charts.all()[0];
  23.     var lineStartCell = sheet.getCellRect(5, 0);
  24.     var lineEndCell = sheet.getCellRect(15, 5);
  25.     lineChart.x(lineStartCell.x);
  26.     lineChart.y(lineStartCell.y);
  27.     lineChart.width(lineEndCell.x - lineStartCell.x);
  28.     lineChart.height(lineEndCell.y - lineStartCell.y);

  29.     var pieChart = sheet.charts.all()[1];
  30.     var pieStartCell = sheet.getCellRect(0, 5);
  31.     var pieEndCell = sheet.getCellRect(15, 8);
  32.     pieChart.x(pieStartCell.x);
  33.     pieChart.y(pieStartCell.y);
  34.     pieChart.width(pieEndCell.x - pieStartCell.x);
  35.     pieChart.height(pieEndCell.y - pieStartCell.y);   
  36. }</font>
复制代码
其他工作表遵循相同的逻辑来设置表格,范围模板和图表。
image.png680503844.png

以上就是创建自己的财务应用程序的全部步骤,SpreadJS还有更多的功能等待您来发现!



SJS Financial Application.rar

1.76 MB, 下载次数: 81

组件化表格编辑器(预览版)试用进行中,点击了解详情!
请点击评分,对我的服务做出评价!5分为非常满意!

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部