西部數(shù)碼網(wǎng)站工具免費(fèi)建站平臺哪個好
由來
這是一個從開發(fā)需求中誕生的工具,在工作中因?yàn)橛幸粋€ excel 轉(zhuǎn) html 的任務(wù),又沒找到一個專門做這方面的工具(其他工具幾乎都是簡單的轉(zhuǎn)換,無法還原 excel 樣式,而且轉(zhuǎn)換的寬高有點(diǎn)兒差距),所以干脆自己動手寫了一個。幾乎能夠還原 excel 樣式,且寬高幾乎一致。
用法
需要注意的是,僅支持 xlsx 格式,且默認(rèn) dpi 是 96,因?yàn)椴煌聊坏?dpi 可能不太一樣(大多數(shù)是 96),所以盡量前端傳過來,前端獲取屏幕 DPI 參考:https://blog.csdn.net/jl15988/article/details/144737210
引入依賴
<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í)現(xiàn)。因?yàn)槭褂玫氖?apache.poi
依賴讀取 excel,該依賴仍有某些不足,成為轉(zhuǎn) html 難點(diǎn)。
- 讀取 excel 圖片。excel 中圖片有兩種,第一種是浮動式,第二種是嵌入式,浮動式還好說 poi 能讀取到,但是嵌入式只能自己解析 excel 內(nèi)容,然后找到對應(yīng)圖片。excel 其實(shí)是一個壓縮包,將其解壓讀取 xml 配置即可;
- 渲染圖片位置。因?yàn)楂@取到的浮動式圖片位置為 emu 單位,且是所在單元格坐標(biāo)的信息,單位轉(zhuǎn)換和坐標(biāo)計(jì)算有所難點(diǎn);
- 列寬。poi 讀取到的列寬不準(zhǔn)確,poi 中默認(rèn)列寬寫死了一個 8(字符寬度),這個 8 只是大概值,準(zhǔn)確值需要自己計(jì)算;而且 poi 像素值都是乘了一個寫死的 7.001699924468994(字符像素大小),這個值也是不準(zhǔn)確的,這個值應(yīng)該是 excel 默認(rèn)字體的像素大小(一般國內(nèi)都是默認(rèn)宋體,像素大小為 8,差距也有點(diǎn)兒大),這個需要建立映射表,通過腳本將系統(tǒng)所有字體像素大小放到映射中,使用的時候再讀取;
- 富文本解析。富文本是指在同一個單元格使用不同的字體樣式。這個需要對單元格內(nèi)容單獨(dú)解析,構(gòu)造 html 樣式,這個難點(diǎn)不算太大;
- 空白字符處理。在 excel 中,連續(xù)空白字符是保留的,html 默認(rèn)只顯示一個,需要單獨(dú)寫樣式,這個比較簡單;如果單元格內(nèi)容尾部含有空白字符且自動換行,空白字符是不占用空間的(目前看是這樣),這個需要單獨(dú)判斷。