日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java導(dǎo)出Execl疑難點(diǎn)處理的實(shí)現(xiàn)

瀏覽:20日期:2022-09-02 16:47:50

一.背景

最近業(yè)務(wù)需求需要導(dǎo)出Execl,最終做出的效果如下,中間牽扯到大量的數(shù)據(jù)計(jì)算。

二.疑難問(wèn)題分析

Java導(dǎo)出Execl疑難點(diǎn)處理的實(shí)現(xiàn)Java導(dǎo)出Execl疑難點(diǎn)處理的實(shí)現(xiàn)

問(wèn)題1:跨單元格處理及邊框設(shè)置問(wèn)題2:自定義背景顏色添加問(wèn)題3:單元格中部分文字設(shè)置顏色問(wèn)題4:高度自適應(yīng)處理

三.問(wèn)題解決

在處理整個(gè)Excel導(dǎo)出中總結(jié)了很多。

整個(gè)開(kāi)發(fā)過(guò)程使用的是Apache POI

pom.xml

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.8</version></dependency>

3.1 HSSFworkbook,XSSFworkbook選哪個(gè)

最開(kāi)始我沿用的是之前開(kāi)發(fā)用的,HSSFworkbook最后發(fā)現(xiàn),HSSFworkbook在處理,自定義單元格背景顏色比較復(fù)雜,最后換成了XSSFworkbook。

HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,擴(kuò)展名是.xls;

XSSFWorkbook:是操作Excel2007后的版本,擴(kuò)展名是.xlsx;

所以在這里我推薦使用XSSFWorkbook

3.2跨單元格及邊框設(shè)置

//創(chuàng)建第一行,索引是從0開(kāi)始的row = sheet.createRow(0);//創(chuàng)建第一個(gè)單元格XSSFCell cell0 = row.createCell(0);//設(shè)置單元格文字cell0.setCellValue('姓名');//設(shè)置單元格樣式cell0.setCellStyle(cellStyleHead);//跨單元格設(shè)置//參數(shù)為 firstRow, lastRow, firstCol, lastColCellRangeAddress cellRange1 = new CellRangeAddress(0, 1, 0, 0);sheet.addMergedRegion(cellRange1);//注意如果直接在下面寫(xiě)設(shè)置邊框的樣式,可能會(huì)出現(xiàn)邊框覆蓋不全的情況,可能是樣式覆蓋問(wèn)題//所以應(yīng)該在數(shù)據(jù)渲染完成之后,在代碼的最后寫(xiě)跨單元格邊框設(shè)置,這是非常重要的

調(diào)用設(shè)置邊框

//在數(shù)據(jù)渲染完成,調(diào)用封裝的邊框設(shè)置方法setRegionStyle(wb, sheet, cellRange1);

設(shè)置邊框方法

/** * 合并單元格之后設(shè)置邊框 * * @param wb XSSFWorkbook對(duì)象 * @param sheet sheet * @param region region */ static void setRegionStyle(XSSFWorkbook wb, XSSFSheet sheet, CellRangeAddress region) { RegionUtil.setBorderTop(1, region, sheet, wb); RegionUtil.setBorderBottom(1, region, sheet, wb); RegionUtil.setBorderLeft(1, region, sheet, wb); RegionUtil.setBorderRight(1, region, sheet, wb); }

3.3自定義背景顏色設(shè)置

因?yàn)閜oi自帶的顏色索引可能不滿(mǎn)足我們開(kāi)發(fā)的需求,需要自定義樣色

//創(chuàng)建單元格樣式 XSSFCellStyle cellStyleContent = wb.createCellStyle();//創(chuàng)建背景顏色 226, 239, 218 對(duì)應(yīng)的就是RGB顏色 紅綠藍(lán) cellStyleContent.setFillForegroundColor(new XSSFColor(new java.awt.Color(226, 239, 218)));//填充m cellStyleContent.setFillPattern(CellStyle.SOLID_FOREGROUND);

3.4設(shè)置單元格中部分字體顏色

XSSFRichTextString ts = new XSSFRichTextString('123456rn789'); XSSFFont font2 = wb.createFont(); //字體高度f(wàn)ont2.setFontHeightInPoints((short) 10);// 字體font2.setFontName('宋體');//字體顏色font2.setColor(HSSFColor.GREEN.index);//那些字體要設(shè)置顏色,//int startIndex 開(kāi)始索引//int endIndex 結(jié)束索引// Font font 字體ts.applyFont(5, ts.length(), font2);

3.5高度自適應(yīng)

封裝的工具類(lèi)如下,需要在數(shù)據(jù)渲染完的每行,調(diào)用如下工具類(lèi)

//高度自適應(yīng)//XSSFRow row;ExcelUtil.calcAndSetRowHeigt(row);

import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.util.CellRangeAddress;import org.apache.poi.xssf.usermodel.*;import java.util.HashMap;import java.util.Map;/** * @author Created by niugang on 2020/3/13/13:34 */public class ExcelUtil { private ExcelUtil() { throw new IllegalStateException('Utility class'); } /** * 根據(jù)行內(nèi)容重新計(jì)算行高 * * @param sourceRow sourceRow */ public static void calcAndSetRowHeigt(XSSFRow sourceRow) { for (int cellIndex = sourceRow.getFirstCellNum(); cellIndex <= sourceRow.getPhysicalNumberOfCells(); cellIndex++) { //行高 double maxHeight = sourceRow.getHeight(); XSSFCell sourceCell = sourceRow.getCell(cellIndex); //單元格的內(nèi)容 String cellContent = getCellContentAsString(sourceCell); if (null == cellContent || ''.equals(cellContent)) {continue; } //單元格的寬高及單元格信息 Map<String, Object> cellInfoMap = getCellInfo(sourceCell); Integer cellWidth = (Integer) cellInfoMap.get('width'); Integer cellHeight = (Integer) cellInfoMap.get('height'); if (cellHeight > maxHeight) {maxHeight = cellHeight; } XSSFCellStyle cellStyle = sourceCell.getCellStyle(); //sourceRow.getSheet().getWorkbook() XSSFFont font = cellStyle.getFont(); //字體的高度 short fontHeight = font.getFontHeight(); //cell內(nèi)容字符串總寬度 double cellContentWidth = cellContent.getBytes().length * 2 * 256; //字符串需要的行數(shù) 不做四舍五入之類(lèi)的操作 double stringNeedsRows = cellContentWidth / cellWidth; //小于一行補(bǔ)足一行 if (stringNeedsRows < 1.0) {stringNeedsRows = 1.0; } //需要的高度 (Math.floor(stringNeedsRows) - 1) * 40 為兩行之間空白高度 double stringNeedsHeight = (double) fontHeight * stringNeedsRows; //需要重設(shè)行高 if (stringNeedsHeight > maxHeight) {maxHeight = stringNeedsHeight;//超過(guò)原行高三倍 則為5倍 實(shí)際應(yīng)用中可做參數(shù)配置if (maxHeight / cellHeight > 5) { maxHeight = 5 * cellHeight;}//最后取天花板防止高度不夠maxHeight = Math.ceil(maxHeight);//重新設(shè)置行高 同時(shí)處理多行合并單元格的情況Boolean isPartOfRowsRegion = (Boolean) cellInfoMap.get('isPartOfRowsRegion');if (isPartOfRowsRegion.equals(Boolean.TRUE)) { Integer firstRow = (Integer) cellInfoMap.get('firstRow'); Integer lastRow = (Integer) cellInfoMap.get('lastRow'); //平均每行需要增加的行高 double addHeight = (maxHeight - cellHeight) / (lastRow - firstRow + 1); for (int i = firstRow; i <= lastRow; i++) { double rowsRegionHeight = sourceRow.getSheet().getRow(i).getHeight() + addHeight; rowsRegionHeight=rowsRegionHeight+10; sourceRow.getSheet().getRow(i).setHeight((short) rowsRegionHeight); }} else { maxHeight=maxHeight+10; sourceRow.setHeight((short) maxHeight);} } } } /** * 解析一個(gè)單元格得到數(shù)據(jù) * * @param cell cell * @return String */ private static String getCellContentAsString(XSSFCell cell) { final String strZero ='.0'; if (null == cell) { return ''; } String result = ''; switch (cell.getCellType()) { case Cell.CELL_TYPE_NUMERIC:String s = String.valueOf(cell.getNumericCellValue());if (s != null) { if (s.endsWith(strZero)) { s = s.substring(0, s.length() - 2); }}result = s;break; case Cell.CELL_TYPE_STRING:result = String.valueOf(cell.getStringCellValue()).trim();break; case Cell.CELL_TYPE_BLANK:break; case Cell.CELL_TYPE_BOOLEAN:result = String.valueOf(cell.getBooleanCellValue());break; case Cell.CELL_TYPE_ERROR:break; default:break; } return result; } /** * 獲取單元格及合并單元格的寬度 * * @param cell cell * @return Map<String , Object> */ private static Map<String, Object> getCellInfo(XSSFCell cell) { XSSFSheet sheet = cell.getSheet(); int rowIndex = cell.getRowIndex(); int columnIndex = cell.getColumnIndex(); boolean isPartOfRegion = false; int firstColumn = 0; int lastColumn = 0; int firstRow = 0; int lastRow = 0; int sheetMergeCount = sheet.getNumMergedRegions(); for (int i = 0; i < sheetMergeCount; i++) { CellRangeAddress ca = sheet.getMergedRegion(i); firstColumn = ca.getFirstColumn(); lastColumn = ca.getLastColumn(); firstRow = ca.getFirstRow(); lastRow = ca.getLastRow(); if (rowIndex >= firstRow && rowIndex <= lastRow) {if (columnIndex >= firstColumn && columnIndex <= lastColumn) { isPartOfRegion = true; break;} } } Map<String, Object> map = new HashMap<>(16); int width = 0; int height = 0; boolean isPartOfRowsRegion = false; if (isPartOfRegion) { for (int i = firstColumn; i <= lastColumn; i++) {width += sheet.getColumnWidth(i); } for (int i = firstRow; i <= lastRow; i++) {height += sheet.getRow(i).getHeight(); } if (lastRow > firstRow) {isPartOfRowsRegion = true; } } else { width = sheet.getColumnWidth(columnIndex); height += cell.getRow().getHeight(); } map.put('isPartOfRowsRegion', isPartOfRowsRegion); map.put('firstRow', firstRow); map.put('lastRow', lastRow); map.put('width', width); map.put('height', height); return map; }}

到此這篇關(guān)于Java導(dǎo)出Execl疑難點(diǎn)處理的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java導(dǎo)出Execl內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
97精品在线| 日韩在线观看| 美女被久久久| 国产亚洲一卡2卡3卡4卡新区| 国产精品99久久免费| 日本蜜桃在线观看视频| 亚洲在线国产日韩欧美| 国产精品羞羞答答在线观看| 色老板在线视频一区二区| 蜜桃久久精品一区二区| 国产欧美69| 日韩精品免费一区二区三区| 亚洲在线久久| 国产成年精品| 日韩影院精彩在线| 久久99久久久精品欧美| 久久精品播放| 日韩激情视频网站| 香蕉成人av| 日韩黄色免费网站| 日韩精品一区二区三区免费观影| 在线免费观看亚洲| 日韩国产一区二区| 亚洲精品伊人| 欧美aa在线观看| 日韩精品社区| 久久视频精品| 久久av综合| 日韩在线一区二区| 成人污污视频| 日韩精品亚洲专区| 亚洲高清久久| 日韩福利视频导航| 狠狠操综合网| 精品入口麻豆88视频| 人人精品人人爱| 国产精品99视频| 日韩av三区| 欧美另类综合| 91青青国产在线观看精品| 亚洲精品第一| 一区二区小说| 97国产成人高清在线观看| 日韩激情综合| 在线成人直播| 天堂а√在线最新版中文在线| 日韩av电影一区| 国产二区精品| 国产一区福利| 国产精区一区二区| 久久av在线| 亚洲成人va| 国产一区二区三区日韩精品| 91嫩草精品| 中文字幕日本一区二区| 欧美日韩国产探花| 日韩欧美精品综合| 精品亚洲二区| 国产精品久久久久久久久久妞妞| 亚洲欧美高清| 激情婷婷久久| 日韩欧美二区| 久久av中文| 国产探花一区在线观看| 亚洲日本免费电影| 玖玖精品视频| 日韩视频一区| 免费av一区二区三区四区| 日韩电影免费网址| 国产一区二区三区四区五区| 18国产精品| 日韩亚洲精品在线观看| 99视频精品免费观看| 性欧美xxxx免费岛国不卡电影| 欧美国产美女| 国产成人精品亚洲线观看| 欧美经典一区| 欧美一区免费| 欧美欧美黄在线二区| 欧美一区在线观看视频| 亚洲精品国产日韩| 亚洲开心激情| 综合激情网站| 亚洲aⅴ网站| 综合一区av| 亚洲精品黄色| 日本午夜精品视频在线观看| 日韩精品a在线观看91| 日本一区福利在线| 日本不卡视频一二三区| 日韩精品中文字幕一区二区| 日本成人一区二区| 日本v片在线高清不卡在线观看| 亚洲精品国产日韩| 日本强好片久久久久久aaa| 欧美在线观看天堂一区二区三区| 日本午夜精品久久久久| 欧美精品国产白浆久久久久| 国产精品成人国产| 国产不卡一区| 久久久成人网| 欧美天堂亚洲电影院在线观看| 9久re热视频在线精品| 亚洲一二av| 欧美片网站免费| 欧美精品不卡| 精品欧美日韩精品| a国产在线视频| 亚洲精品国产嫩草在线观看| 国产高清一区| 综合色就爱涩涩涩综合婷婷| 日韩欧美激情电影| 国产精品欧美日韩一区| 精品午夜av| 久久五月天小说| 蜜臀久久久99精品久久久久久| 日韩影片在线观看| 久久精品国产精品亚洲毛片| 色爱av综合网| 蜜臀av一区二区三区| 欧美日韩a区| 国产精品高颜值在线观看| 99久久久久| 亚洲精品少妇| 久久伊人亚洲| 亚洲91视频| 亚洲精品免费观看| 精品三级国产| 欧美天堂亚洲电影院在线观看| 日韩欧美中文字幕电影| 国产一区二区三区精品在线观看| 欧美1区免费| 欧美视频久久| 久久蜜桃精品| 日本aⅴ精品一区二区三区| 色欧美自拍视频| 久热综合在线亚洲精品| 国产另类在线| 人人香蕉久久| 日韩欧美高清一区二区三区| 成人国产精品一区二区免费麻豆| 午夜精品亚洲| 国产精品.xx视频.xxtv| 欧美成人午夜| 国产欧美一区二区三区精品观看| 久久久一二三| 国产日产精品_国产精品毛片 | 亚洲深深色噜噜狠狠爱网站| 国产精品欧美三级在线观看| 精品成人免费一区二区在线播放| 亚洲欧洲国产精品一区| 美女尤物国产一区| 红桃视频欧美| 国产精品videossex久久发布| 久久精品欧美一区| 亚洲毛片一区| 久久视频一区| 国产美女亚洲精品7777| 国产综合亚洲精品一区二| 国产欧美日韩精品一区二区免费| 亚洲午夜精品久久久久久app| 欧美一区激情| 午夜国产精品视频| 欧美极品中文字幕| 国产精品日本| 国产成人精品亚洲线观看| 香蕉久久久久久久av网站| 国产一区调教| 视频一区日韩| 九九在线精品| 另类综合日韩欧美亚洲| 鲁大师成人一区二区三区| 国产中文欧美日韩在线| 亚洲理论在线| 欧美亚洲国产一区| 老司机精品视频网| 亚洲精品极品| 婷婷综合社区| 鲁鲁在线中文| 中文字幕av一区二区三区四区| 日韩激情一区| 国产极品一区| 中文字幕日韩欧美精品高清在线| 神马午夜久久| 福利一区二区| 国产欧美精品久久| 免播放器亚洲一区| 婷婷成人在线| a天堂资源在线| 国产精品115| 日韩不卡一二三区| 日韩精品一二三区| 国产综合欧美| 中文字幕高清在线播放| 久久不卡日韩美女| 日本麻豆一区二区三区视频| 欧美一区=区| 黄色免费成人| 亚洲一级黄色| 成人羞羞在线观看网站|