在Excel應用中,會須要用到各類樣式,包括單元格背景色、邊框、高度、寬度、內容相對位置、字體格式、字體大小、字體顏色等等。POI提供了一系列的樣式,能知足咱們通常開發中的需求。java
POI設置Excel樣式主要經過如下幾個相關類:字體
參數spa |
說明.net |
HSSFCellStyleorm |
POI樣式類blog |
HSSFFontci |
字體樣式類開發 |
HSSFColorget |
顏色類input |
HSSFBorderFormatting |
邊框樣式類 |
HSSFCellStyle是最基本的樣式類。HSSFCellStyle能夠直接對上下左右四個邊框、內容相對位置、單元格背景色、單元格填充方式、數字格式等進行設置。
HSSFFont是字體樣式類,需set到HSSFCellStyle生效。HSSFFont能夠設置字體樣式、字體大小、字體顏色等。
HSSFColor是顏色類,該類裏面有大部分基本顏色屬性,提供基本顏色的直接調用。
單元格邊框分爲上、下、左、右四部分,能夠設置其邊框的寬度、樣式及顏色。邊框默認爲無邊框,若加上邊框默認爲黑色。
如今爲一行10個單元格所有加上邊框(細),並設置顏色爲紅色。
代碼片斷:
public static HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{ //初始一個workbook HSSFWorkbook workbook = new HSSFWorkbook(inputStream); //獲取樣式 HSSFCellStyle style = createCellStyle(workbook); //建立一個sheet HSSFSheet sheet = workbook.getSheetAt(0); HSSFRow row = sheet.createRow(1); for(int cellnum = 0; cellnum < 10; cellnum++){ HSSFCell cell = row.createCell(cellnum); cell.setCellStyle(style); } return workbook; }
/** * 設置單元格的邊框(細)且爲紅色 * @param workbook * @param cellnum * @return */ public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook){ HSSFCellStyle style = workbook.createCellStyle(); //設置上下左右四個邊框寬度 style.setBorderTop(HSSFBorderFormatting.BORDER_THIN); style.setBorderBottom(HSSFBorderFormatting.BORDER_THIN); style.setBorderLeft(HSSFBorderFormatting.BORDER_THIN); style.setBorderRight(HSSFBorderFormatting.BORDER_THIN); //設置上下左右四個邊框顏色 style.setTopBorderColor(HSSFColor.RED.index); style.setBottomBorderColor(HSSFColor.RED.index); style.setLeftBorderColor(HSSFColor.RED.index); style.setRightBorderColor(HSSFColor.RED.index);
return style; } |
輸出結果:
圖24
單元格背景色填充涉及到填充顏色和填充方式,現以最經常使用的填充方式填充天藍色背景。
代碼片斷:
在上面代碼中加入: //設置單元格背景色 style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); |
輸出結果:
圖25
注:單元格背景色暫不作詳解,在附錄中我會列出顏色做爲開發參考。
字體格式包括書寫體、顏色、大小、加粗、斜體、下劃線、刪除線等。
如下爲POI中字體默認屬性:
字體屬性 |
Default |
書寫體 |
宋體 |
顏色 |
黑色 |
大小 |
12 有待考證 |
加粗 |
無 |
斜體 |
無 |
下劃線 |
無 |
刪除線 |
無 |
現將字體設置爲幼圓、9px、顏色黃色、加粗、斜體、下劃線、刪除線做爲示例。
代碼片斷:
在上面代碼中加入: 設置數據到單元格代碼片斷(略)
//設置字體格式 HSSFFont font = workbook.createFont(); font.setFontName("幼圓"); font.setFontHeightInPoints((short)9); font.setColor(HSSFColor.YELLOW.index); font.setBoldweight(font.BOLDWEIGHT_BOLD); font.setItalic(true); font.setStrikeout(true); font.setUnderline((byte)1); //將字體格式設置到HSSFCellStyle上 style.setFont(font); |
輸出結果:
圖26
單元格的對齊方式是針對單元格中的內容,單元格中的內容能夠靠左、靠右、靠上、靠下、以及垂直居中、水平居中等等。
針對以上各類對齊方式,將目前6.4中輸出結果Excel基礎上進行微調後操做,將目前基本對齊方式進行展現。
代碼片斷:
public static HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{ //初始一個workbook HSSFWorkbook workbook = new HSSFWorkbook(inputStream); //建立一個sheet HSSFSheet sheet = workbook.getSheetAt(0); HSSFRow row = sheet.getRow(1); for(int cellnum = 0; cellnum < 13; cellnum++){ HSSFCell cell = row.getCell(cellnum); //獲取樣式 HSSFCellStyle style = createCellStyle(workbook); cell.setCellStyle(style); } return workbook; }
/** * 設置單元格的邊框(細)且爲紅色 * @param workbook * @param cellnum * @return */ public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook){ HSSFCellStyle style = workbook.createCellStyle(); //設置上下左右四個邊框寬度 style.setBorderTop(HSSFBorderFormatting.BORDER_THIN); style.setBorderBottom(HSSFBorderFormatting.BORDER_THIN); style.setBorderLeft(HSSFBorderFormatting.BORDER_THIN); style.setBorderRight(HSSFBorderFormatting.BORDER_THIN); //設置上下左右四個邊框顏色 style.setTopBorderColor(HSSFColor.RED.index); style.setBottomBorderColor(HSSFColor.RED.index); style.setLeftBorderColor(HSSFColor.RED.index); style.setRightBorderColor(HSSFColor.RED.index); //設置單元格背景色 style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); //設置字體格式 HSSFFont font = workbook.createFont(); font.setFontName("幼圓"); font.setFontHeightInPoints((short)9); font.setColor(HSSFColor.YELLOW.index); font.setBoldweight(font.BOLDWEIGHT_BOLD); font.setItalic(true); font.setStrikeout(true); font.setUnderline((byte)1); //將字體格式設置到HSSFCellStyle上 style.setFont(font); //設置單元格居中方式 setCellAlign(style); return style; }
private static void setCellAlign(HSSFCellStyle style){ switch (num) { case 0: //此單元格格式暫不動,默認進行對照 num++; break; case 1: style.setAlignment(HSSFCellStyle.ALIGN_LEFT);//靠左 num++; break; case 2: style.setAlignment(HSSFCellStyle.ALIGN_RIGHT);//靠右 num++; break; case 3: style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中 num++; break; case 4: style.setVerticalAlignment(HSSFCellStyle.VERTICAL_TOP);//垂直靠上 num++; break; case 5: style.setVerticalAlignment(HSSFCellStyle.VERTICAL_BOTTOM);//垂直靠下 num++; break; case 6: style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中 num++; break; case 7: style.setVerticalAlignment(HSSFCellStyle.VERTICAL_JUSTIFY);//垂直平鋪 num++; break; case 8: style.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);//跨列居中 num++; break; case 9: style.setAlignment(HSSFCellStyle.ALIGN_FILL);//填充 num++; break; case 10: style.setAlignment(HSSFCellStyle.ALIGN_GENERAL);//普通默認 num++; break; case 11: style.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);//兩端對齊 num++; break; case 12: style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//水平居中且垂直居中 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); num++; break;
} } |
輸出結果:
圖27
實際應用開發中,涉及到大量的數據,而各行、各列數據的格式不盡相同,有要求整數型,有要求精確到小數點兩位等。解決此類問題一種方式是咱們用 java將數據進行format後輸出,但此種狀況致使的問題是輸出數據格式爲String類型。在這裏POI爲咱們提供了單元格數據格式化的方法。
現將Excel中建立4個單元格依上面的樣式,並設置每一個單元格的值都是double count =666.1415926;而後進行下面的format。
代碼片斷:
private static void setCellFormat(HSSFWorkbook workbook, HSSFCellStyle style){ HSSFDataFormat format = workbook.createDataFormat(); switch (num) { case 0: //此單元格格式暫不動,默認進行對照 num++; break; case 1: style.setDataFormat(format.getFormat("##.00")); num++; break; case 2: style.setDataFormat(format.getFormat("##.000")); num++; break; case 3: style.setDataFormat(format.getFormat("###")); num++; break; } } |
輸出結果:
圖28
注:POI中的數字格式化支持四捨五入。
Excel默認的單元格寬度與高度有限,若是咱們寫入的內容比較長或者須要換行等都涉及到調整寬度與高度。因此須要進行單元格的寬度與高度設置。
這個設置很簡單,經過HSSFSheet設置整列的寬度,經過HSSFRow設置正行的高度。POI中寬度、高度設置須要換算,換算單位以下:
|
單位 |
用法(10px) |
高度 |
15.625 |
15.625*10 |
寬度 |
35.7 |
35.7*10 |
如今作一個示範,將Excel的第1、二行設置爲高度爲40px(兩種方法),A列寬度爲80px。
代碼片斷:
public static HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{ //初始一個workbook HSSFWorkbook workbook = new HSSFWorkbook(inputStream); //建立一個sheet HSSFSheet sheet = workbook.getSheetAt(0); HSSFRow row0 = sheet.createRow(0); HSSFRow row1 = sheet.createRow(1); //設置行高40px row0.setHeight((short)(15.625*40)); row1.setHeightInPoints((float)40); //設置列寬100px sheet.setColumnWidth(0, (int)35.7*100); return workbook; } |
輸出結果:
圖29
單元格合併後依然是N個單元格,因此目前在設置合併後的單元格樣式時須要分解每個單元格去設置。
以下圖,咱們將標題行合併單元格加邊框、背景色等樣式。
圖30
代碼片斷:
public static HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{ //初始一個workbook HSSFWorkbook workbook = new HSSFWorkbook(inputStream); //獲取第一張sheet HSSFSheet sheet = workbook.getSheet("合併單元格"); //準備樣式 Map<String,HSSFCellStyle> styleMap = createCellStyle(workbook); //循環全部的合併單元格 for(int numMR = 0; numMR < sheet.getNumMergedRegions(); numMR++){ //獲取合併單元格 //獲取合併單元格每個單元格 for(int rownum = region.getRowFrom(); rownum <= region.getRowTo(); rownum++){ HSSFRow row = sheet.getRow(rownum); for(int cellnum = region.getColumnFrom(); cellnum <= region.getColumnTo(); cellnum++){ HSSFCell cell = row.getCell(cellnum); if(cell == null){ cell = row.createCell(cellnum); } cell.setCellStyle(styleMap.get("titleStyle")); } }
} return workbook; } |
輸出結果:
圖31
根據前面7小節的內容,咱們將Excel的樣式進行規範下的使用與展現。
將下圖中的Excel
1) 標題行(第1、二行)填充爲背景天藍色,標題的字體設置爲紅色、加粗、12px,標題單元格設置爲細邊框,垂直且水平居中。
2) 內容數據設置爲黑色、9px,內容單元格爲細邊框
3) 總計行填充爲背景黃色,字體9px、黑色加粗,單元格爲細邊框
圖32
代碼片斷:
public static HSSFWorkbook write(InputStream inputStream) throws IOException, ClassNotFoundException{ //初始一個workbook HSSFWorkbook workbook = new HSSFWorkbook(inputStream); //獲取第一張sheet HSSFSheet sheet = workbook.getSheet("Sheet1"); //準備樣式 Map<String,HSSFCellStyle> styleMap = createCellStyle(workbook); //設置標題行樣式 for(int numMR = 0; numMR < sheet.getNumMergedRegions(); numMR++){ //獲取合併單元格 //獲取合併單元格每個單元格 for(int rownum = region.getRowFrom(); rownum <= region.getRowTo(); rownum++){ HSSFRow row = sheet.getRow(rownum); for(int cellnum = region.getColumnFrom(); cellnum <= region.getColumnTo(); cellnum++){ HSSFCell cell = row.getCell(cellnum); if(cell == null){ cell = row.createCell(cellnum); } cell.setCellStyle(styleMap.get("titleStyle")); } } } //設置內容樣式 for(int cRowNum = 2; cRowNum < sheet.getLastRowNum(); cRowNum++){ HSSFRow cRow = sheet.getRow(cRowNum); for(int cCellnum = 0; cCellnum < cRow.getLastCellNum(); cCellnum++){ HSSFCell cell = cRow.getCell(cCellnum); cell.setCellStyle(styleMap.get("contentStyle")); } } //設置總計樣式 HSSFRow cRow = sheet.getRow(sheet.getLastRowNum()); for(int cCellnum = 0; cCellnum < cRow.getLastCellNum(); cCellnum++){ HSSFCell cell = cRow.getCell(cCellnum); if(cell == null){ cell = cRow.createCell(cCellnum); } cell.setCellStyle(styleMap.get("totalStyle")); } return workbook; }
public static Map<String, HSSFCellStyle> createCellStyle(HSSFWorkbook workbook){ Map<String, HSSFCellStyle> styleMap = new HashMap<String, HSSFCellStyle>(); //標題格式 HSSFCellStyle titleStyle = workbook.createCellStyle(); titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); setCellBorderStyle(titleStyle); setBoldCellFontStyle(workbook, titleStyle, (short)10, HSSFColor.RED.index); setBackgroundStyle(titleStyle, HSSFColor.SKY_BLUE.index); styleMap.put("titleStyle", titleStyle); //內容樣式 HSSFCellStyle contentStyle = workbook.createCellStyle(); setCellBorderStyle(contentStyle); setSimpleCellFontStyle(workbook, contentStyle, (short)9, HSSFColor.BLACK.index); styleMap.put("contentStyle", contentStyle); //總計樣式 HSSFCellStyle totalStyle = workbook.createCellStyle(); setCellBorderStyle(totalStyle); setBoldCellFontStyle(workbook, totalStyle, (short)9, HSSFColor.BLACK.index); setBackgroundStyle(totalStyle, HSSFColor.YELLOW.index); styleMap.put("totalStyle", totalStyle); return styleMap; }
private static HSSFCellStyle setCellBorderStyle(HSSFCellStyle cellStyle){ cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); return cellStyle; } private static HSSFCellStyle setSimpleCellFontStyle(HSSFWorkbook workbook,HSSFCellStyle cellStyle, short size, short color){ HSSFFont font = workbook.createFont(); font.setFontHeightInPoints(size); font.setColor(color); cellStyle.setFont(font); return cellStyle; } private static HSSFCellStyle setBoldCellFontStyle(HSSFWorkbook workbook,HSSFCellStyle cellStyle, short size, short color){ HSSFFont font = workbook.createFont(); font.setBoldweight(font.BOLDWEIGHT_BOLD); font.setFontHeightInPoints(size); font.setColor(color); cellStyle.setFont(font); return cellStyle; }
private static HSSFCellStyle setBackgroundStyle(HSSFCellStyle cellStyle, short color){ cellStyle.setFillForegroundColor(color); cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); return cellStyle; } |
輸出結果:
原博:http://blog.csdn.net/yuzhenling/article/details/48133053
參考資料: