excel通过js导入到页面_基于Excel和Java自动化工作流程:发票生成器示例
對于銷售人員,使用Excel創(chuàng)建發(fā)票是很常見的。但是該過程通常涉及許多容易出錯的手動操作,例如輸入數(shù)據(jù),復制/粘貼等。如何實現(xiàn)一個可以將數(shù)據(jù)從數(shù)據(jù)庫自動填充到發(fā)票Excel模板中,而無需再辛苦手動輸入,從繁重的手動錄入中解脫出來,并且避免認為錯誤這是每個人迫切的需求。蟲蟲一直奉行理念:真正的自動化是解決用戶痛點問題,把繁重人工勞動釋放出來。本文我們就介紹一個老外的利用Java編寫自動化程序實現(xiàn)自動化發(fā)票生成器的案例,案例中創(chuàng)建了一個Web應用程序Invoice Builder,并利用Excel模版文件,Java和Keikai將這種手動發(fā)票錄入過程轉換為集成的自動化過程。
總體架構
體系圖
下圖顯示了發(fā)票生成器應用程序的體系圖:
首先,導入一個源Excel文件,其中包含2個空表,客戶表和產品表。業(yè)務員將從這兩個表中選擇客戶和產品。
接著,根據(jù)數(shù)據(jù)庫查詢,將客戶和產品數(shù)據(jù)填充到相應的表中。
最后,導入2個發(fā)票模板;它們是業(yè)務員在Excel中創(chuàng)建的。這些模板將在以后使用。
工作流程:選擇客戶和產品后,應用將通過將客戶和產品數(shù)據(jù)與所選發(fā)票模板結合在一起來創(chuàng)建發(fā)票。
應用的動圖示例如下:
MVC模式
Keikai也支持MVC模式,在本應用MVC模式,具體如下:
視圖:用ZUL編寫的XML文件。ZK將zul文件轉換為UI組件并在瀏覽器中呈現(xiàn)。
控制器:擴展ZK的Java類,SelectorComposer用于監(jiān)聽View觸發(fā)的事件并控制ZK UI組件。通過Spreadsheet和RangeAPI控制Keikai。
模型:本實例中是CustomerService,但是它也可以是任何其他的Java業(yè)務類,例如身份驗證,數(shù)據(jù)查詢等。
具體實現(xiàn)
構建界面UI
界面UI構建中在實際選擇了zul,當然也可以選擇純Java(例如Swing)來構建UI。可以使用創(chuàng)建組件new Image(),通過將組件添加到Groupbox(容器)appendChild(),并使用來注冊事件偵聽器addEventListener()。使用這些API,可以在組框內的模板列表數(shù)組上動態(tài)創(chuàng)建模板預覽圖:
@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()));...});...}由于業(yè)務人員往往習慣使用Excel模板,主程序界面采用了Keikai Spreadsheet,這樣可以繼續(xù)使用其現(xiàn)有模板。
Keikai基于ZK UI框架,該框架提供了完整的UI組件集以及XML格式的UI語言。
按照ZK的語法,使用XML標簽中的以下UI組件構建此Web應用程序的UI:
:keikai電子表格。
:水平布置其子組件,垂直布置組件。
:帶有邊框和標題的組件分組。
每個標簽都支持一些屬性,例如:
src:指定要導入到Keikai的Excel文件路徑。
maxVisibleRows:控制keikai在瀏覽器中渲染工作表時的最大可見行數(shù)。
控制器
要為頁面指定控制器,只需在apply屬性處指定了全限定的類名:
...然后,該控制器可以控制其子組件。我通常在頁面的根組件上指定一個控制器。
自動填充客戶
現(xiàn)在可以顯示電子表格和源文件,接著需要將數(shù)據(jù)自動填充到表。
源Excel文件僅包含一個空客戶表,其表樣式如列名和標題顏色。這里的一件好事是,這個Excel文件是由我的銷售人員使用Excel創(chuàng)建的-他更清楚自己想在此表中看到的內容。
從服務類加載客戶列表,并將列表填充到表中:
private void populateCustomers() {List 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 也可以是您所提供的數(shù)據(jù)實體的任何Java類。
setValuesInRow() 用字符串數(shù)組(例如B2,C2,D2 ...)一行一行地填充多個單元格
toShiftedRange(1, 0)轉移startingCell到下一行。
用命名范圍填充數(shù)據(jù)
將數(shù)據(jù)填充到電子表格UI時,需要指定要將數(shù)據(jù)填充到的目標單元格。選擇命名范圍是因為它是一種靈活的方法。
首先,創(chuàng)建幾個指定范圍中的每個模板文件例如Name,Phone和Email客戶詳細信息。最終用戶選擇客戶和產品后,控制器將每一行提取為地圖。索引是標題,該值是對應的單元格值,例如
{Name: Debra, Phone: 338-8777, Email: debra@...}。
然后,從所選模板中克隆發(fā)票表,并將客戶詳細信息填充到相應的命名范圍中。
@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);}});}用戶權限控制
在此應用程序中,客戶數(shù)據(jù)是從數(shù)據(jù)庫中填充的,不希望用戶可以更改,只可以選擇這些記錄。因此,通過以下方式限制了它們在用戶界面上可以執(zhí)行的操作:
隱藏工具欄和上下文菜單:
通過指定使工作表標簽可見showSheetbar="true"。默認情況下,其他所有內容(如工具欄,公式欄和上下文菜單)都是不可見的。這樣,用戶就不會無意間更改了UI上顯示的內容。
啟用工作表保護并禁用添加工作表
通過以下方式啟用工作表保護: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);}工作表保護下的可編輯區(qū)域
在Excel中,可以取消選中鎖定狀態(tài)以在工作表保護下使單元格可編輯。其他單元將保持只讀狀態(tài)。使用此設置,可以在受保護的圖紙中允許一定范圍的可編輯區(qū)域。導入到Keikai后,此設置將保留,因此可以在準備源文件時從Excel端完成。
重用
在應用程序中,有2個Excel模板,想一次導入它們,然后在需要時使用它們。
Keikai Importer將Excel xlsx文件轉換為Book。可以將Book分配給Spreadsheet并將其呈現(xiàn)給瀏覽器。或者,可以直接操作Bookwith Range,而無需將其分配給Spreadsheet。最常見的用法是從模板書克隆表或復制單元格。每個需要Excel模板的人都可以從其中獲取內容,而無需再次導入模板文件。在應用程序中,將Book2個模板Excel文件的對象存儲在Map(templateWarehouse)中,以備將來使用:
private static HashMap 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。
總結
本文中我們演示了如何將現(xiàn)有的手動Excel文件的流程轉換為具有Excel文件,Java和Keikai的Web應用程序。該應用程序與后端服務集成在一起,包括數(shù)據(jù)庫和用戶權限控制。可以將相同的技術應用于涉及基于Excel的流程的任何其他方案,將手動工作流轉變?yōu)樽詣踊图傻腤eb Apps。
總結
以上是生活随笔為你收集整理的excel通过js导入到页面_基于Excel和Java自动化工作流程:发票生成器示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手机号验证_谷歌修改密码时遇到手机号验证
- 下一篇: 亲子鉴定大概花多少钱(亲子鉴定多少钱一次