通常的EXCEL導出使用POI先建立一個HSSFWorkbook,而後經過不斷建立HSSFRow,HSSFCell後設置單元格內容即可以完成導出。java
此次在項目中須要用到模板,導出的內容包括(1.模板中的內容、樣式。2.本身須要新增的內容、樣式。),還須要設置單元格的樣式,在網上搜了一些blog,完成後記錄一下。apache
分析此次需求,最關鍵的就是如何獲取到填充了模板的新HSSFWorkbook,若是獲取到它,咱們能夠熟練的往裏面添加內容。字體
1 File fi = new File("F:/usr/user.xls"); 2 POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(fi)); 3 HSSFWorkbook wb = new HSSFWorkbook(fs);
這樣即可以獲取到咱們熟悉的HSSFWorkbook對象了,操做熟悉的HSSFWorkbook對象想必爽歪歪了。這裏還有一個需求,就是須要設置一些單元格的樣式,這在以前我也沒有接觸到過,記錄下來。this
1 //生成單元格樣式 2 HSSFCellStyle cellStyle = wb.createCellStyle(); //wb是上一步建立的HSSFWorkbook對象 3 //設置背景顏色 4 cellStyle.setFillForegroundColor(HSSFColor.RED.index); 5 //solid 填充 foreground 前景色 6 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
這樣便建立完成了一個單元格的樣式,接下來即是在特定的單元格添加樣式。spa
1 //獲取特定的單元格 2 HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); 3 //設置樣式 4 cell.setCellStyle(cellStyle); //cellStyle是上一步建立的HSSFCellStyle對象
如此,整個需求基本完成。對於整個過程當中須要用到的其餘方法,這裏寫了一個封裝類。excel
** 有些方法可能只適用此項目,使用時須要修改。code
1 package com.pole.educate.excel; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.util.Calendar; 8 import java.util.Date; 9 10 import org.apache.poi.hssf.usermodel.HSSFCell; 11 import org.apache.poi.hssf.usermodel.HSSFCellStyle; 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.poifs.filesystem.POIFSFileSystem; 17 import org.apache.poi.ss.usermodel.RichTextString; 18 /** 19 * 共分爲六部完成根據模板導出excel操做:<br/> 20 * 第一步、設置excel模板路徑(setSrcPath)<br/> 21 * 第二步、設置要生成excel文件路徑(setDesPath)<br/> 22 * 第三步、設置模板中哪一個Sheet列(setSheetName)<br/> 23 * 第四步、獲取所讀取excel模板的對象(getSheet)<br/> 24 * 第五步、設置數據(分爲6種類型數據:setCellStrValue、setCellDateValue、setCellDoubleValue、setCellBoolValue、setCellCalendarValue、setCellRichTextStrValue)<br/> 25 * 第六步、完成導出 (exportToNewFile)<br/> 26 * 27 * @author Administrator 28 * 29 */ 30 public class ExcelWriter { 31 POIFSFileSystem fs = null; 32 HSSFWorkbook wb = null; 33 HSSFSheet sheet = null; 34 HSSFCellStyle cellStyle = null; 35 36 private String srcXlsPath = "";// excel模板路徑 37 private String desXlsPath = ""; // 生成路徑 38 private String sheetName = ""; 39 40 /** 41 * 第一步、設置excel模板路徑 42 * @param srcXlsPaths 43 */ 44 public void setSrcPath(String srcXlsPaths) { 45 this.srcXlsPath = srcXlsPaths; 46 } 47 48 /** 49 * 第二步、設置要生成excel文件路徑 50 * @param desXlsPaths 51 * @throws FileNotFoundException 52 */ 53 public void setDesPath(String desXlsPaths) throws FileNotFoundException { 54 this.desXlsPath = desXlsPaths; 55 } 56 57 /** 58 * 第三步、設置模板中哪一個Sheet列 59 * @param sheetName 60 */ 61 public void setSheetName(String sheetName) { 62 this.sheetName = sheetName; 63 } 64 65 /** 66 * 第四步、獲取所讀取excel模板的對象 67 */ 68 public void getSheet() { 69 try { 70 File fi = new File(srcXlsPath); 71 if(!fi.exists()){ 72 //System.out.println("模板文件:"+srcXlsPath+"不存在!"); 73 return; 74 } 75 fs = new POIFSFileSystem(new FileInputStream(fi)); 76 wb = new HSSFWorkbook(fs); 77 sheet = wb.getSheet(sheetName); 78 79 //生成單元格樣式 80 cellStyle = wb.createCellStyle(); 81 //設置背景顏色 82 cellStyle.setFillForegroundColor(HSSFColor.RED.index); 83 //solid 填充 foreground 前景色 84 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 85 86 } catch (FileNotFoundException e) { 87 e.printStackTrace(); 88 } catch (IOException e) { 89 e.printStackTrace(); 90 } 91 } 92 /** 93 * 94 */ 95 public HSSFRow createRow(int rowIndex) { 96 HSSFRow row = sheet.createRow(rowIndex); 97 return row; 98 } 99 /** 100 * 101 */ 102 public void createCell(HSSFRow row,int colIndex) { 103 row.createCell(colIndex); 104 } 105 /** 106 * 第五步、設置單元格的樣式 107 * @param rowIndex 行值 108 * @param cellnum 列值 109 */ 110 public void setCellStyle(int rowIndex, int cellnum) { 111 HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); 112 cell.setCellStyle(cellStyle); 113 } 114 115 /** 116 * 第五步、設置字符串類型的數據 117 * @param rowIndex 行值 118 * @param cellnum 列值 119 * @param value 字符串類型的數據 120 */ 121 public void setCellStrValue(int rowIndex, int cellnum, String value) { 122 if(value != null) { 123 HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); 124 cell.setCellValue(value); 125 } 126 } 127 128 /** 129 * 第五步、設置日期/時間類型的數據 130 * @param rowIndex 行值 131 * @param cellnum 列值 132 * @param value 日期/時間類型的數據 133 */ 134 public void setCellDateValue(int rowIndex, int cellnum, Date value) { 135 HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); 136 cell.setCellValue(value); 137 } 138 139 /** 140 * 第五步、設置浮點類型的數據 141 * @param rowIndex 行值 142 * @param cellnum 列值 143 * @param value 浮點類型的數據 144 */ 145 public void setCellDoubleValue(int rowIndex, int cellnum, double value) { 146 HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); 147 cell.setCellValue(value); 148 } 149 150 /** 151 * 第五步、設置Bool類型的數據 152 * @param rowIndex 行值 153 * @param cellnum 列值 154 * @param value Bool類型的數據 155 */ 156 public void setCellBoolValue(int rowIndex, int cellnum, boolean value) { 157 HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); 158 cell.setCellValue(value); 159 } 160 161 /** 162 * 第五步、設置日曆類型的數據 163 * @param rowIndex 行值 164 * @param cellnum 列值 165 * @param value 日曆類型的數據 166 */ 167 public void setCellCalendarValue(int rowIndex, int cellnum, Calendar value) { 168 HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); 169 cell.setCellValue(value); 170 } 171 172 /** 173 * 第五步、設置富文本字符串類型的數據。能夠爲同一個單元格內的字符串的不一樣部分設置不一樣的字體、顏色、下劃線 174 * @param rowIndex 行值 175 * @param cellnum 列值 176 * @param value 富文本字符串類型的數據 177 */ 178 public void setCellRichTextStrValue(int rowIndex, int cellnum, 179 RichTextString value) { 180 HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); 181 cell.setCellValue(value); 182 } 183 184 /** 185 * 第六步、完成導出 186 */ 187 public void exportToNewFile() { 188 FileOutputStream out; 189 try { 190 out = new FileOutputStream(desXlsPath); 191 wb.write(out); 192 out.close(); 193 } catch (FileNotFoundException e) { 194 e.printStackTrace(); 195 } catch (IOException e) { 196 e.printStackTrace(); 197 } 198 } 199 200 }