对于销售人员,使用Excel创建发票是很常见的。但是该过程通常涉及许多容易出错的手动操作,例如输入数据,复制/粘贴等。如何实现一个可以将数据从数据库自动填充到发票Excel模板中,而无需再辛苦手动输入,从繁重的手动录入中解脱出来,并且避免认为错误这是每个人迫切的需求。虫虫一直奉行理念:真正的自动化是解决用户痛点问题,把繁重人工劳动释放出来。本文我们就介绍一个老外的利用Java编写自动化程序实现自动化发票生成器的案例,案例中创建了一个Web应用程序Invoice Builder,并利用Excel模版文件,Java和Keikai将这种手动发票录入过程转换为集成的自动化过程。

总体架构

体系图

下图显示了发票生成器应用程序的体系图:

首先,导入一个源Excel文件,其中包含2个空表,客户表和产品表。业务员将从这两个表中选择客户和产品。

接着,根据数据库查询,将客户和产品数据填充到相应的表中。

最后,导入2个发票模板;它们是业务员在Excel中创建的。这些模板将在以后使用。

工作流程:选择客户和产品后,应用将通过将客户和产品数据与所选发票模板结合在一起来创建发票。

应用的动图示例如下:

MVC模式

Keikai也支持MVC模式,在本应用MVC模式,具体如下:

视图:用ZUL编写的XML文件。ZK将zul文件转换为UI组件并在浏览器中呈现。

控制器:扩展ZK的Java类,SelectorComposer用于监听View触发的事件并控制ZK UI组件。通过Spreadsheet和RangeAPI控制Keikai。

模型:本实例中是CustomerService,但是它也可以是任何其他的Java业务类,例如身份验证,数据查询等。

具体实现

构建界面UI

界面UI构建中在实际选择了zul,当然也可以选择纯Java(例如Swing)来构建UI。可以使用创建组件new Image(),通过将组件添加到Groupbox(容器)appendChild(),并使用来注册事件侦听器addEventListener()。使用这些API,可以在组框内的模板列表数组上动态创建模板预览图:

@Wireprivate Groupbox templateBox;private String[] templateFileNameList = {"invoice-template1.xlsx", "invoice-template2.xlsx"};...private void buildTemplatePreview() {...Arrays.stream(templateFileNameList).forEach(fileName -> {...Image preview = new Image(fileNameWithoutExt + "-preview.jpg");templateBox.appendChild(preview);preview.setAttribute(TEMPLATE_KEY, fileName);preview.addEventListener(org.zkoss.zk.ui.event.Events.ON_CLICK, event ->selectTemplate((Image) event.getTarget()));...});...}

由于业务人员往往习惯使用Excel模板,主程序界面采用了Keikai Spreadsheet,这样可以继续使用其现有模板。

Keikai基于ZK UI框架,该框架提供了完整的UI组件集以及XML格式的UI语言。

按照ZK的语法,使用XML标签中的以下UI组件构建此Web应用程序的UI:

<hlayout vflex="1" width="100%" apply="io.keikai.devref.usecase.invoice.InvoiceBuilderController"><spreadsheet height="100%" id="spreadsheet" hflex="8"maxVisibleRows="6" maxVisibleColumns="8"src="/WEB-INF/books/invoice-source.xlsx"showSheetbar="true"/><vlayout hflex="2" height="100%"><groupbox id="templateBox" title="Template" style="text-align: center">groupbox><button id="create" label="Create" style="float: right"/>vlayout>hlayout>

:keikai电子表格。

:水平布置其子组件,垂直布置组件。

:带有边框和标题的组件分组。

每个标签都支持一些属性,例如:

src:指定要导入到Keikai的Excel文件路径。

maxVisibleRows:控制keikai在浏览器中渲染工作表时的最大可见行数。

控制器

要为页面指定控制器,只需在apply属性处指定了全限定的类名:

<hlayout vflex="1" width="100%" apply="io.keikai.devref.usecase.invoice.InvoiceBuilderController">...hlayout>

然后,该控制器可以控制其子组件。我通常在页面的根组件上指定一个控制器。

自动填充客户

现在可以显示电子表格和源文件,接着需要将数据自动填充到表。

源Excel文件仅包含一个空客户表,其表样式如列名和标题颜色。这里的一件好事是,这个Excel文件是由我的销售人员使用Excel创建的-他更清楚自己想在此表中看到的内容。

从服务类加载客户列表,并将列表填充到表中:

private void populateCustomers() {List<String[]> customers = CustomerService.getCustomerList();Range startingCell = customerTable.toCellRange(0, 1); //the 1st column is for checkboxfor (String[] c : customers) {RangeHelper.setValuesInRow(startingCell, c);startingCell = startingCell.toShiftedRange(1, 0);}}

CustomerService 也可以是您所提供的数据实体的任何Java类。

setValuesInRow() 用字符串数组(例如B2,C2,D2 ...)一行一行地填充多个单元格

toShiftedRange(1, 0)转移startingCell到下一行。

用命名范围填充数据

将数据填充到电子表格UI时,需要指定要将数据填充到的目标单元格。选择命名范围是因为它是一种灵活的方法。

首先,创建几个指定范围中的每个模板文件例如Name,Phone和Email客户详细信息。最终用户选择客户和产品后,控制器将每一行提取为地图。索引是标题,该值是对应的单元格值,例如

{Name: Debra, Phone: 338-8777, Email: debra@...}。

然后,从所选模板中克隆发票表,并将客户详细信息填充到相应的命名范围中。

@Listen(org.zkoss.zk.ui.event.Events.ON_CLICK + "=#create")public void createInvoice() {...Book invoiceBook = Books.createBook("invoice.xlsx");for (Map customer : selectedCustomers) {Sheet invoiceSheet = Ranges.range(invoiceBook).cloneSheetFrom(customer.get("CompanyName").toString(), templates.get(getSelectedTemplateFileName()).getSheetAt(0));populateNamedRange(generateAgentData(), invoiceSheet);populateNamedRange(customer, invoiceSheet);...}...}private void populateNamedRange(Map fieldMap, Sheet sheet) {List namedRanges = Ranges.getNames(sheet);fieldMap.forEach((name, value) -> {if (namedRanges.contains(name)) {Range range = Ranges.rangeByName(sheet, name);range.setCellValue(value);}});}

用户权限控制

在此应用程序中,客户数据是从数据库中填充的,不希望用户可以更改,只可以选择这些记录。因此,通过以下方式限制了它们在用户界面上可以执行的操作:

隐藏工具栏和上下文菜单

通过指定使工作表标签可见showSheetbar="true"。默认情况下,其他所有内容(如工具栏,公式栏和上下文菜单)都是不可见的。这样,用户就不会无意间更改了UI上显示的内容。

<spreadsheet ... showSheetbar="true"/>

启用工作表保护并禁用添加工作表

通过以下方式启用工作表保护:protectSheet()将所有工作表设为只读,并禁止用户通过添加工作表disableUserAction()。

private void limitAccess() {for (int i = 0; i < spreadsheet.getBook().getNumberOfSheets(); i++) {Ranges.range(spreadsheet.getBook().getSheetAt(i)).protectSheet(SELECTION_FILTER);}spreadsheet.disableUserAction(AuxAction.ADD_SHEET, true);}

工作表保护下的可编辑区域

在Excel中,可以取消选中锁定状态以在工作表保护下使单元格可编辑。其他单元将保持只读状态。使用此设置,可以在受保护的图纸中允许一定范围的可编辑区域。导入到Keikai后,此设置将保留,因此可以在准备源文件时从Excel端完成。

重用

在应用程序中,有2个Excel模板,想一次导入它们,然后在需要时使用它们。

Keikai Importer将Excel xlsx文件转换为Book。可以将Book分配给Spreadsheet并将其呈现给浏览器。或者,可以直接操作Bookwith Range,而无需将其分配给Spreadsheet。最常见的用法是从模板书克隆表或复制单元格。每个需要Excel模板的人都可以从其中获取内容,而无需再次导入模板文件。在应用程序中,将Book2个模板Excel文件的对象存储在Map(templateWarehouse)中,以备将来使用:

private static HashMap<String, Book> templateWarehouse = new HashMap<>();private static Importer importer = Importers.getImporter();...private void importInvoiceTemplate() {...for (String fileName : templateFileNameList) {if (!templateWarehouse.containsKey(fileName)) { //avoid importing againtemplateWarehouse.put(fileName, importer.imports(new File(WebApps.getCurrent().getRealPath(BookUtil.DEFAULT_BOOK_FOLDER), fileName), fileName));}}...}

importer.imports(new File(...)) 返回一个Book。

总结

本文中我们演示了如何将现有的手动Excel文件的流程转换为具有Excel文件,Java和Keikai的Web应用程序。该应用程序与后端服务集成在一起,包括数据库和用户权限控制。可以将相同的技术应用于涉及基于Excel的流程的任何其他方案,将手动工作流转变为自动化和集成的Web Apps。

dump java崩溃自动 不生成_基于Excel和Java自动化工作流程:发票生成器示例相关推荐

  1. dump java崩溃自动 不生成_一个宏命令,就可以程序崩溃时生成dump文件

    在主程序初始化时加入 DeclareDumpFile(); 创建头文件DumpFile.h, 将下列代码放进文件中 #pragma once #include #include < Dbghel ...

  2. excel通过js导入到页面_基于Excel和Java自动化工作流程:发票生成器示例

    对于销售人员,使用Excel创建发票是很常见的.但是该过程通常涉及许多容易出错的手动操作,例如输入数据,复制/粘贴等.如何实现一个可以将数据从数据库自动填充到发票Excel模板中,而无需再辛苦手动输入 ...

  3. java 打印 发票_基于Excel和Java自动化:发票生成器

    对于销售人员,使用Excel创建发票是很常见的.但是该过程通常涉及许多容易出错的手动操作,例如输入数据,复制/粘贴等.如何实现一个可以将数据从数据库自动填充到发票Excel模板中,而无需再辛苦手动输入 ...

  4. dump java崩溃自动 不生成_GitHub 自动生成 .gitignore,只想写代码不重要的事情别烦我...

    代码上传 GitHub 为何半途而废?因为只想写代码,readme 不想写,gitignore 不想管. readme 不想写已经有救了,我们发现了 readme 自动生成工具 你已经是个成熟的 Gi ...

  5. Java线上兼职家教_基于ssh/bs/java/asp.net/php/web的兼职家教网站

    当今社会己进入信息社会时代.信息己经受到社会的广泛关注,被看作社会和科学技术发展的三大支柱(材料.能源.信息).信息是管理的基础,是进行决策的的基本依据.在一个组织里,信息己作为人力.物力.财力之外的 ...

  6. java鲜花购物平台结论_基于ssh/bs/java/asp.net/php/web/安卓的鲜花购物网站

    Internet推动了全球性的信息化革命,为全球范围的信息处理与交流提供了操作平台,internet的产生大大缩短了信息传递的时间.网上商务逐渐走入到千家万户,为了大家更方便的购买鲜花,我们开发了这套 ...

  7. java 试卷自动生成_基于JAVA的试题自动生成系统 - WEB源码|JSP源码/Java|源代码 - 源码中国...

    压缩包 : 试卷自动生成系统.rar 列表 试卷自动生成系统/.classpath 试卷自动生成系统/.project 试卷自动生成系统/bin/Db/Sql.class 试卷自动生成系统/bin/f ...

  8. 用java做小学数学系统_基于jsp的小学数学试卷生成-JavaEE实现小学数学试卷生成 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的小学数学试卷生成, 该项目可用各类java课程设计大作业中, 小学数学试卷生成的系统架构分为前后台两部分, 最终实 ...

  9. java象棋游戏用户特点_基于Java Swing的《中国象棋》游戏的设计与实现

    60 开发经验 3基金项目: 江西省自然科学基金资助项目(编号: 0411046); 江西省高性能计算技术重点实验室资助基金项目(No. JXHC20052003) ). 基于 Java Swing ...

最新文章

  1. 爬虫之手机APP抓包教程-亲测HTTP和HTTPS均可实现
  2. 【星辰傀儡线·命运环·卷二 尘埃】 5 困惑
  3. SQL Case When Then 条件判断
  4. 《团队-团队编程项目作业名称-团队信息》
  5. 生产订单总目标成本为0
  6. SAPGUI系统登录页面配置的SAProuter有什么用 1
  7. eslint规范_规范统一前端代码风格
  8. workbeach约束简称_AnsysWorkbenchFluidFlow(FLUENT)经典问题.docx
  9. 一名IT经理是如何把项目带崩的。。。
  10. MySQL的索引学习
  11. docker 虚拟化_如果没有虚拟化,Docker将提供什么?
  12. HTML label控件
  13. python_10 迭代器和生成器
  14. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(一)
  15. CC2540蓝牙开发二 OSAL系统
  16. 方差分析的SPSS实现
  17. Linux配置阿里yum源
  18. div内li标签间距_css怎样让li间距增大?
  19. 【pytorch】|tensor grad
  20. 小型企业、初创企业海外众筹指南

热门文章

  1. 快速上手Ubuntu搭建Python编程环境
  2. Hadoop2.6集群动态添加和删除数据节点
  3. tablemodel dapter区别
  4. 转载:https://blog.csdn.net/dcrmg/article/details/52939318
  5. 功放关键规格参数检查
  6. 五、畸变矫正—让世界不在扭曲
  7. ubuntu上搭建php,ubuntu10.04上搭建php网站运行环境
  8. 美育在计算机教育中应用,在现代教育技术中绽放数学美育之花
  9. ASP.NET Web Game 架构设计1--服务器基本结构
  10. PHP调用新浪API 生成短链接