一次 POI 版本升級踩坑記錄

前言

結論先行。
開發過程中由于可能涉及到二次開發,若原系統開發時間久遠,沒有達成一致規范設計,導致風格各異,確實滿足當時開發場景,但增大了后續的更新的難度,容易出現俄羅斯套娃現象,新的更正引發新的問題和沖突,一環套一環。
如非必要,可延用老版本 poi 依賴。舊系統的迭代開發,更適合更新增加而非修改固有代碼設計,牽一發而動全身。

一、版本升級觸發條件

引入 hutool 新工具包,pom 依賴與原系統舊版本沖突,導致報錯。故試圖升級系統原有的poi版本。

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.6.4</version>
</dependency>

二、由于 poi 版本升級引起的其他錯誤,需更新部分設置適配新版本

1. poi 版本對比

舊版本新版本
3.135.2.2
<!-- 舊 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.13</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.13</version>
</dependency><!-- 新 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version>
</dependency>

2. Cell 類型對比

舊版本

switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:value = cell.getRichStringCellValue().getString().trim();break;case Cell.CELL_TYPE_NUMERIC:if (HSSFDateUtil.isCellDateFormatted(cell)){Date d = cell.getDateCellValue();value = formater.format(d);}else if ("General".equals(cell.getCellStyle().getDataFormatString())) {value = df.format(cell.getNumericCellValue());} else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) {value = sdf.format(cell.getDateCellValue());} else {value = df2.format(cell.getNumericCellValue());}break;case Cell.CELL_TYPE_BOOLEAN:value = cell.getBooleanCellValue();break;case Cell.CELL_TYPE_BLANK:value = "";break;default:break;
}

新版本

switch (cell.getCellType()) {case STRING:value = cell.getRichStringCellValue().getString().trim();break;case NUMERIC:if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)){Date d = cell.getDateCellValue();value = formater.format(d);}else if ("General".equals(cell.getCellStyle().getDataFormatString())) {value = df.format(cell.getNumericCellValue());} else if ("m/d/yy".equals(cell.getCellStyle().getDataFormatString())) {value = sdf.format(cell.getDateCellValue());} else {value = df2.format(cell.getNumericCellValue());}break;case BOOLEAN:value = cell.getBooleanCellValue();break;case BLANK:value = "";break;default:break;
}

3. 設置表頭樣式

舊版本

// 設置表頭字體樣式
HSSFFont columnHeadFont = workbook.createFont();
columnHeadFont.setFontName("宋體");
columnHeadFont.setFontHeightInPoints((short) 10);
columnHeadFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 列頭的樣式
HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
columnHeadStyle.setFont(columnHeadFont);
columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
columnHeadStyle.setLocked(true);
columnHeadStyle.setWrapText(true);
columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);
columnHeadStyle.setBorderLeft((short) 1);
columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);
columnHeadStyle.setBorderRight((short) 1);
columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index);
columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index);

新版本

// 設置表頭字體樣式
HSSFFont columnHeadFont = workbook.createFont();
columnHeadFont.setFontName("宋體");
columnHeadFont.setFontHeightInPoints((short) 10);
columnHeadFont.setBold(true);// 列頭的樣式
HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
columnHeadStyle.setFont(columnHeadFont);
columnHeadStyle.setAlignment(HorizontalAlignment.CENTER);
columnHeadStyle.setVerticalAlignment(VerticalAlignment.CENTER);
columnHeadStyle.setLocked(true);
columnHeadStyle.setWrapText(true);
columnHeadStyle.setLeftBorderColor(IndexedColors.BLACK.index);
columnHeadStyle.setBorderLeft(BorderStyle.THIN);
columnHeadStyle.setRightBorderColor(IndexedColors.BLACK.index);
columnHeadStyle.setBorderRight(BorderStyle.THIN);
columnHeadStyle.setBorderBottom(BorderStyle.THIN);
columnHeadStyle.setBottomBorderColor(IndexedColors.BLACK.index);
columnHeadStyle.setFillForegroundColor(IndexedColors.WHITE.index);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915463.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915463.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915463.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

硬件設計學習DAY13——電源緩沖電路設計全解

每日更新教程&#xff0c;評論區答疑解惑&#xff0c;小白也能變大神&#xff01;" 目錄 一.緩沖電路介紹 1.1緩沖電路的作用 1.2寄生參數的來源 1.3緩沖電路的類型 1.4常見緩沖電路設計 1.5設計原則 二.吸收與緩沖 2.1吸收與緩沖的核心作用 2.2電壓尖峰與吸收措…

鴻蒙搜狐新聞如何在Native調用ArkTS方法

01前言鴻蒙作為一款新興的智能操作系統&#xff0c;現在適配鴻蒙系統的應用越來越多&#xff0c;同時會面臨三端兼容問題&#xff0c;如同一產品功能&#xff0c;需要維護iOS、Android、鴻蒙三端代碼。拿文件上傳、下載功能場景舉例&#xff0c;同時要適配iOS、Android、鴻蒙三…

Java行為型模式---中介者模式

中介者模式基礎概念中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是通過一個中介對象來封裝一系列對象之間的交互&#xff0c;使各對象不需要顯式地相互引用&#xff0c;從而降低耦合度&#xff0c;并可以獨立地改變它們之間…

Python爬蟲實戰:研究Korean庫相關技術

一、引言 1.1 研究背景與意義 隨著韓流文化在全球的傳播,韓語網頁內容急劇增加。韓國在科技、娛樂等領域的信息具有重要研究價值。然而,韓語獨特的黏著語特性(如助詞體系、詞尾變化)給信息處理帶來挑戰。傳統爬蟲缺乏對韓語語言特點的針對性處理,本研究旨在開發一套完整…

表單校驗--數組各項獨立校驗

寫需求時遇到一個這樣的問題&#xff0c;就是校樣項是多個的&#xff0c;但是其字段名稱相同這時我們可以這樣校驗&#xff0c;注意字段之間的關聯性<div v-for"(item,index) in formData.hospitalDoctorList" :key"item.key || index"><el-form-…

基于SpringBoot和leaflet-timeline-slider的歷史敘事GIS展示-以哪吒2的海外國家上映安排為例

目錄 前言 一、哪吒2的海外之路 1、海外征戰歷程 2、上映國家空間查詢 二、后端接口的實現 1、模型層的實現 2、上映時間與國家 3、控制層的實現 三、基于leaflet-timeline-slider的前端實現 1、時間軸控件的引入及定義 2、時間軸綁定事件 3、成果展示 四、總結 前言…

tar 解壓:Cannot change ownership to uid 1000, gid 1000: Operation not permitted

tar 解壓 tar.gz 壓縮包報錯&#xff1a; # tar xzf $INPUT_FOLDER/archive.tar.gz -C /mnt/test-nas/[..] tar: xx.jpg: Cannot change ownership to uid 1000, gid 1000: Operation not permitted原因是用普通用戶執行的解壓縮腳本&#xff0c;用root用戶執行tar解壓縮&…

騰訊客戶端開發面試真題分析

以下是針對騰訊客戶端開發工程師面試問題的分類與高頻問題分析&#xff08;基于??105道問題&#xff0c;總出現次數118次??&#xff09;。按技術領域整合為??7大類別??&#xff0c;按占比排序并精選高頻問題標注優先級&#xff08;1-5&#x1f31f;&#xff09;&#x…

線上問題排查之【CPU飆高100%】

目錄 案例 發現問題 排查問題 步驟一 步驟二 步驟三 案例 import java.util.concurrent.TimeUnit;/*** 簡單寫一個CPU飆高的案例*/ public class CpuLoadUp {// 這里定義了一個標識private volatile static int flag 0;public static void main(String[] args) {// 執行…

c語言 進階 動態內存管理

動態內存管理1. 為什么存在動態內存分配2. 動態內存函數的介紹?2.1 malloc 和 freemalloc 函數free 函數2.2內存泄漏2.3 calloc2.4 realloc3. 常見的動態內存錯誤3.1 對NULL指針的解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放一塊…

Redis的五大基本數據類型

一、Redis基本知識與Redis鍵&#xff08;key&#xff09;常用操作命令。redis的默認端口6379。mysql默認端口號3306。 默認16個數據庫&#xff0c;類似數組的下標從0開始&#xff0c;初始默認使用0號庫。可以使用select index來切換數據庫&#xff0c;如&#xff1a;select 1&a…

達夢數據庫JSON_TABLE使用說明

在達夢數據庫&#xff08;DM Database&#xff09;中&#xff0c;將 JSON 數據轉換為表格形式可以使用內置的 JSON_TABLE 函數。以下是詳細步驟和示例&#xff1a;1. 核心函數&#xff1a;JSON_TABLE JSON_TABLE 用于將 JSON 數據解析為關系表結構&#xff0c;支持從 JSON 對象…

A316-1926-V1 USB多路高清音頻解碼器模組技術解析

隨著數字音頻技術的不斷發展&#xff0c;高品質音頻解決方案的需求日益增長。本文將介紹一款基于XMOS技術的高性能USB音頻解碼器模組——A316-1926-V1&#xff0c;這是一款專為高清音頻應用設計的專業模組。核心技術與特性A316-1926-V1是一款集成了多項先進技術的USB多路高清音…

.NET 8 中的 KeyedService

.NET 8 中的 KeyedService&#xff1a;新特性解析與使用示例 一、引言 在 .NET 8 的 Preview 7 版本中&#xff0c;引入了 KeyedService 支持。這一特性為開發者提供了按名稱&#xff08;name&#xff09;獲取服務的便利&#xff0c;在某些場景下&#xff0c;開發者無需再自行…

Paimon對比基于消息隊列(如Kafka)的傳統實時數倉方案的優勢

弊端&#xff1a;數據重復 -> 優勢&#xff1a;Paimon 主鍵表原生去重原方案弊端 (Kafka)問題: 消息隊列&#xff08;Kafka&#xff09;是僅支持追加&#xff08;Append-Only&#xff09;的日志流。當 Flink 作業發生故障恢復&#xff08;Failover&#xff09;或業務邏輯迭代…

Linux Shell 命令 + 項目場景

shell 命令1. 基礎文件操作命令1.1 ls - 列出目錄內容1.2 find - 文件搜索2. 版本控制命令2.1 git - 版本控制系統2.2 高級 Git 操作3. 文本搜索命令3.1 grep - 文本搜索3.2 高級搜索技巧4. Android 構建系統命令4.1 source - 加載環境變量4.2 lunch - 選擇構建目標4.3 m - And…

A316-Mini-V1:超小尺寸USB高清音頻解碼器模組技術探析

引言 隨著便攜式音頻設備的普及&#xff0c;對小型化、高性能音頻解決方案的需求日益增長。本文將介紹一款極致小型化的高性能USB音頻解碼器模組——A316-Mini-V1&#xff0c;這是一款基于XMOS XU316芯片的微型音頻處理模組。產品概述 A316-Mini-V1是一款專為小尺寸產品設計的M…

低代碼平臺買saas好還是私有化好

選擇低代碼平臺采用SaaS還是私有化部署&#xff0c;應根據企業具體情況考慮安全性、成本控制、維護難度、擴展需求等因素。 其中&#xff0c;安全性是決定企業選擇的重要因素之一。私有化部署意味著企業能夠完全掌控數據和系統的安全管理&#xff0c;更適合對數據安全要求極高的…

基于SkyWalking的微服務APM監控實戰指南

基于SkyWalking的微服務APM監控實戰指南 1. 業務場景描述 隨著微服務在生產環境中大規模應用&#xff0c;系統鏈路復雜、實例彈性伸縮、灰度發布等特點都給性能監控和問題診斷帶來了新的挑戰。傳統的單機或輕量級監控方案已無法滿足微服務環境下的全鏈路、分布式追蹤和實時告警…

Python 進階(五): Excel 基本操作

目錄 1. 概述2. 寫入 2.1 使用 xlwt2.2 使用 XlsxWriter 3. 讀取4. 修改 1. 概述 在現實中&#xff0c;很多工作都需要與數據打交道&#xff0c;Excel 作為常用的數據處理工具&#xff0c;一直備受人們的青睞&#xff0c;而大部分人都是手動操作 Excel&#xff0c;如果數據量…