10.1、了解 Apache POI
實際開發中,用到最多的是把數據庫中數據導出生成報表,尤其是在生產管理或者財務系統中用的非常普遍。生成報表格式一般是EXCEL或者PDF 。利用Apache POI實現數據庫中數據導出生成excel報表。在java眾多數據導出excel報表的第三方jar包中POI相對來說比較好用。
Apache POI 是用Java編寫的免費開源的跨平台 API,給Java提供對Microsoft Office格式檔案讀和寫的功能,創建和維護操作各種符合Office Open XML(OOXML)標准和微軟的OLE2復合文檔格式(OLE2)。借助POI,Java可以讀取、創建和修改MS Excel文件、MS Word文件及MSPowerPoint文件,其中office2003、2010均可以。下面是Apache POI 中提供的幾大部分的作用:
HSSF - 提供讀寫Microsoft Excel XLS格式檔案的功能。
HSSF - 提供讀寫Microsoft Excel XLS格式檔案的功能。
XSSF - 提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能。
HWPF - 提供讀寫Microsoft Word DOC格式檔案的功能。
HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。
HDGF - 提供讀Microsoft Visio格式檔案的功能。
HPBF - 提供讀Microsoft Publisher格式檔案的功能。
HSMF - 提供讀Microsoft Outlook格式檔案的功能。
創建一個excel報表步驟:
1. 創建新的Excel工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
在Excel工作簿中建一工作表,其名為缺省值。POI中還提供了其他的一些workbook 構造方法。
2.創建一個工作表。新建一名為"工資表"的工作表:
HSSFSheet sheet = workbook.createSheet("工資表");
3.創建行。在索引0的位置創建行(最頂端的行):
HSSFRow row = sheet.createRow(0);
4.創建單元格。在索引0的位置創建單元格(左上端):
HSSFCell cell = row.createCell((short) 0);
定義單元格為字符串類型(也可在創建單元格里面設置):
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
在單元格中輸入一些內容:
cell.setCellValue("增加值");
5.新建一輸出文件流,把相應的Excel工作簿輸出到本地
FileOutputStream fOut = new FileOutputStream(outputFile);
workbook.write(fOut);
fOut.flush();
操作結束,關閉文件
fOut.close();
在給單元格設置下從數據庫中讀取的數據。這樣就可以把數據庫里面的內容導入到excel了。
10.2、常用方法列舉:
對象種類:
HSSFWorkbook excell的文檔對象
HSSFSheet excell的表單
HSSFRow excell的行
HSSFCell excell的格子單元
HSSFFont excell字體
HSSFName 名稱
HSSFDataFormat 日期格式
常用方法:
1.合並單元格
sheet.addMergedRegion(new Region(beginRowIndex , (short) beginColumnIndex , endRowIndex , (short) endColumnIndex ));
即從A行的B列,合並到C行的D列。可以理解為一塊面積。
2.設置頁腳
HSSFFooter foot = sheet.getFooter();
foot.setLeft("左邊文字:");
foot.setCenter("中間文字:");
foot.setRight(HSSFFooter.page()+"/"+HSSFFooter.numPages());//顯示的為:當前頁/總頁數。如:1/3
3.生成Excel的思想
靈活應用java提供的數據結構(List,Map,Set)。通常習慣把每個sheet定義為一個Map元素.即:
Map<sheet名,數據集合>. 至於數據集合,則可根據實際情況組成相應的數據結構。總之,靈活應用數據結構: 生成Excel的邏輯可擴展性相當好,而且擴展起來甚是方便,並可以在一定程序上實現Excel的動態化。
樣式示例:(整數型、浮點型、布爾型、字符串型、日期格式、中西文結合式)
1 import org.apache.poi.hssf.usermodel.*; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 publicclass CreateCells 5 { 6 publicstaticvoid main(String[] args) 7 throws IOException 8 { 9 HSSFWorkbook wb = new HSSFWorkbook();//建立新HSSFWorkbook對象 10 HSSFSheet sheet = wb.createSheet("new sheet");//建立新的sheet對象 11 // Create a row and put some cells in it. Rows are 0 based. 12 HSSFRow row = sheet.createRow((short)0);//建立新行 13 // Create a cell and put a value in it. 14 HSSFCell cell = row.createCell((short)0);//建立新cell 15 cell.setCellValue(1);//設置cell的整數類型的值 16 // Or do it on one line. 17 row.createCell((short)1).setCellValue(1.2);//設置cell浮點類型的值 18 row.createCell((short)2).setCellValue("test");//設置cell字符類型的值 19 row.createCell((short)3).setCellValue(true);//設置cell布爾類型的值 20 HSSFCellStyle cellStyle = wb.createCellStyle();//建立新的cell樣式 21 cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm"));//設置cell樣式為定制的日期格式 22 HSSFCell dCell =row.createCell((short)4); 23 dCell.setCellValue(new Date());//設置cell為日期類型的值 24 dCell.setCellStyle(cellStyle); //設置該cell日期的顯示格式 25 HSSFCell csCell =row.createCell((short)5); 26 csCell.setEncoding(HSSFCell.ENCODING_UTF_16);//設置cell編碼解決中文高位字節截斷 27 csCell.setCellValue("中文測試_Chinese Words Test");//設置中西文結合字符串 28 row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);//建立錯誤cell 29 // Write the output to a file 30 FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 31 wb.write(fileOut); 32 fileOut.close(); 33 } 34 }
10.3、程序模塊
在表格中間插入創建行:
1 public void createNewRow(){ 2 //下移行的條件有2個:當前行非初始行,且當前行沒有超過最后一行 3 if(this.currRowIndex!=this.initRowIndex && this.lastRowIndex>this.currRowIndex){ 4 //將指定的幾行進行下移一行 5 sheet.shiftRows(this.currRowIndex, this.lastRowIndex, 1, true, true); 6 //既然下移了那么最后一行下標就也要增大了 7 this.lastRowIndex++; 8 } 9 //在指定的行上創建一個空行(如果此行原本有單元格和數據,那么也會被空行覆蓋,且創建出來的空行是沒有單元格的) 10 this.currRow = sheet.createRow(this.currRowIndex); 11 this.currRow.setHeightInPoints(this.defaultRowHeight); 12 this.currRowIndex++; 13 this.currColIndex = this.initColIndex; 14 }
單元格前(背)景色、(頂底左右)邊框及顏色、位置樣式設置:
1 /** 2 * 樣式設置 3 */ 4 public static HSSFCellStyle createCellStyle(HSSFWorkbook workbook){ 5 // *生成一個樣式 6 HSSFCellStyle style = workbook.createCellStyle(); 7 // 設置這些樣式 8 // 前景色 9 style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); 10 // 背景色 11 style.setFillBackgroundColor(HSSFColor.GREEN.index); 12 // 填充樣式 13 style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 14 // 設置底邊框 15 style.setBorderBottom(HSSFCellStyle.BORDER_THIN); 16 // 設置底邊框顏色 17 style.setBottomBorderColor(HSSFColor.BLACK.index); 18 // 設置左邊框 19 style.setBorderLeft(HSSFCellStyle.BORDER_THIN); 20 // 設置左邊框顏色 21 style.setLeftBorderColor(HSSFColor.BLACK.index); 22 // 設置右邊框 23 style.setBorderRight(HSSFCellStyle.BORDER_THIN); 24 // 設置右邊框顏色 25 style.setRightBorderColor(HSSFColor.BLACK.index); 26 // 設置頂邊框 27 style.setBorderTop(HSSFCellStyle.BORDER_THIN); 28 // 設置頂邊框顏色 29 style.setTopBorderColor(HSSFColor.BLACK.index); 30 // 設置自動換行 31 style.setWrapText(false); 32 // 設置水平對齊的樣式為居中對齊 33 style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 34 // 設置垂直對齊的樣式為居中對齊 35 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); 36 // HSSFFont font = createCellFont(workbook); 37 // // 把字體應用到當前的樣式 38 // style.setFont(font); 39 return style; 40 }
單元格字體樣式設置:
1 /** 2 * 字體設置 3 */ 4 public static HSSFFont createCellFont(HSSFWorkbook workbook){ 5 // *生成一個字體 6 HSSFFont font = workbook.createFont(); 7 // 字體顏色 8 font.setColor(HSSFColor.VIOLET.index); 9 // 字體大小 10 font.setFontHeightInPoints((short) 12); 11 // 字體加粗 12 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 13 // 是否使用斜體 14 font.setItalic( true ); 15 // 是否使用划線 16 //font.setStrikeout(true); 17 // 字體名字 18 font.setFontName( " 黑體 " ); 19 return font; 20 }
保留小數位數樣式設置:
1 /** 2 * 保留2位小數 3 */ 4 HSSFCellStyle cellStyle = workbook.createCellStyle(); 5 Short doubleFormat = workbook.createDataFormat().getFormat("0.00"); 6 cellStyle.setDataFormat(doubleFormat); 7 cellStyle.setDataFormat(doubleFormat);
注釋設置:
1 /** 2 * 注釋設置 3 */ 4 public static HSSFComment createCellComment(HSSFPatriarch patriarch, String commentText, String commentName){ 5 // *添加單元格注釋 6 // 定義注釋的大小和位置,詳見文檔 7 HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 2, 2)); 8 // 設置注釋內容 9 comment.setString(new HSSFRichTextString(commentText)); 10 // 設置注釋作者,當鼠標移動到單元格上是可以在狀態欄中看到該內容. 11 comment.setAuthor(commentName); 12 return comment; 13 }
圖片插入設置:
1 /** 2 * 圖片插入 3 */ 4 public static void createCellPicture(HSSFWorkbook workbook, HSSFPatriarch patriarch, String url, int col, int row) throws Exception{ 5 //先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray 6 BufferedImage bufferImg =null; 7 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); 8 bufferImg = ImageIO.read(new File( url )); 9 ImageIO.write(bufferImg,"jpg",byteArrayOut); 10 HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,1023, 255, (short) col, row, (short) col, row); 11 anchor.setAnchorType(3); 12 //插入圖片 13 patriarch.createPicture(anchor , workbook.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG)); 14 byteArrayOut.flush(); 15 byteArrayOut.close(); 16 }
10.4、實例:
報表生成類:ComplexExportExcelClient.java
1 package com.bzu.search.action; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import org.apache.poi.hssf.usermodel.HSSFCell; 7 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 8 import org.apache.poi.hssf.usermodel.HSSFFont; 9 import org.apache.poi.hssf.usermodel.HSSFRichTextString; 10 import org.apache.poi.hssf.usermodel.HSSFRow; 11 import org.apache.poi.hssf.usermodel.HSSFSheet; 12 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 13 import org.apache.poi.hssf.util.Region; 14 15 /** 16 * 拒絕件報表生成類. 17 * 18 * @author caoyb 19 * @version $Revision:$ 20 */ 21 public class ComplexExportExcelClient { 22 23 private static HSSFWorkbook wb = new HSSFWorkbook(); 24 25 private static HSSFSheet sheet = wb.createSheet(); 26 27 @SuppressWarnings({ "unchecked", "deprecation" }) 28 public static void main(String[] args) { 29 30 ExportExcel exportExcel = new ExportExcel(wb, sheet); 31 32 // 創建列標頭LIST 33 List fialList = new ArrayList(); 34 35 fialList.add("申請人未提供任何聯系方式"); 36 fialList.add("無工作單位信息且未提供收入來源信息"); 37 fialList.add("有工作單位但未提供單位地址或電話"); 38 fialList.add("家庭地址缺失"); 39 fialList.add("客戶身份證明資料缺"); 40 fialList.add("簽名缺失或簽名不符合要求"); 41 fialList.add("其它"); 42 43 List errorList = new ArrayList(); 44 45 errorList.add("客戶主動取消"); 46 errorList.add("個人征信不良"); 47 errorList.add("欺詐申請"); 48 errorList.add("申請人基本條件不符"); 49 errorList.add("申請材料不合規"); 50 errorList.add("無法正常完成征信"); 51 errorList.add("重復申請"); 52 errorList.add("其他"); 53 54 // 計算該報表的列數 55 int number = 2 + fialList.size() * 2 + errorList.size() * 2; 56 57 // 給工作表列定義列寬(實際應用自己更改列數) 58 for (int i = 0; i < number; i++) { 59 sheet.setColumnWidth(i, 3000); 60 } 61 62 // 創建單元格樣式 63 HSSFCellStyle cellStyle = wb.createCellStyle(); 64 65 // 指定單元格居中對齊 66 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); 67 68 // 指定單元格垂直居中對齊 69 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); 70 71 // 指定當單元格內容顯示不下時自動換行 72 cellStyle.setWrapText(true); 73 74 // 設置單元格字體 75 HSSFFont font = wb.createFont(); 76 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 77 font.setFontName("宋體"); 78 font.setFontHeight((short) 200); 79 cellStyle.setFont(font); 80 81 // 創建報表頭部 82 exportExcel.createNormalHead("南京地區申請資料拒件分析統計", number); 83 84 // 設置第二行 85 String[] params = new String[] { " 年 月 日", " 年 月 日" }; 86 exportExcel.createNormalTwoRow(params, number); 87 88 // 設置列頭 89 HSSFRow row2 = sheet.createRow(2); 90 91 HSSFCell cell0 = row2.createCell(0); 92 cell0.setCellStyle(cellStyle); 93 cell0.setCellValue(new HSSFRichTextString("機構代碼")); 94 95 HSSFCell cell1 = row2.createCell(1); 96 cell1.setCellStyle(cellStyle); 97 cell1.setCellValue(new HSSFRichTextString("支行名稱")); 98 99 HSSFCell cell2 = row2.createCell(2); 100 cell2.setCellStyle(cellStyle); 101 cell2.setCellValue(new HSSFRichTextString("無效件")); 102 103 HSSFCell cell3 = row2.createCell(2 * fialList.size() + 2); 104 cell3.setCellStyle(cellStyle); 105 cell3.setCellValue(new HSSFRichTextString("拒絕件")); 106 107 HSSFRow row3 = sheet.createRow(3); 108 109 // 設置行高 110 row3.setHeight((short) 800); 111 112 HSSFCell row3Cell = null; 113 int m = 0; 114 int n = 0; 115 116 // 創建不同的LIST的列標題 117 for (int i = 2; i < number; i = i + 2) { 118 119 if (i < 2 * fialList.size() + 2) { 120 row3Cell = row3.createCell(i); 121 row3Cell.setCellStyle(cellStyle); 122 row3Cell.setCellValue(new HSSFRichTextString(fialList.get(m) 123 .toString())); 124 m++; 125 } else { 126 row3Cell = row3.createCell(i); 127 row3Cell.setCellStyle(cellStyle); 128 row3Cell.setCellValue(new HSSFRichTextString(errorList.get(n) 129 .toString())); 130 n++; 131 } 132 133 } 134 135 // 創建最后一列的合計列 136 row3Cell = row3.createCell(number); 137 row3Cell.setCellStyle(cellStyle); 138 row3Cell.setCellValue(new HSSFRichTextString("合計")); 139 140 // 合並單元格 141 HSSFRow row4 = sheet.createRow(4); 142 143 // 合並第一列的 第三行到第五行 144 sheet.addMergedRegion(new Region(2, (short) 0, 4, (short) 0)); 145 146 // 合並第二行的 第三行到第五行 147 sheet.addMergedRegion(new Region(2, (short) 1, 4, (short) 1)); 148 149 // 合並第三行的 第三列到第AA指定的列 150 int aa = 2 * fialList.size() + 1; 151 sheet.addMergedRegion(new Region(2, (short) 2, 2, (short) aa)); 152 153 int start = aa + 1; 154 155 sheet.addMergedRegion(new Region(2, (short) start, 2, 156 (short) (number - 1))); 157 158 // 循環合並第四行的行,並且是每2列合並成一列 159 for (int i = 2; i < number; i = i + 2) { 160 sheet.addMergedRegion(new Region(3, (short) i, 3, (short) (i + 1))); 161 162 } 163 164 // 根據列數奇偶數的不同創建不同的列標題 165 for (int i = 2; i < number; i++) { 166 if (i < 2 * fialList.size() + 2) { 167 168 if (i % 2 == 0) { 169 HSSFCell cell = row4.createCell(i); 170 cell.setCellStyle(cellStyle); 171 cell.setCellValue(new HSSFRichTextString("無效量")); 172 } else { 173 HSSFCell cell = row4.createCell(i); 174 cell.setCellStyle(cellStyle); 175 cell.setCellValue(new HSSFRichTextString("占比")); 176 } 177 } else { 178 if (i % 2 == 0) { 179 HSSFCell cell = row4.createCell(i); 180 cell.setCellStyle(cellStyle); 181 cell.setCellValue(new HSSFRichTextString("拒絕量")); 182 } else { 183 HSSFCell cell = row4.createCell(i); 184 cell.setCellStyle(cellStyle); 185 cell.setCellValue(new HSSFRichTextString("占比")); 186 } 187 } 188 189 } 190 191 // 循環創建中間的單元格的各項的值 192 for (int i = 5; i < number; i++) { 193 HSSFRow row = sheet.createRow((short) i); 194 for (int j = 0; j <= number; j++) { 195 exportExcel 196 .cteateCell(wb, row, (short) j, 197 HSSFCellStyle.ALIGN_CENTER_SELECTION, String 198 .valueOf(j)); 199 } 200 201 } 202 203 // 創建最后一行的合計行 204 String[] cellValue = new String[number - 1]; 205 for (int i = 0; i < number - 1; i++) { 206 cellValue[i] = String.valueOf(i); 207 208 } 209 exportExcel.createLastSumRow(1, cellValue); 210 211 exportExcel.outputExcel("c:\\拒絕件統計.xls"); 212 213 } 214 }
EXCEL報表工具類:ExportExcel.java
1 package com.bzu.search.action; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 8 import org.apache.poi.hssf.usermodel.HSSFCell; 9 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 10 import org.apache.poi.hssf.usermodel.HSSFFont; 11 import org.apache.poi.hssf.usermodel.HSSFRichTextString; 12 import org.apache.poi.hssf.usermodel.HSSFRow; 13 import org.apache.poi.hssf.usermodel.HSSFSheet; 14 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 15 import org.apache.poi.hssf.util.HSSFColor; 16 import org.apache.poi.hssf.util.Region; 17 18 /** 19 * EXCEL報表工具類. 20 * 21 * @author caoyb 22 * @version $Revision:$ 23 */ 24 public class ExportExcel { 25 26 private HSSFWorkbook wb = null; 27 28 private HSSFSheet sheet = null; 29 30 /** 31 * @param wb 32 * @param sheet 33 */ 34 public ExportExcel(HSSFWorkbook wb, HSSFSheet sheet) { 35 super(); 36 this.wb = wb; 37 this.sheet = sheet; 38 } 39 40 /** 41 * @return the sheet 42 */ 43 public HSSFSheet getSheet() { 44 return sheet; 45 } 46 47 /** 48 * @param sheet 49 * the sheet to set 50 */ 51 public void setSheet(HSSFSheet sheet) { 52 this.sheet = sheet; 53 } 54 55 /** 56 * @return the wb 57 */ 58 public HSSFWorkbook getWb() { 59 return wb; 60 } 61 62 /** 63 * @param wb 64 * the wb to set 65 */ 66 public void setWb(HSSFWorkbook wb) { 67 this.wb = wb; 68 } 69 70 /** 71 * 創建通用EXCEL頭部 72 * 73 * @param headString 74 * 頭部顯示的字符 75 * @param colSum 76 * 該報表的列數 77 */ 78 public void createNormalHead(String headString, int colSum) { 79 80 HSSFRow row = sheet.createRow(0); 81 82 // 設置第一行 83 HSSFCell cell = row.createCell(0); 84 row.setHeight((short) 400); 85 86 // 定義單元格為字符串類型 87 cell.setCellType(HSSFCell.ENCODING_UTF_16); 88 cell.setCellValue(new HSSFRichTextString("南京城區各網點進件統計報表")); 89 90 // 指定合並區域 91 sheet.addMergedRegion(new Region(0, (short) 0, 0, (short) colSum)); 92 93 HSSFCellStyle cellStyle = wb.createCellStyle(); 94 95 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊 96 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊 97 cellStyle.setWrapText(true);// 指定單元格自動換行 98 99 // 設置單元格字體 100 HSSFFont font = wb.createFont(); 101 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 102 font.setFontName("宋體"); 103 font.setFontHeight((short) 300); 104 cellStyle.setFont(font); 105 106 cell.setCellStyle(cellStyle); 107 } 108 109 /** 110 * 創建通用報表第二行 111 * 112 * @param params 113 * 統計條件數組 114 * @param colSum 115 * 需要合並到的列索引 116 */ 117 public void createNormalTwoRow(String[] params, int colSum) { 118 HSSFRow row1 = sheet.createRow(1); 119 row1.setHeight((short) 300); 120 121 HSSFCell cell2 = row1.createCell(0); 122 123 cell2.setCellType(HSSFCell.ENCODING_UTF_16); 124 cell2.setCellValue(new HSSFRichTextString("統計時間:" + params[0] + "至" 125 + params[1])); 126 127 // 指定合並區域 128 sheet.addMergedRegion(new Region(1, (short) 0, 1, (short) colSum)); 129 130 HSSFCellStyle cellStyle = wb.createCellStyle(); 131 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊 132 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊 133 cellStyle.setWrapText(true);// 指定單元格自動換行 134 135 // 設置單元格字體 136 HSSFFont font = wb.createFont(); 137 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 138 font.setFontName("宋體"); 139 font.setFontHeight((short) 250); 140 cellStyle.setFont(font); 141 142 cell2.setCellStyle(cellStyle); 143 144 } 145 146 /** 147 * 設置報表標題 148 * 149 * @param columHeader 150 * 標題字符串數組 151 */ 152 public void createColumHeader(String[] columHeader) { 153 154 // 設置列頭 155 HSSFRow row2 = sheet.createRow(2); 156 157 // 指定行高 158 row2.setHeight((short) 600); 159 160 HSSFCellStyle cellStyle = wb.createCellStyle(); 161 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊 162 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊 163 cellStyle.setWrapText(true);// 指定單元格自動換行 164 165 // 單元格字體 166 HSSFFont font = wb.createFont(); 167 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 168 font.setFontName("宋體"); 169 font.setFontHeight((short) 250); 170 cellStyle.setFont(font); 171 172 /* 173 * cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 設置單無格的邊框為粗體 174 * cellStyle.setBottomBorderColor(HSSFColor.BLACK.index); // 設置單元格的邊框顏色. 175 * cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); 176 * cellStyle.setLeftBorderColor(HSSFColor.BLACK.index); 177 * cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); 178 * cellStyle.setRightBorderColor(HSSFColor.BLACK.index); 179 * cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); 180 * cellStyle.setTopBorderColor(HSSFColor.BLACK.index); 181 */ 182 183 // 設置單元格背景色 184 cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); 185 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 186 187 HSSFCell cell3 = null; 188 189 for (int i = 0; i < columHeader.length; i++) { 190 cell3 = row2.createCell(i); 191 cell3.setCellType(HSSFCell.ENCODING_UTF_16); 192 cell3.setCellStyle(cellStyle); 193 cell3.setCellValue(new HSSFRichTextString(columHeader[i])); 194 } 195 196 } 197 198 /** 199 * 創建內容單元格 200 * 201 * @param wb 202 * HSSFWorkbook 203 * @param row 204 * HSSFRow 205 * @param col 206 * short型的列索引 207 * @param align 208 * 對齊方式 209 * @param val 210 * 列值 211 */ 212 public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align, 213 String val) { 214 HSSFCell cell = row.createCell(col); 215 cell.setCellType(HSSFCell.ENCODING_UTF_16); 216 cell.setCellValue(new HSSFRichTextString(val)); 217 HSSFCellStyle cellstyle = wb.createCellStyle(); 218 cellstyle.setAlignment(align); 219 cell.setCellStyle(cellstyle); 220 } 221 222 /** 223 * 創建合計行 224 * 225 * @param colSum 226 * 需要合並到的列索引 227 * @param cellValue 228 */ 229 public void createLastSumRow(int colSum, String[] cellValue) { 230 231 HSSFCellStyle cellStyle = wb.createCellStyle(); 232 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊 233 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊 234 cellStyle.setWrapText(true);// 指定單元格自動換行 235 236 // 單元格字體 237 HSSFFont font = wb.createFont(); 238 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 239 font.setFontName("宋體"); 240 font.setFontHeight((short) 250); 241 cellStyle.setFont(font); 242 243 HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1)); 244 HSSFCell sumCell = lastRow.createCell(0); 245 246 sumCell.setCellValue(new HSSFRichTextString("合計")); 247 sumCell.setCellStyle(cellStyle); 248 sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0, 249 sheet.getLastRowNum(), (short) colSum));// 指定合並區域 250 251 for (int i = 2; i < (cellValue.length + 2); i++) { 252 sumCell = lastRow.createCell(i); 253 sumCell.setCellStyle(cellStyle); 254 sumCell.setCellValue(new HSSFRichTextString(cellValue[i - 2])); 255 256 } 257 258 } 259 260 /** 261 * 輸入EXCEL文件 262 * 263 * @param fileName 264 * 文件名 265 */ 266 public void outputExcel(String fileName) { 267 FileOutputStream fos = null; 268 try { 269 fos = new FileOutputStream(new File(fileName)); 270 wb.write(fos); 271 fos.close(); 272 } catch (FileNotFoundException e) { 273 e.printStackTrace(); 274 } catch (IOException e) { 275 e.printStackTrace(); 276 } 277 } 278 }
運行上述兩段代碼你就會在c盤的根目錄下看到一個拒絕件統計.xls文件