西部數(shù)碼網(wǎng)站工具免費(fèi)建站平臺(tái)哪個(gè)好
由來(lái)
這是一個(gè)從開(kāi)發(fā)需求中誕生的工具,在工作中因?yàn)橛幸粋€(gè) excel 轉(zhuǎn) html 的任務(wù),又沒(méi)找到一個(gè)專(zhuān)門(mén)做這方面的工具(其他工具幾乎都是簡(jiǎn)單的轉(zhuǎn)換,無(wú)法還原 excel 樣式,而且轉(zhuǎn)換的寬高有點(diǎn)兒差距),所以干脆自己動(dòng)手寫(xiě)了一個(gè)。幾乎能夠還原 excel 樣式,且寬高幾乎一致。
用法
需要注意的是,僅支持 xlsx 格式,且默認(rèn) dpi 是 96,因?yàn)椴煌聊坏?dpi 可能不太一樣(大多數(shù)是 96),所以盡量前端傳過(guò)來(lái),前端獲取屏幕 DPI 參考:https://blog.csdn.net/jl15988/article/details/144737210
引入依賴(lài)
<dependency><groupId>com.jl15988.excel2html</groupId><artifactId>excel2html</artifactId><version>0.0.1</version>
</dependency>
使用
List<HtmlPage> htmlPages = new Excel2Html(new File(respVO.getTempPath())).setDpi(dpi).setCellHandler(new ICellHandler() {@Overridepublic void handleStyle(ParserdStyleResult parserdStyleResult, Cell cell, int rowIndex, int cellIndex) {// 去掉第一行單元格頂部邊框if (rowIndex == 4) {parserdStyleResult.cellStyle.remove("border-top");}}}).buildHtmlWithSheetIndex(4, null, 4, 46, 0, 29);
List<String> wbContent = htmlPages.stream().map(htmlPage -> htmlPage.setHasHtmlContainer(false).toHtmlString()).collect(Collectors.toList());
支持自定義單元格處理器(setCellHandler),單元格內(nèi)容格式化處理(setCellValueFormater)
還有其他構(gòu)建 html 方法
- buildHtml(Sheet sheet, Integer startRowIndex, Integer endRowIndex, Integer startColIndex, Integer endColIndex)
- buildHtmlWithSheetIndex(int sheetIndex, Integer startRowIndex, Integer endRowIndex, Integer startColIndex, Integer endColIndex)
- buildHtmlWithSheetIndex(Integer startSheetIndex, Integer endSheetIndex, Integer startRowIndex, Integer endRowIndex, Integer startColIndex, Integer endColIndex)
- buildHtml(Sheet sheet)
- buildHtmlWithSheetIndex(int sheetIndex)
- buildHtmlWithSheetIndex(Integer startSheetIndex, Integer endSheetIndex)
難點(diǎn)(均實(shí)現(xiàn))
難點(diǎn)是實(shí)現(xiàn)的時(shí)候比較難,不代表沒(méi)有實(shí)現(xiàn)。因?yàn)槭褂玫氖?apache.poi
依賴(lài)讀取 excel,該依賴(lài)仍有某些不足,成為轉(zhuǎn) html 難點(diǎn)。
- 讀取 excel 圖片。excel 中圖片有兩種,第一種是浮動(dòng)式,第二種是嵌入式,浮動(dòng)式還好說(shuō) poi 能讀取到,但是嵌入式只能自己解析 excel 內(nèi)容,然后找到對(duì)應(yīng)圖片。excel 其實(shí)是一個(gè)壓縮包,將其解壓讀取 xml 配置即可;
- 渲染圖片位置。因?yàn)楂@取到的浮動(dòng)式圖片位置為 emu 單位,且是所在單元格坐標(biāo)的信息,單位轉(zhuǎn)換和坐標(biāo)計(jì)算有所難點(diǎn);
- 列寬。poi 讀取到的列寬不準(zhǔn)確,poi 中默認(rèn)列寬寫(xiě)死了一個(gè) 8(字符寬度),這個(gè) 8 只是大概值,準(zhǔn)確值需要自己計(jì)算;而且 poi 像素值都是乘了一個(gè)寫(xiě)死的 7.001699924468994(字符像素大小),這個(gè)值也是不準(zhǔn)確的,這個(gè)值應(yīng)該是 excel 默認(rèn)字體的像素大小(一般國(guó)內(nèi)都是默認(rèn)宋體,像素大小為 8,差距也有點(diǎn)兒大),這個(gè)需要建立映射表,通過(guò)腳本將系統(tǒng)所有字體像素大小放到映射中,使用的時(shí)候再讀取;
- 富文本解析。富文本是指在同一個(gè)單元格使用不同的字體樣式。這個(gè)需要對(duì)單元格內(nèi)容單獨(dú)解析,構(gòu)造 html 樣式,這個(gè)難點(diǎn)不算太大;
- 空白字符處理。在 excel 中,連續(xù)空白字符是保留的,html 默認(rèn)只顯示一個(gè),需要單獨(dú)寫(xiě)樣式,這個(gè)比較簡(jiǎn)單;如果單元格內(nèi)容尾部含有空白字符且自動(dòng)換行,空白字符是不占用空間的(目前看是這樣),這個(gè)需要單獨(dú)判斷。