电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java導出Execl疑難點處理的實現

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

一.背景

最近業務需求需要導出Execl,最終做出的效果如下,中間牽扯到大量的數據計算。

二.疑難問題分析

Java導出Execl疑難點處理的實現Java導出Execl疑難點處理的實現

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

三.問題解決

在處理整個Excel導出中總結了很多。

整個開發過程使用的是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選哪個

最開始我沿用的是之前開發用的,HSSFworkbook最后發現,HSSFworkbook在處理,自定義單元格背景顏色比較復雜,最后換成了XSSFworkbook。

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

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

所以在這里我推薦使用XSSFWorkbook

3.2跨單元格及邊框設置

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

調用設置邊框

//在數據渲染完成,調用封裝的邊框設置方法setRegionStyle(wb, sheet, cellRange1);

設置邊框方法

/** * 合并單元格之后設置邊框 * * @param wb XSSFWorkbook對象 * @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自定義背景顏色設置

因為poi自帶的顏色索引可能不滿足我們開發的需求,需要自定義樣色

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

3.4設置單元格中部分字體顏色

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

3.5高度自適應

封裝的工具類如下,需要在數據渲染完的每行,調用如下工具類

//高度自適應//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'); } /** * 根據行內容重新計算行高 * * @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); //單元格的內容 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內容字符串總寬度 double cellContentWidth = cellContent.getBytes().length * 2 * 256; //字符串需要的行數 不做四舍五入之類的操作 double stringNeedsRows = cellContentWidth / cellWidth; //小于一行補足一行 if (stringNeedsRows < 1.0) {stringNeedsRows = 1.0; } //需要的高度 (Math.floor(stringNeedsRows) - 1) * 40 為兩行之間空白高度 double stringNeedsHeight = (double) fontHeight * stringNeedsRows; //需要重設行高 if (stringNeedsHeight > maxHeight) {maxHeight = stringNeedsHeight;//超過原行高三倍 則為5倍 實際應用中可做參數配置if (maxHeight / cellHeight > 5) { maxHeight = 5 * cellHeight;}//最后取天花板防止高度不夠maxHeight = Math.ceil(maxHeight);//重新設置行高 同時處理多行合并單元格的情況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);} } } } /** * 解析一個單元格得到數據 * * @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; }}

到此這篇關于Java導出Execl疑難點處理的實現的文章就介紹到這了,更多相關Java導出Execl內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 冰晶石|碱性嫩黄闪蒸干燥机-有机垃圾烘干设备-草酸钙盘式干燥机-常州市宝康干燥 | 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 螺旋压榨机-刮泥机-潜水搅拌机-电动泥斗-潜水推流器-南京格林兰环保设备有限公司 | 焊接烟尘净化器__焊烟除尘设备_打磨工作台_喷漆废气治理设备 -催化燃烧设备 _天津路博蓝天环保科技有限公司 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 进口消泡剂-道康宁消泡剂-陶氏消泡剂-大洋消泡剂 | 带式压滤机_污泥压滤机_污泥脱水机_带式过滤机_带式压滤机厂家-河南恒磊环保设备有限公司 | 三价铬_环保铬_环保电镀_东莞共盈新材料贸易有限公司 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 河南道路标志牌_交通路标牌_交通标志牌厂家-郑州路畅交通 | 车牌识别道闸_停车场收费系统_人脸识别考勤机_速通门闸机_充电桩厂家_中全清茂官网 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | CCE素质教育博览会 | CCE素博会 | 教育展 | 美育展 | 科教展 | 素质教育展 | 锻造液压机,粉末冶金,拉伸,坩埚成型液压机定制生产厂家-山东威力重工官方网站 | SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 瓶盖扭矩仪(扭力值检测)-百科 | 馋嘴餐饮网_餐饮加盟店火爆好项目_餐饮连锁品牌加盟指南创业平台 | 耐磨焊丝,堆焊焊丝,耐磨药芯焊丝,碳化钨焊丝-北京耐默公司 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 垃圾压缩设备_垃圾处理设备_智能移动式垃圾压缩设备--山东明莱环保设备有限公司 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 酒万铺-酒水招商-酒水代理 | 执业药师报名时间,报考条件,考试时间-首页入口| 耐磨陶瓷管道_除渣器厂家-淄博浩瀚陶瓷科技有限公司 | 板式换网器_柱式换网器_自动换网器-郑州海科熔体泵有限公司 | 沈阳楼承板_彩钢板_压型钢板厂家-辽宁中盛绿建钢品股份有限公司 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 有机肥设备生产制造厂家,BB掺混肥搅拌机、复合肥设备生产线,有机肥料全部加工设备多少钱,对辊挤压造粒机,有机肥造粒设备 -- 郑州程翔重工机械有限公司 | 合肥活动房_安徽活动板房_集成打包箱房厂家-安徽玉强钢结构集成房屋有限公司 | 锻造液压机,粉末冶金,拉伸,坩埚成型液压机定制生产厂家-山东威力重工官方网站 | 北京中创汇安科贸有限公司| POM塑料_PBT材料「进口」聚甲醛POM杜邦原料、加纤PBT塑料报价格找利隆塑料 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 电池挤压试验机-自行车喷淋-车辆碾压试验装置-深圳德迈盛测控设备有限公司 | 南京精锋制刀有限公司-纵剪机刀片_滚剪机刀片_合金刀片厂家 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 |