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 }