一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

用jXLS和poi導(dǎo)出Excel

 dtl樂學(xué)館 2015-01-28

apache的poi提供了支持MS Office文檔操作的java API。jXLS則是基于poi提供了支持Excel模版操作的API。

jXLS的主頁是:http://jxls.,似乎國內(nèi)不能訪問,需要代理。

 

下面是一些例子,以及我對導(dǎo)出到多個sheet的一個封裝。

先定義一個模版:



 這里的jxls tag和JSP的tag很像,varStatus是本次循環(huán)變量。

jxls提供了一個最簡單的接口:

void net.sf.jxls.transformer.XLSTransformer.transformXLS(String srcFilePath, Map beanParams, String destFilePath) throws ParsePropertyException, IOException, InvalidFormatException

 

Java代碼 復(fù)制代碼 收藏代碼
  1. String srcFilePath = "E:\\tmp\\template-simple.xlsx";   
  2. Map<String, Object> beanParams = new HashMap<String, Object>();   
  3. List<VM> vms = new ArrayList<VM>();   
  4. VM vm = new VM();   
  5. vm.setName("我的CENTOS");   
  6. vm.setPrice(103);   
  7. vm.setScale("2CPU, 2G MEM, 2T DISK");   
  8. vm.setCreated(new Date());   
  9. vms.add(vm);   
  10. VM vm2 = new VM();   
  11. vm2.setName("my-ubuntu");   
  12. vm2.setPrice(200);   
  13. vm2.setScale("1CPU, 3G MEM, 1T DISK");   
  14. vm2.setCreated(new Date());   
  15. vms.add(vm2);   
  16. beanParams.put("vms", vms);   
  17.   
  18. String destFilePath = "E:\\tmp\\simple.xlsx";   
  19.   
  20. XLSTransformer transformer = new XLSTransformer();   
  21. transformer.transformXLS(srcFilePath, beanParams, destFilePath);  

執(zhí)行結(jié)果:


 

jXLS提供了很多方法,支持很復(fù)雜的表格生成。

但如果要指定在一個sheet最大行數(shù),不是很方便,我包裝了一個util方法:

Java代碼 復(fù)制代碼 收藏代碼
  1. package org.jamee.demo.poiexcel;   
  2.   
  3. import java.io.FileInputStream;   
  4. import java.io.FileOutputStream;   
  5. import java.io.InputStream;   
  6. import java.io.OutputStream;   
  7. import java.util.ArrayList;   
  8. import java.util.HashMap;   
  9. import java.util.List;   
  10. import java.util.Map;   
  11.   
  12. import net.sf.jxls.transformer.XLSTransformer;   
  13.   
  14. import org.apache.poi.ss.usermodel.Workbook;   
  15.   
  16. public class ExcelUtil {   
  17.     private static final String DEFAULT_SHEET_NAME = "sheet";   
  18.   
  19.     /**  
  20.      * 導(dǎo)出無動態(tài)表頭的Excel文件  
  21.      * <p>  
  22.      * 參考重載的有動態(tài)表頭注釋  
  23.      * </p>  
  24.      * @param destOutputStream  
  25.      * @param templateInputStream  
  26.      * @param data  
  27.      * @param dataKey  
  28.      * @param maxRowPerSheet  
  29.      * @throws Exception  
  30.      */  
  31.     @SuppressWarnings("rawtypes")   
  32.     public static void generateExcelByTemplate(OutputStream destOutputStream,    
  33.             InputStream templateInputStream,    
  34.             List data, String dataKey,   
  35.             int maxRowPerSheet) throws Exception {   
  36.         generateExcelByTemplate(destOutputStream,   
  37.                 templateInputStream,   
  38.                 nullnull,   
  39.                 data, dataKey,   
  40.                 maxRowPerSheet);   
  41.     }   
  42.   
  43.     /**  
  44.      * 通過Excel模版生成Excel文件  
  45.      * <p>  
  46.      * 創(chuàng)建Excel模版,變量類似JSP tag風(fēng)格。  
  47.      * 例如:  
  48.      * <ul>  
  49.      * <li>無動態(tài)表頭  
  50.      * <pre>  
  51.      * 序號   名稱  規(guī)格  創(chuàng)建時間    價格  
  52.      * <jx:forEach items="${vms}" var="vm">  
  53.      * ${vm.id} ${vm.name} ${vm.scale} ${vm.created} ${vm.price}  
  54.      * </jx:forEach>  
  55.      * </pre>  
  56.      * </li>  
  57.      * <li>有動態(tài)表頭  
  58.      * <pre>  
  59.      * 項目/數(shù)量/時間    <jx:forEach items="${dates}" var="date">    ${date} </jx:forEach>  
  60.      * <jx:forEach items="${itemsx}" var="item">              
  61.      * ${item.name}    <jx:forEach items="${item.counts}" var="count"> ${count}    </jx:forEach>  
  62.      * </jx:forEach>             
  63.      * </pre>  
  64.      * </li>  
  65.      * </ul>  
  66.      * 調(diào)用該方法則生成對應(yīng)的Excel文件。  
  67.      * </p>  
  68.      * <p>  
  69.      * 注意:dataKey不能是items, items是保留字,如果用items則會提示:Collection is null并拋出NullPointerException  
  70.      * </p>  
  71.      * @param destOutputStream Excel輸出流  
  72.      * @param templateInputStream Excel模版輸入流  
  73.      * @param header 動態(tài)表頭  
  74.      * @param headerKey 表頭的變量  
  75.      * @param data 數(shù)據(jù)項  
  76.      * @param dataKey 數(shù)據(jù)項變量  
  77.      * @param maxRowPerSheet 每個sheet最多行數(shù)  
  78.      * @throws Exception  
  79.      */  
  80.     @SuppressWarnings("rawtypes")   
  81.     public static void generateExcelByTemplate(OutputStream destOutputStream,    
  82.             InputStream templateInputStream,    
  83.             List header, String headerKey,   
  84.             List data, String dataKey,   
  85.             int maxRowPerSheet) throws Exception {   
  86.   
  87.         List<List> splitData = null;   
  88.         @SuppressWarnings("unchecked")   
  89.         Map<String, List> beanMap = new HashMap();   
  90.         List<String> sheetNames = new ArrayList<String>();   
  91.         if (data.size() > maxRowPerSheet) {   
  92.             splitData = splitList(data, maxRowPerSheet);   
  93.             sheetNames = new ArrayList<String>(splitData.size());   
  94.             for (int i = 0; i < splitData.size(); ++i) {   
  95.                 sheetNames.add(DEFAULT_SHEET_NAME  + i);   
  96.             }   
  97.         } else {   
  98.             splitData = new ArrayList<List>();   
  99.             sheetNames.add(DEFAULT_SHEET_NAME + 0);   
  100.             splitData.add(data);   
  101.         }   
  102.         if (null != header) {   
  103.             beanMap.put(headerKey, header);   
  104.         }   
  105.         XLSTransformer transformer = new XLSTransformer();   
  106.         Workbook workbook = transformer.transformMultipleSheetsList(   
  107.                 templateInputStream, splitData, sheetNames, dataKey, beanMap, 0);   
  108.         workbook.write(destOutputStream);   
  109.     }   
  110.   
  111.   
  112.     /**  
  113.      * 導(dǎo)出無動態(tài)表頭的Excel文件,目標文件和模版文件均為文件路徑  
  114.      * <p>  
  115.      * 參考重載的有動態(tài)表頭注釋  
  116.      * </p>  
  117.      * @param destFilePath  
  118.      * @param templateFilePath  
  119.      * @param data  
  120.      * @param dataKey  
  121.      * @param maxRowPerSheet  
  122.      * @throws Exception  
  123.      */  
  124.     @SuppressWarnings("rawtypes")   
  125.     public static void generateExcelByTemplate(String destFilePath,    
  126.             String templateFilePath,    
  127.             List data, String dataKey, int maxRowPerSheet) throws Exception {   
  128.         generateExcelByTemplate(destFilePath, templateFilePath, nullnull, data, dataKey, maxRowPerSheet);   
  129.     }   
  130.   
  131.     /**  
  132.      * 導(dǎo)出有動態(tài)表頭的Excel文件,目標文件和模版文件均為文件路徑  
  133.      * <p>  
  134.      * 參考重載的有動態(tài)表頭注釋  
  135.      * </p>  
  136.      * @param destFilePath  
  137.      * @param templateFilePath  
  138.      * @param header  
  139.      * @param headerKey  
  140.      * @param data  
  141.      * @param dataKey  
  142.      * @param maxRowPerSheet  
  143.      * @throws Exception  
  144.      */  
  145.     @SuppressWarnings("rawtypes")   
  146.     public static void generateExcelByTemplate(String destFilePath,    
  147.             String templateFilePath,    
  148.             List header, String headerKey,   
  149.             List data, String dataKey, int maxRowPerSheet) throws Exception {   
  150.         generateExcelByTemplate(new FileOutputStream(destFilePath),   
  151.                 new FileInputStream(templateFilePath),   
  152.                 header, headerKey,   
  153.                 data, dataKey, maxRowPerSheet);   
  154.     }   
  155.   
  156.     @SuppressWarnings({ "rawtypes""unchecked" })   
  157.     private static List<List> splitList(List data, int maxRowPerSheet) {   
  158.         List<List> splitData = new ArrayList<List>();   
  159.         List sdata = null;   
  160.         for (int i = 0; i < data.size(); ++i) {   
  161.             if (0 == i % maxRowPerSheet) {   
  162.                 if (null != sdata) {   
  163.                     splitData.add(sdata);   
  164.                 }   
  165.                 sdata = new ArrayList(maxRowPerSheet);   
  166.             }   
  167.             sdata.add(data.get(i));   
  168.         }   
  169.         if (0 != maxRowPerSheet % data.size()) {   
  170.             splitData.add(sdata);   
  171.         }   
  172.   
  173.         return splitData;   
  174.     }   
  175. }  

簡單

用法:

Java代碼 復(fù)制代碼 收藏代碼
  1.         List<VM> vms = new ArrayList<VM>();   
  2.         for (int i = 0; i < 21; ++i) {   
  3.             VM vma = new VM();   
  4.             vma.setId(i);   
  5.             vma.setName("我的CENTOS" + i);   
  6.             vma.setPrice(103);   
  7.             vma.setScale("2CPU, 2G MEM, 2T DISK");   
  8.             vma.setCreated(new Date());   
  9.             vms.add(vma);   
  10.         }    
  11. ExcelUtil.generateExcelByTemplate("E:\\tmp\\ex-sample.xlsx""E:\\tmp\\template-simple.xlsx", vms, "vms"10);  

 運行結(jié)果:



 可見有3個sheet生成。

 

接口中的動態(tài)表頭是指表頭是數(shù)據(jù)項中的字段,例如:日期,項目等。

例如下面這個模版:



 調(diào)用示例:

Java代碼 復(fù)制代碼 收藏代碼
  1.  List<String> dates = new ArrayList<String>();   
  2. int maxDates = 8;   
  3. for (int i = 0; i < maxDates ; ++i) {   
  4.     dates.add("2013-08-1" + i);   
  5. }   
  6. List<ItemCount> itemCounts = new ArrayList<ItemCount>();   
  7. for (int i = 0; i < 82; ++i) {   
  8.     ItemCount ic = new ItemCount();   
  9.     List<Integer> counts = new ArrayList<Integer>();   
  10.     for (int j = 0; j < maxDates; ++j) {   
  11.         counts.add(j);   
  12.     }   
  13.     ic.setCounts(counts);   
  14.     ic.setName("item" + i);   
  15.     itemCounts.add(ic);   
  16. }   
  17. ExcelUtil.generateExcelByTemplate("E:\\tmp\\ex-cpx.xlsx",    
  18.         "E:\\tmp\\template-matrix.xlsx", dates, "dates", itemCounts, "itemsx"12);  

 結(jié)果:



 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    色婷婷在线精品国自产拍| 国产又粗又爽又猛又黄的| 精品香蕉一区二区在线| 日本精品中文字幕人妻| 99久久精品国产日本| 国产一区国产二区在线视频 | 中文字幕区自拍偷拍区| 成人精品欧美一级乱黄| 激情国产白嫩美女在线观看| 欧洲日本亚洲一区二区| 精品国产亚洲av久一区二区三区| 99香蕉精品视频国产版| 东京热加勒比一区二区| 亚洲高清一区二区高清| 在线免费不卡亚洲国产| 精品熟女少妇av免费久久野外| 国产一区二区不卡在线视频| 国产精品成人一区二区三区夜夜夜| 日韩欧美国产三级在线观看| 九九热这里有精品20| 欧美日韩国内一区二区| 精品老司机视频在线观看| 五月情婷婷综合激情综合狠狠| 国产成人免费高潮激情电| 欧美精品一区久久精品| 91日韩欧美中文字幕| 内射精品欧美一区二区三区久久久| 欧美日韩国产二三四区| 99久久免费看国产精品| 久久精品视频就在久久| 欧美日本道一区二区三区| 深夜少妇一区二区三区| 人妻中文一区二区三区 | 欧美国产日本免费不卡| 欧美美女视频在线免费看| 性感少妇无套内射在线视频| 国产亚洲欧美自拍中文自拍| 高清一区二区三区四区五区| 中文字幕无线码一区欧美| 一区二区三区免费公开| 日韩精品一区二区三区四区|