通常的EXCEL導出使用POI先建立一個HSSFWorkbook,而後經過不斷建立HSSFRow,HSSFCell後設置單元格內容即可以完成導出。java
此次在項目中須要用到模板,導出的內容包括(1.模板中的內容、樣式。2.本身須要新增的內容、樣式。),還須要設置單元格的樣式,在網上搜了一些blog,完成後記錄一下。apache
分析此次需求,最關鍵的就是如何獲取到填充了模板的新HSSFWorkbook,若是獲取到它,咱們能夠熟練的往裏面添加內容。字體
File fi = new File("F:/usr/user.xls"); POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(fi)); HSSFWorkbook wb = new HSSFWorkbook(fs);
這樣即可以獲取到咱們熟悉的HSSFWorkbook對象了,操做熟悉的HSSFWorkbook對象想必爽歪歪了。這裏還有一個需求,就是須要設置一些單元格的樣式,這在以前我也沒有接觸到過,記錄下來。this
//生成單元格樣式 HSSFCellStyle cellStyle = wb.createCellStyle(); //wb是上一步建立的HSSFWorkbook對象 //設置背景顏色 cellStyle.setFillForegroundColor(HSSFColor.RED.index); //solid 填充 foreground 前景色 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
這樣便建立完成了一個單元格的樣式,接下來即是在特定的單元格添加樣式。spa
//獲取特定的單元格 HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); //設置樣式 cell.setCellStyle(cellStyle); //cellStyle是上一步建立的HSSFCellStyle對象
如此,整個需求基本完成。對於整個過程當中須要用到的其餘方法,這裏寫了一個封裝類。excel
** 有些方法可能只適用此項目,使用時須要修改。code
package com.pole.educate.excel; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Calendar; import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.usermodel.RichTextString; /** * 共分爲六部完成根據模板導出excel操做:<br/> * 第一步、設置excel模板路徑(setSrcPath)<br/> * 第二步、設置要生成excel文件路徑(setDesPath)<br/> * 第三步、設置模板中哪一個Sheet列(setSheetName)<br/> * 第四步、獲取所讀取excel模板的對象(getSheet)<br/> * 第五步、設置數據(分爲6種類型數據:setCellStrValue、setCellDateValue、setCellDoubleValue、setCellBoolValue、setCellCalendarValue、setCellRichTextStrValue)<br/> * 第六步、完成導出 (exportToNewFile)<br/> * * @author Administrator * */ public class ExcelWriter { POIFSFileSystem fs = null; HSSFWorkbook wb = null; HSSFSheet sheet = null; HSSFCellStyle cellStyle = null; private String srcXlsPath = "";// excel模板路徑 private String desXlsPath = ""; // 生成路徑 private String sheetName = ""; /** * 第一步、設置excel模板路徑 * @param srcXlsPaths */ public void setSrcPath(String srcXlsPaths) { this.srcXlsPath = srcXlsPaths; } /** * 第二步、設置要生成excel文件路徑 * @param desXlsPaths * @throws FileNotFoundException */ public void setDesPath(String desXlsPaths) throws FileNotFoundException { this.desXlsPath = desXlsPaths; } /** * 第三步、設置模板中哪一個Sheet列 * @param sheetName */ public void setSheetName(String sheetName) { this.sheetName = sheetName; } /** * 第四步、獲取所讀取excel模板的對象 */ public void getSheet() { try { File fi = new File(srcXlsPath); if(!fi.exists()){ //System.out.println("模板文件:"+srcXlsPath+"不存在!"); return; } fs = new POIFSFileSystem(new FileInputStream(fi)); wb = new HSSFWorkbook(fs); sheet = wb.getSheet(sheetName); //生成單元格樣式 cellStyle = wb.createCellStyle(); //設置背景顏色 cellStyle.setFillForegroundColor(HSSFColor.RED.index); //solid 填充 foreground 前景色 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * */ public HSSFRow createRow(int rowIndex) { HSSFRow row = sheet.createRow(rowIndex); return row; } /** * */ public void createCell(HSSFRow row,int colIndex) { row.createCell(colIndex); } /** * 第五步、設置單元格的樣式 * @param rowIndex 行值 * @param cellnum 列值 */ public void setCellStyle(int rowIndex, int cellnum) { HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); cell.setCellStyle(cellStyle); } /** * 第五步、設置字符串類型的數據 * @param rowIndex 行值 * @param cellnum 列值 * @param value 字符串類型的數據 */ public void setCellStrValue(int rowIndex, int cellnum, String value) { if(value != null) { HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); cell.setCellValue(value); } } /** * 第五步、設置日期/時間類型的數據 * @param rowIndex 行值 * @param cellnum 列值 * @param value 日期/時間類型的數據 */ public void setCellDateValue(int rowIndex, int cellnum, Date value) { HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); cell.setCellValue(value); } /** * 第五步、設置浮點類型的數據 * @param rowIndex 行值 * @param cellnum 列值 * @param value 浮點類型的數據 */ public void setCellDoubleValue(int rowIndex, int cellnum, double value) { HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); cell.setCellValue(value); } /** * 第五步、設置Bool類型的數據 * @param rowIndex 行值 * @param cellnum 列值 * @param value Bool類型的數據 */ public void setCellBoolValue(int rowIndex, int cellnum, boolean value) { HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); cell.setCellValue(value); } /** * 第五步、設置日曆類型的數據 * @param rowIndex 行值 * @param cellnum 列值 * @param value 日曆類型的數據 */ public void setCellCalendarValue(int rowIndex, int cellnum, Calendar value) { HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); cell.setCellValue(value); } /** * 第五步、設置富文本字符串類型的數據。能夠爲同一個單元格內的字符串的不一樣部分設置不一樣的字體、顏色、下劃線 * @param rowIndex 行值 * @param cellnum 列值 * @param value 富文本字符串類型的數據 */ public void setCellRichTextStrValue(int rowIndex, int cellnum, RichTextString value) { HSSFCell cell = sheet.getRow(rowIndex).getCell(cellnum); cell.setCellValue(value); } /** * 第六步、完成導出 */ public void exportToNewFile() { FileOutputStream out; try { out = new FileOutputStream(desXlsPath); wb.write(out); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }