使用POI操作Excel使用小總結


1. Workbook維護一個調色板,可以自定義設置56種顏色,下標從8到63. 用到顏色的地方,可以輸入下標獲取顏色,如CellStyle的setFillForegroundColor();

2.CreateCellStyle 創建之后,會把CellStyle放入到workbook維護的隊列中,最多只能創建4000個樣式。

因此,CellStyle應盡可能復用,以防創建了4000個之后發生異常。

如果沒有顯式地給一個Cell設置CellStyle,那么其獲取的將是默認的CellStyle,將會影響到全局的樣式,慎用。

可以使用一個幫助類,創建常用的CellStyle。

但是有兩個要注意的地方:

1)不能使用另一個workbook的CellStyle,應該在本workbook創建一個CellStyle,使用cloneStyleFrom()方法復制樣式

2)復制的時候,使用了調色板下標的地方,注意調色板並沒有復制過來,因此,應該把本workbook的調色板設置成源workbook的調色板一致。

錯誤示范:

1)workbook A使用了workbook B的樣式,拋出異常

Exception in thread "main" java.lang.IllegalArgumentException: This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a differnt workbook?

at org.apache.poi.hssf.usermodel.HSSFCellStyle.verifyBelongsToWorkbook(HSSFCellStyle.java:801)

at org.apache.poi.hssf.usermodel.HSSFCell.setCellStyle(HSSFCell.java:898)

at org.apache.poi.hssf.usermodel.HSSFCell.setCellStyle(HSSFCell.java:894)

at poi.test.App.main(App.java:30)

改正:

1 // 復制樣式。如果直接使用其他 workbook的樣式,會拋出異常
2 CellStyle cellStyle = workbook.createCellStyle();
3 cellStyle.cloneStyleFrom(CellStyleHelper.getDefaultCellStyle());
4 cell.setCellStyle(cellStyle);

 

2)workbook A clone了workbook B的樣式后,調色板未設置成跟workbook B一致,CellStyle的顏色仍是以workbook A的調色板取色。

 

3. 與CellStyle一樣,不同Workbook的Font復制過來也是無效的,不會拋出異常。

Font在創建后也是會加入隊列的,有32767個的限制,雖然很多,但也盡可能復用吧

錯誤示范:

 1 cellStyle.setFont(CellStyleHelper.getDefaultFont()); 

改正:

1 Font font = workbook.createFont();
2         font.setItalic(CellStyleHelper.getDefaultFont().getItalic());
3         cellStyle.setFont(font);

 

 

示例代碼:

 1 package poi.test;
 2 
 3 import java.io.File;
 4 import java.io.FileNotFoundException;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.io.OutputStream;
 8 
 9 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
10 import org.apache.poi.ss.usermodel.Cell;
11 import org.apache.poi.ss.usermodel.CellStyle;
12 import org.apache.poi.ss.usermodel.Font;
13 import org.apache.poi.ss.usermodel.Row;
14 import org.apache.poi.ss.usermodel.Sheet;
15 import org.apache.poi.ss.usermodel.Workbook;
16 
17 public class App {
18 
19     public static void main(String[] args) throws IOException {
20         HSSFWorkbook workbook = new HSSFWorkbook();
21         Sheet sheet = workbook.createSheet("Index");
22         Row row = sheet.createRow(0);
23         Cell cell = row.createCell(0);
24         cell.setCellValue("fuck the world");
25 
26         // 使workbook與要復制的workbook的調色板一致。
27         CellStyleHelper.initWorkbookPalette(workbook);
28 
29         // 復制樣式。如果直接使用其他 workbook的樣式,會拋出異常
30         CellStyle cellStyle = workbook.createCellStyle();
31         cellStyle.cloneStyleFrom(CellStyleHelper.getDefaultCellStyle());
32         
33         // 復制字體樣式。如果直接使用其他workbook的字體,不會拋出異常,但不會起效果,需要復制其字體樣式。
34         Font font = workbook.createFont();
35         font.setItalic(CellStyleHelper.getDefaultFont().getItalic());
36         cellStyle.setFont(font);
37         
38         cell.setCellStyle(cellStyle);
39 
40         writeFile(workbook);
41 
42         System.out.println("success.");
43     }
44 
45     private static void writeFile(Workbook workbook) throws IOException {
46         OutputStream outputStream = new FileOutputStream(new File("D:\\a.xls"));
47         workbook.write(outputStream);
48     }
49 }

 

 1 package poi.test;
 2 
 3 import org.apache.poi.hssf.usermodel.HSSFPalette;
 4 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 5 import org.apache.poi.ss.usermodel.CellStyle;
 6 import org.apache.poi.ss.usermodel.Font;
 7 
 8 public class CellStyleHelper {
 9 
10     static CellStyle defaultCellStyle;
11 
12     static HSSFWorkbook workbook = new HSSFWorkbook();
13     
14     static Font defaultFont;
15 
16     public static void initWorkbookPalette(HSSFWorkbook workbook) {
17         // 調色板
18         HSSFPalette palette = workbook.getCustomPalette();
19         // 自定義顏色,可放置位置從8到63
20         palette.setColorAtIndex((short) 10, (byte) 12, (byte) 222, (byte) 123);
21     }
22 
23     static {
24         initWorkbookPalette(workbook);
25     }
26 
27     public static CellStyle getDefaultCellStyle() {
28         if (null == defaultCellStyle) {
29             defaultCellStyle = workbook.createCellStyle();
30             defaultCellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
31             //設置前景色,使用的顏色是從調色板選取的
32             defaultCellStyle.setFillForegroundColor((short) 10);
33         }
34 
35         return defaultCellStyle;
36     }
37     
38     public static Font getDefaultFont()
39     {
40         if(null == defaultFont)
41         {
42             defaultFont = workbook.createFont();
43             defaultFont.setItalic(true);
44         }
45         
46         return defaultFont;
47     }
48 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM