公司之前產(chǎn)品采用java純后端dynamicsReport報(bào)表工具爽待,這里簡(jiǎn)單介紹下腐魂,它的charts是基于jfeecharts咧最,通過(guò)xml設(shè)置報(bào)表模板捂人,美觀度相對(duì)較差,有點(diǎn)支持生成pdf矢沿、word滥搭、html格式輸出,我個(gè)人覺(jué)得也就pdf看的過(guò)去捣鲸,Html生成后體積太大瑟匆,word有強(qiáng)烈的拼接感,而且html和word二次編輯都很不友好摄狱,以至于我們公司一個(gè)報(bào)表需要兩種開(kāi)發(fā)模式(前端展現(xiàn)和后端導(dǎo)出)脓诡。
最近領(lǐng)導(dǎo)發(fā)現(xiàn)來(lái)源的ureport2无午,感覺(jué)感覺(jué)一亮媒役,下發(fā)最高文件“盤它”。經(jīng)過(guò)2天的艱苦奮戰(zhàn)總結(jié)去下特點(diǎn):
1宪迟、設(shè)計(jì)器不支持組件拖拉拽
2酣衷、設(shè)計(jì)器采用excel表格形式,對(duì)于復(fù)雜報(bào)表次泽,開(kāi)始設(shè)計(jì)之前需要經(jīng)過(guò)精細(xì)的單元格寬高的預(yù)算和設(shè)計(jì)穿仪。
3、不支持復(fù)合圖表(例如柱狀圖+曲線圖復(fù)合)
4意荤、不支持后端直接生成Pdf或者word格式的報(bào)表啊片,因?yàn)閏hart需要瀏覽器渲染后生成圖片回傳到報(bào)表服務(wù)器。
5玖像、數(shù)據(jù)源配置不支持選擇數(shù)據(jù)庫(kù)類型紫谷,需要手動(dòng)填入驅(qū)動(dòng)類型以及Url。
有問(wèn)題自然需要解決,由于uteport是開(kāi)源項(xiàng)目笤昨,所以只要肯投入一切都不是問(wèn)題W媲!瞒窒!
第一個(gè)問(wèn)題可以忽略不計(jì)...
第二個(gè)問(wèn)題捺僻,這個(gè)硬傷對(duì)于設(shè)計(jì)報(bào)表的人來(lái)說(shuō)太痛苦了,而且無(wú)法解決的問(wèn)題崇裁,忍著吧匕坯!
第三個(gè)問(wèn)題,ureport圖表繪制采用chart. js拔稳,需要react前段+java后端協(xié)調(diào)二次開(kāi)發(fā)醒颖,慢慢來(lái),領(lǐng)導(dǎo)還想換成echarts呢壳炎!
先說(shuō)第五個(gè)問(wèn)題泞歉,由于ureport提供三種數(shù)據(jù)源,通過(guò)第二種spring bean和第三種內(nèi)置數(shù)據(jù)源的方式可以搞定匿辩。
第四個(gè)問(wèn)題也就是本章要講的內(nèi)容腰耙,ureport想要導(dǎo)出帶有chart的報(bào)表,首先需要瀏覽器渲染铲球,但是作為后端程序總不能搞幽靈事件自動(dòng)打開(kāi)瀏覽器渲染再關(guān)閉吧挺庞,會(huì)嚇到客戶的。
瀏覽器無(wú)頭模式完美解決這個(gè)問(wèn)題稼病。當(dāng)然也有弊端:需要安裝瀏覽器选侨。
就目前了解有三種方式可以實(shí)現(xiàn):
chrome headless+selenium、Firefox headless+selenium和PhantomJS然走,
應(yīng)該還有一個(gè)puppteer這么個(gè)東西援制,沒(méi)有研究。
public static void generateReport(String fileName) {
? ? ? ? WebDriver webDriver = null;
? ? ? ? try {
? ? ? ? ? ? String url = "http://127.0.0.1:8081/ureport/preview?_u="+fileName;
? ? ? ? ? ? String osName = System.getProperties().getProperty("os.name");
? ? ? ? ? ? if (osName.contains("Windows")) {
? ? ? ? ? ? ? ? System.setProperty("webdriver.chrome.driver", "D:\\driver\\chromedriver.exe");
? ? ? ? ? ? }
? ? ? ? ? ? ChromeOptions chromeOptions = new ChromeOptions();
? ? ? ? ? ? // 設(shè)置 chrome 的無(wú)頭模式
? ? ? ? ? ? chromeOptions.setHeadless(Boolean.TRUE);
? ? ? ? ? ? // linux 下讓Chrome在root權(quán)限下跑
? ? ? ? ? ? chromeOptions.addArguments("--no-sandbox");
? ? ? ? ? ? // Chrome正在受到自動(dòng)軟件的控制 不顯示提示語(yǔ)
? ? ? ? ? ? chromeOptions.addArguments("disable-infobars");
? ? ? ? ? ? Map<String, Object> chromePrefs = new HashMap<String, Object>();
? ? ? ? ? ? chromePrefs.put("download.default_directory", "/opt/ureportfiles");
? ? ? ? ? ? chromeOptions.setExperimentalOption("prefs", chromePrefs);
? ? ? ? ? ? // 啟動(dòng)一個(gè) chrome 實(shí)例
? ? ? ? ? ? webDriver = new ChromeDriver(chromeOptions);
? ? ? ? ? ? webDriver.get(url);
? ? ? ? ? ? Thread.sleep(5000);
? ? ? ? ? ? url = "http://127.0.0.1:8081/ureport/pdf?_u=file:test.ureport.xml";
? ? ? ? ? ? webDriver.get(url);
? ? ? ? ? ? Thread.sleep(10000);
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? e.printStackTrace();
? ? ? ? } finally {
? ? ? ? ? ? if (webDriver != null) {
? ? ? ? ? ? ? ? //退出 chrome
? ? ? ? ? ? ? ? webDriver.quit();
? ? ? ? ? ? }
? ? ? ? }
<dependency>
? ? ? ? ? ? <groupId>org.seleniumhq.selenium</groupId>
? ? ? ? ? ? <artifactId>selenium-java</artifactId>
? ? ? ? </dependency>
目前存在的問(wèn)題就是通過(guò)headless渲染什么時(shí)候完成芍瑞,這個(gè)沒(méi)有搞定晨仑,通過(guò)設(shè)置線程等待時(shí)間曲線救國(guó)。