Java 利用 poi 生成 Excel檔案的通用例子
阿新 • • 發佈:2018-11-21
在用java 寫資料庫應用的時候, 通常會生成各種報表,而這些報表可能會被匯出為各種格式的檔案,比如Excel文件,pdf 文件等等. 今天先做了一個生成Excel 文件的例子,主要解決以下問題:
-
生成 Excel 文件.
-
保護生成Excel文件,設定密碼訪問.
-
自動對生成的Excel 文件第一行標題欄設定成filter 過濾形式, 方便使用者使用.
package com.yihaomen.poi.sample; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; 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.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; /** * Excel util, create excel sheet, cell and style. *@param <T> generic class. */ public class ExcelUtil<T> { public HSSFCellStyle getCellStyle(HSSFWorkbook workbook,boolean isHeader){ HSSFCellStyle style = workbook.createCellStyle(); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setLocked(true); if (isHeader) { style.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); HSSFFont font = workbook.createFont(); font.setColor(HSSFColor.BLACK.index); font.setFontHeightInPoints((short) 12); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); style.setFont(font); } return style; } public void generateHeader(HSSFWorkbook workbook,HSSFSheet sheet,String[] headerColumns){ HSSFCellStyle style = getCellStyle(workbook,true); Row row = sheet.createRow(0); row.setHeightInPoints(30); for(int i=0;i<headerColumns.length;i++){ Cell cell = row.createCell(i); String[] column = headerColumns[i].split("_#_"); sheet.setColumnWidth(i, Integer.valueOf(column[1])); cell.setCellValue(column[0]); cell.setCellStyle(style); } } @SuppressWarnings({ "rawtypes", "unchecked" }) public HSSFSheet creatAuditSheet(HSSFWorkbook workbook,String sheetName,List<T> dataset,String[] headerColumns,String[] fieldColumns) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { HSSFSheet sheet = workbook.createSheet(sheetName); sheet.protectSheet(""); generateHeader(workbook,sheet,headerColumns); HSSFCellStyle style = getCellStyle(workbook,false); SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd"); int rowNum = 0; for(T t:dataset){ rowNum++ ; Row row = sheet.createRow(rowNum); row.setHeightInPoints(25); for(int i = 0; i < fieldColumns.length; i++){ String fieldName = fieldColumns[i] ; String getMethodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1); try { Class clazz = t.getClass(); Method getMethod; getMethod = clazz.getMethod(getMethodName, new Class[]{} ); Object value = getMethod.invoke(t, new Object[]{}); String cellValue = ""; if (value instanceof Date){ Date date = (Date)value; cellValue = sd.format(date); }else{ cellValue = null != value ? value.toString() : ""; } Cell cell = row.createCell(i); cell.setCellStyle(style); cell.setCellValue(cellValue); } catch (Exception e) { } } } return sheet; } }
這一個公用的類,主要生成Excel的頭,正文,以及Excel 文件的樣式。看方法名稱基本就可以知道這個方法是幹什麼用的
package com.yihaomen.poi.test; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import com.yihaomen.poi.sample.ExcelUtil; import com.yihaomen.poi.sample.User; public class PoiTest { /*excel column formate:column_#_width, excel中每一列的名稱*/ public static final String[] USER_RECORES_COLUMNS = new String[]{ "User Name_#_3000", "Address_#_7000" }; /*the column will display on xls files. must the same as the entity fields.對應上面的欄位.*/ public static final String[] USER_RECORES_FIELDS = new String[]{ "name","address" }; public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException { List<User> users = new ArrayList<User>(); for(int i=0; i<10;i++){ User u = new User(); u.setAddress("address :" + i); u.setName("name: "+ i); u.setAge(i); users.add(u); } //實際專案中,這個list 估計是從資料庫中得到的 HSSFWorkbook workbook = new HSSFWorkbook(); ExcelUtil<User> userSheet = new ExcelUtil<User>(); userSheet.creatAuditSheet(workbook, "user sheet xls", users, USER_RECORES_COLUMNS, USER_RECORES_FIELDS); FileOutputStream fileOut = new FileOutputStream("d:/yihaomen_user_test.xls"); workbook.write(fileOut); fileOut.close(); } }
這裡直接儲存檔案到 D 盤下面,主要是為了自己測試方便. 另外還需要一個測試需要的
package com.yihaomen.poi.sample; public class User { private String name; private int age; private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
生成的文件,你是不能修改的,原因很簡單,設定了一個空密碼,雖然是空密碼,Excel 還是會出現提示,當然你可以直接解保護. 實現的主要程式碼是在 ExcelUtil 中的 creatAuditSheet 方法中的:
sheet.protectSheet(""); // 設定了一個空的密碼
如果要實現第一行標題自動過濾怎麼處理呢,可以在上面提到的方法中加入如下程式碼:
char[] endChar = Character.toChars( 'A' + (headerColumns.length - 1) ); String rangeAddress = "A1:" + String.valueOf(endChar) + "1"; sheet.setAutoFilter(CellRangeAddress.valueOf(rangeAddress));
http://www.ibloger.net/article/3243.html