資料到處EXCEL表格
阿新 • • 發佈:2018-12-17
package com.zlm.ssm.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; /** * excel匯出的封裝類 * @author miaoruntu * */ public class ExcelExportSXXSSF { // 定義工作表 private SXSSFWorkbook wb; /** * 定義工作表中的sheet */ private Sheet sh; /** * 定義儲存在記憶體中的數量,-1表示手動控制 */ private int flushRows; /** 匯出檔案行數 */ private int rownum; /** 匯出檔案列數 */ private int colnum; /** 匯出檔案的存放路徑 */ private String filePath; /** 下載匯出檔案的路徑 */ private String fileWebPath; /**檔名稱字首*/ private String filePrefix; /**匯出檔案全路徑*/ private String fileAllPath; /** 匯出檔案列標題 */ private List<String> fieldNames; /**匯出檔案每列程式碼,用於反射獲取物件屬性值*/ private List<String> fieldCodes; private ExcelExportSXXSSF() { } /** * 開始匯出方法 * * @param filePath * 匯出檔案存放物理路徑 * @param fileWebPath * 匯出檔案web下載路徑 * @param filePrefix * 匯出檔名的字首 * @param flushRows * 存放在記憶體的資料量 * @param fieldNames * 匯出檔案列標題 * @param fieldCodes * 匯出資料物件的欄位名稱 * @param flushRows * 寫磁碟控制引數 * @return */ public static ExcelExportSXXSSF start(String filePath, String fileWebPath,String filePrefix, List<String> fieldNames,List<String> fieldCodes, int flushRows) throws Exception { ExcelExportSXXSSF excelExportSXXSSF = new ExcelExportSXXSSF(); excelExportSXXSSF.setFilePath(filePath); excelExportSXXSSF.setFileWebPath(fileWebPath); excelExportSXXSSF.setFilePrefix(filePrefix); excelExportSXXSSF.setFieldNames(fieldNames); excelExportSXXSSF.setFieldCodes(fieldCodes); excelExportSXXSSF.setWb(new SXSSFWorkbook(flushRows));//建立workbook excelExportSXXSSF.setSh(excelExportSXXSSF.getWb().createSheet());//建立sheet excelExportSXXSSF.writeTitles(); return excelExportSXXSSF; } /** * 設定匯入檔案的標題 * 開始生成匯出excel的標題 * @throws Exception */ private void writeTitles() throws Exception { rownum = 0;//第0行 colnum = fieldNames.size();//根據列標題得出列數 Row row = sh.createRow(rownum); for (int cellnum = 0; cellnum < colnum; cellnum++) { Cell cell = row.createCell(cellnum); cell.setCellValue(fieldNames.get(cellnum)); } } /** * 嚮導出文件寫資料 * * @param datalist * 存放Object物件,僅支援單個自定義物件,不支援物件中巢狀自定義物件 * @return */ public void writeDatasByObject(List datalist) throws Exception { for (int j = 0; j < datalist.size(); j++) { rownum = rownum + 1; Row row = sh.createRow(rownum); for (int cellnum = 0; cellnum < fieldCodes.size(); cellnum++) { Object owner = datalist.get(j); Object value = invokeMethod(owner, fieldCodes.get(cellnum), new Object[] {}); Cell cell = row.createCell(cellnum); cell.setCellValue(value!=null?value.toString():""); } } } /** * 嚮導出文件寫資料 * * @param datalist * 存放字串陣列 * @return */ public void writeDatasByString(List<String> datalist) throws Exception { rownum = rownum + 1; Row row = sh.createRow(rownum); int datalist_size = datalist.size(); for (int cellnum = 0; cellnum < colnum; cellnum++) { Cell cell = row.createCell(cellnum); if(datalist_size>cellnum){ cell.setCellValue(datalist.get(cellnum)); }else{ cell.setCellValue(""); } } } /** * 手動重新整理方法,如果flushRows為-1則需要使用此方法手動重新整理記憶體 * * @param flushRows * @throws Exception */ public void flush(int flushNum) throws Exception { ((SXSSFSheet) sh).flushRows(flushNum); } /** * 匯出檔案 * * @throws Exception */ public String exportFile() throws Exception { String filename = filePrefix+"_"+MyUtil.getCurrentTimeStr() + ".xlsx"; File f = new File(filePath); if(!f.exists()){ f.mkdirs();//建立目錄 } File file = new File(filePath, filename); if(!file.exists()){ try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } FileOutputStream out = new FileOutputStream(filePath + filename); wb.write(out); out.flush(); out.close(); setFileAllPath(fileWebPath + filename); return fileWebPath + filename; } /** * 反射方法,通過get方法獲取物件屬性 * * @param owner * @param fieldname * @param args * @return * @throws Exception */ private Object invokeMethod(Object owner, String fieldname, Object[] args) throws Exception { String methodName = "get" + fieldname.substring(0, 1).toUpperCase() + fieldname.substring(1); Class ownerClass = owner.getClass(); Class[] argsClass = new Class[args.length]; for (int i = 0, j = args.length; i < j; i++) { argsClass[i] = args[i].getClass(); } Method method = ownerClass.getMethod(methodName, argsClass); return method.invoke(owner, args); } public SXSSFWorkbook getWb() { return wb; } public void setWb(SXSSFWorkbook wb) { this.wb = wb; } public Sheet getSh() { return sh; } public void setSh(Sheet sh) { this.sh = sh; } public int getFlushRows() { return flushRows; } public void setFlushRows(int flushRows) { this.flushRows = flushRows; } public String getFilePath() { return filePath; } public void setFilePath(String filePath) { this.filePath = filePath; } public String getFileWebPath() { return fileWebPath; } public void setFileWebPath(String fileWebPath) { this.fileWebPath = fileWebPath; } public List<String> getFieldNames() { return fieldNames; } public void setFieldNames(List<String> fieldNames) { this.fieldNames = fieldNames; } public List<String> getFieldCodes() { return fieldCodes; } public void setFieldCodes(List<String> fieldCodes) { this.fieldCodes = fieldCodes; } public int getRownum() { return rownum; } public String getFilePrefix() { return filePrefix; } public void setFilePrefix(String filePrefix) { this.filePrefix = filePrefix; } public int getColnum() { return colnum; } public String getFileAllPath() { return fileAllPath; } public void setFileAllPath(String fileAllPath) { this.fileAllPath = fileAllPath; } public static void main(String[] args) throws Exception { /** 匯出檔案存放物理路徑 * @param fileWebPath * 匯出檔案web下載路徑 * @param filePrefix * 匯出檔名的字首 * @param flushRows * 存放在記憶體的資料量 * @param fieldNames * 匯出檔案列標題 * @param fieldCodes * 匯出資料物件的欄位名稱 * @param flushRows*/ //匯出檔案存放的路徑,並且是虛擬目錄指向的路徑 String filePath = "d:/upload/linshi/"; //匯出檔案的字首 String filePrefix="ypxx"; //-1表示關閉自動重新整理,手動控制寫磁碟的時機,其它資料表示多少資料在記憶體儲存,超過的則寫入磁碟 int flushRows=100; //指導匯出資料的title List<String> fieldNames=new ArrayList<String>(); fieldNames.add("流水號"); fieldNames.add("通用名"); fieldNames.add("價格"); //告訴匯出類資料list中物件的屬性,讓ExcelExportSXXSSF通過反射獲取物件的值 List<String> fieldCodes=new ArrayList<String>(); fieldCodes.add("bm");//藥品流水號 fieldCodes.add("mc");//通用名 fieldCodes.add("price");//價格 //注意:fieldCodes和fieldNames個數必須相同且屬性和title順序一一對應,這樣title和內容才一一對應 //開始匯出,執行一些workbook及sheet等物件的初始建立 ExcelExportSXXSSF excelExportSXXSSF = ExcelExportSXXSSF.start(filePath, "/upload/", filePrefix, fieldNames, fieldCodes, flushRows); //準備匯出的資料,將資料存入list,且list中物件的欄位名稱必須是剛才傳入ExcelExportSXXSSF的名稱 List<Ypxx> list = new ArrayList<Ypxx>(); Ypxx ypxx1 = new Ypxx("001", "青黴素", 5); Ypxx ypxx2 = new Ypxx("002", "感冒膠囊", 2.5f); list.add(ypxx1); list.add(ypxx2); //執行匯出 excelExportSXXSSF.writeDatasByObject(list); //輸出檔案,返回下載檔案的http地址 String webpath = excelExportSXXSSF.exportFile(); System.out.println(webpath); } }