天天看點

POI導出excel:設定字型顔色、行高自适應、列寬自适應、鎖住單元格、合并單元格

目錄

​​​​​​1. 前言

2. 鎖住單元格

3. 設定列寬

4. 設定行高

5. 設定字型,顔色

6. 合并單元格

poi架構可以支援我們在java代碼中, 将資料導出成excel,但是實際開發中, 往往還需要設定excel字型,顔色,行高,列寬等屬性, 有時候還需要鎖住單元格, 防止别人講資料随意篡改.

廢話不多說, 直接上代碼

導出excel , 自然就有導入excel 了, 比如導出一些資料出來, 修改一些再導入進去, 但是這時, 一些基本資訊我們不希望使用者随意去修改, 這裡就用到了excel的

代碼:

這樣的話, 這個sheet都會被鎖定

但是我們又希望開放一些單元格可以修改 , 這個時候就要細粒度的進行設定了

建立一個cellstyle:

然後在我們不需要鎖定的單元格上, 給它這個 cellstyle

在鎖定了sheet之後, 會發現一個問題, 就是列寬都不能改變了

這個時候沒辦法, 隻能自己設定列寬了, 現在網上找到的設定列寬的方法有以下幾個:

1.自适應列寬度:

這兩種方式都是自适應列寬度,但是注意這個方法在後邊的版本才提供,poi的版本不要太老。

注意:第一個方法在合并單元格的的單元格并不好使,必須用第二個方法。

經過測試,這種自适應的api在遇到行數多一點的資料的時候,就會耗費大量的時間,1000行花了2分鐘!!!是以盡量不要用

而且這兩個方法對英文數字還好, 對中文支援的并不好:

POI導出excel:設定字型顔色、行高自适應、列寬自适應、鎖住單元格、合并單元格

圖檔

2.用數組将大概的寬度設定好,手動set寬度

3.自己根據一列資料中的最長的字元串長度設定寬度

是以還是得自己費心費力去diy :

判斷這一列的最長字元串,然後

這裡經過我反複嘗試,我個人覺得把最大寬度限制在10000到15000左右是比較合适的, 然後剩下的就交給excel的自動換行

像我這裡有很多行的資料, 不知道哪一行的内容最長, 這裡簡單提供兩種思路(方法是很多的, 能達到目的就行):

用一個<code>map&lt;integer, list&gt;</code>, key是指具體哪一列, list中放的是每行的這一列的内容的長度 , 每周遊一行的一列, 就<code>map.put(i, list.add(length))</code>, 然後用<code>collections.max(map.get(i))</code>來擷取第i列的最長的長度

還是一樣,用一個map: <code>map&lt;integer, integer&gt;,key</code>是指具體哪一列,value是每行的這一列的内容的長度, <code>map.put(i,math.max(length,map.get(i)))</code>,來確定map中的key對應的value永遠是目前的最大的長度.

我這裡使用的第二種:

設定自動換行後,不要設定固定的行高,否則超出的部分也會被遮住不顯示

現在的話, 列寬雖然是比較生硬的套用内容長度來設定, 不過也比之前好多了, 列寬是不能超過<code>256*256</code>的,否則會報錯,是以我這裡設定的最大列寬為15000,超出的部分會自動換行

POI導出excel:設定字型顔色、行高自适應、列寬自适應、鎖住單元格、合并單元格

行高就很簡單了,

注意,設定了固定行高,自動換行就不會自适應行高了

建立cellstyle , 然後建立hssffont , 再把hssffont注入給cellstyle , 在把cellstyle給cell設定

合并單元格的話,建議先合并,合并之後,在合并的第一行第一列set值就可以了