用JXLS和poi导出Excel

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

jXLS的主页是:http://jxls.sourceforge.net,似乎国内不能访问,需要代理。

下面是一些例子,以及我对导出到多个sheet的一个封装。

先定义一个模版:

这里的jxls tag和JSP的tag很像,varStatus是本次循环变量。

jxls提供了一个最简单的接口:

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

public class VM {

	private String id;
	private String name;
	private String scale;
	private Date created;
	private Double price;

	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getScale() {
		return scale;
	}
	public void setScale(String scale) {
		this.scale = scale;
	}
	public Date getCreated() {
		return created;
	}
	public void setCreated(Date created) {
		this.created = created;
	}
	public Double getPrice() {
		return price;
	}
	public void setPrice(Double price) {
		this.price = price;
	}

}

Java代码  

  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. String destFilePath = "E:\\tmp\\simple.xlsx";
  18. XLSTransformer transformer = new XLSTransformer();
  19. transformer.transformXLS(srcFilePath, beanParams, destFilePath);
        String srcFilePath = "E:\\tmp\\template-simple.xlsx";
        Map<String, Object> beanParams = new HashMap<String, Object>();
        List<VM> vms = new ArrayList<VM>();
        VM vm = new VM();
        vm.setName("我的CENTOS");
        vm.setPrice(103);
        vm.setScale("2CPU, 2G MEM, 2T DISK");
        vm.setCreated(new Date());
        vms.add(vm);
        VM vm2 = new VM();
        vm2.setName("my-ubuntu");
        vm2.setPrice(200);
        vm2.setScale("1CPU, 3G MEM, 1T DISK");
        vm2.setCreated(new Date());
        vms.add(vm2);
        beanParams.put("vms", vms);

        String destFilePath = "E:\\tmp\\simple.xlsx";

        XLSTransformer transformer = new XLSTransformer();
        transformer.transformXLS(srcFilePath, beanParams, destFilePath);

执行结果:

jXLS提供了很多方法,支持很复杂的表格生成。

但如果要指定在一个sheet最大行数,不是很方便,我包装了一个util方法:

Java代码  

  1. package org.jamee.demo.poiexcel;
  2. import java.io.FileInputStream;
  3. import java.io.FileOutputStream;
  4. import java.io.InputStream;
  5. import java.io.OutputStream;
  6. import java.util.ArrayList;
  7. import java.util.HashMap;
  8. import java.util.List;
  9. import java.util.Map;
  10. import net.sf.jxls.transformer.XLSTransformer;
  11. import org.apache.poi.ss.usermodel.Workbook;
  12. public class ExcelUtil {
  13. private static final String DEFAULT_SHEET_NAME = "sheet";
  14. /**
  15. * 导出无动态表头的Excel文件
  16. * <p>
  17. * 参考重载的有动态表头注释
  18. * </p>
  19. * @param destOutputStream
  20. * @param templateInputStream
  21. * @param data
  22. * @param dataKey
  23. * @param maxRowPerSheet
  24. * @throws Exception
  25. */
  26. @SuppressWarnings("rawtypes")
  27. public static void generateExcelByTemplate(OutputStream destOutputStream,
  28. InputStream templateInputStream,
  29. List data, String dataKey,
  30. int maxRowPerSheet) throws Exception {
  31. generateExcelByTemplate(destOutputStream,
  32. templateInputStream,
  33. null, null,
  34. data, dataKey,
  35. maxRowPerSheet);
  36. }
  37. /**
  38. * 通过Excel模版生成Excel文件
  39. * <p>
  40. * 创建Excel模版,变量类似JSP tag风格。
  41. * 例如:
  42. * <ul>
  43. * <li>无动态表头
  44. * <pre>
  45. * 序号   名称  规格  创建时间    价格
  46. * &lt;jx:forEach items="${vms}" var="vm"&gt;
  47. * ${vm.id} ${vm.name} ${vm.scale} ${vm.created} ${vm.price}
  48. * &lt;/jx:forEach&gt;
  49. * </pre>
  50. * </li>
  51. * <li>有动态表头
  52. * <pre>
  53. * 项目/数量/时间    &lt;jx:forEach items="${dates}" var="date"&gt;    ${date} &lt;/jx:forEach&gt;
  54. * &lt;jx:forEach items="${itemsx}" var="item"&gt;
  55. * ${item.name}    &lt;jx:forEach items="${item.counts}" var="count"&gt; ${count}    &lt;/jx:forEach&gt;
  56. * &lt;/jx:forEach&gt;
  57. * </pre>
  58. * </li>
  59. * </ul>
  60. * 调用该方法则生成对应的Excel文件。
  61. * </p>
  62. * <p>
  63. * 注意:dataKey不能是items, items是保留字,如果用items则会提示:Collection is null并抛出NullPointerException
  64. * </p>
  65. * @param destOutputStream Excel输出流
  66. * @param templateInputStream Excel模版输入流
  67. * @param header 动态表头
  68. * @param headerKey 表头的变量
  69. * @param data 数据项
  70. * @param dataKey 数据项变量
  71. * @param maxRowPerSheet 每个sheet最多行数
  72. * @throws Exception
  73. */
  74. @SuppressWarnings("rawtypes")
  75. public static void generateExcelByTemplate(OutputStream destOutputStream,
  76. InputStream templateInputStream,
  77. List header, String headerKey,
  78. List data, String dataKey,
  79. int maxRowPerSheet) throws Exception {
  80. List<List> splitData = null;
  81. @SuppressWarnings("unchecked")
  82. Map<String, List> beanMap = new HashMap();
  83. List<String> sheetNames = new ArrayList<String>();
  84. if (data.size() > maxRowPerSheet) {
  85. splitData = splitList(data, maxRowPerSheet);
  86. sheetNames = new ArrayList<String>(splitData.size());
  87. for (int i = 0; i < splitData.size(); ++i) {
  88. sheetNames.add(DEFAULT_SHEET_NAME  + i);
  89. }
  90. } else {
  91. splitData = new ArrayList<List>();
  92. sheetNames.add(DEFAULT_SHEET_NAME + 0);
  93. splitData.add(data);
  94. }
  95. if (null != header) {
  96. beanMap.put(headerKey, header);
  97. }
  98. XLSTransformer transformer = new XLSTransformer();
  99. Workbook workbook = transformer.transformMultipleSheetsList(
  100. templateInputStream, splitData, sheetNames, dataKey, beanMap, 0);
  101. workbook.write(destOutputStream);
  102. }
  103. /**
  104. * 导出无动态表头的Excel文件,目标文件和模版文件均为文件路径
  105. * <p>
  106. * 参考重载的有动态表头注释
  107. * </p>
  108. * @param destFilePath
  109. * @param templateFilePath
  110. * @param data
  111. * @param dataKey
  112. * @param maxRowPerSheet
  113. * @throws Exception
  114. */
  115. @SuppressWarnings("rawtypes")
  116. public static void generateExcelByTemplate(String destFilePath,
  117. String templateFilePath,
  118. List data, String dataKey, int maxRowPerSheet) throws Exception {
  119. generateExcelByTemplate(destFilePath, templateFilePath, null, null, data, dataKey, maxRowPerSheet);
  120. }
  121. /**
  122. * 导出有动态表头的Excel文件,目标文件和模版文件均为文件路径
  123. * <p>
  124. * 参考重载的有动态表头注释
  125. * </p>
  126. * @param destFilePath
  127. * @param templateFilePath
  128. * @param header
  129. * @param headerKey
  130. * @param data
  131. * @param dataKey
  132. * @param maxRowPerSheet
  133. * @throws Exception
  134. */
  135. @SuppressWarnings("rawtypes")
  136. public static void generateExcelByTemplate(String destFilePath,
  137. String templateFilePath,
  138. List header, String headerKey,
  139. List data, String dataKey, int maxRowPerSheet) throws Exception {
  140. generateExcelByTemplate(new FileOutputStream(destFilePath),
  141. new FileInputStream(templateFilePath),
  142. header, headerKey,
  143. data, dataKey, maxRowPerSheet);
  144. }
  145. @SuppressWarnings({ "rawtypes", "unchecked" })
  146. private static List<List> splitList(List data, int maxRowPerSheet) {
  147. List<List> splitData = new ArrayList<List>();
  148. List sdata = null;
  149. for (int i = 0; i < data.size(); ++i) {
  150. if (0 == i % maxRowPerSheet) {
  151. if (null != sdata) {
  152. splitData.add(sdata);
  153. }
  154. sdata = new ArrayList(maxRowPerSheet);
  155. }
  156. sdata.add(data.get(i));
  157. }
  158. if (0 != maxRowPerSheet % data.size()) {
  159. splitData.add(sdata);
  160. }
  161. return splitData;
  162. }
  163. }
package org.jamee.demo.poiexcel;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jxls.transformer.XLSTransformer;

import org.apache.poi.ss.usermodel.Workbook;

public class ExcelUtil {
    private static final String DEFAULT_SHEET_NAME = "sheet";

    /**
     * 导出无动态表头的Excel文件
     * <p>
     * 参考重载的有动态表头注释
     * </p>
     * @param destOutputStream
     * @param templateInputStream
     * @param data
     * @param dataKey
     * @param maxRowPerSheet
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static void generateExcelByTemplate(OutputStream destOutputStream,
            InputStream templateInputStream,
            List data, String dataKey,
            int maxRowPerSheet) throws Exception {
        generateExcelByTemplate(destOutputStream,
                templateInputStream,
                null, null,
                data, dataKey,
                maxRowPerSheet);
    }

    /**
     * 通过Excel模版生成Excel文件
     * <p>
     * 创建Excel模版,变量类似JSP tag风格。
     * 例如:
     * <ul>
     * <li>无动态表头
     * <pre>
     * 序号   名称  规格  创建时间    价格
     * &lt;jx:forEach items="${vms}" var="vm"&gt;
     * ${vm.id} ${vm.name} ${vm.scale} ${vm.created} ${vm.price}
     * &lt;/jx:forEach&gt;
     * </pre>
     * </li>
     * <li>有动态表头
     * <pre>
     * 项目/数量/时间    &lt;jx:forEach items="${dates}" var="date"&gt;    ${date} &lt;/jx:forEach&gt;
     * &lt;jx:forEach items="${itemsx}" var="item"&gt;
     * ${item.name}    &lt;jx:forEach items="${item.counts}" var="count"&gt; ${count}    &lt;/jx:forEach&gt;
     * &lt;/jx:forEach&gt;
     * </pre>
     * </li>
     * </ul>
     * 调用该方法则生成对应的Excel文件。
     * </p>
     * <p>
     * 注意:dataKey不能是items, items是保留字,如果用items则会提示:Collection is null并抛出NullPointerException
     * </p>
     * @param destOutputStream Excel输出流
     * @param templateInputStream Excel模版输入流
     * @param header 动态表头
     * @param headerKey 表头的变量
     * @param data 数据项
     * @param dataKey 数据项变量
     * @param maxRowPerSheet 每个sheet最多行数
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static void generateExcelByTemplate(OutputStream destOutputStream,
            InputStream templateInputStream,
            List header, String headerKey,
            List data, String dataKey,
            int maxRowPerSheet) throws Exception {

        List<List> splitData = null;
        @SuppressWarnings("unchecked")
        Map<String, List> beanMap = new HashMap();
        List<String> sheetNames = new ArrayList<String>();
        if (data.size() > maxRowPerSheet) {
            splitData = splitList(data, maxRowPerSheet);
            sheetNames = new ArrayList<String>(splitData.size());
            for (int i = 0; i < splitData.size(); ++i) {
                sheetNames.add(DEFAULT_SHEET_NAME  + i);
            }
        } else {
            splitData = new ArrayList<List>();
            sheetNames.add(DEFAULT_SHEET_NAME + 0);
            splitData.add(data);
        }
        if (null != header) {
            beanMap.put(headerKey, header);
        }
        XLSTransformer transformer = new XLSTransformer();
        Workbook workbook = transformer.transformMultipleSheetsList(
                templateInputStream, splitData, sheetNames, dataKey, beanMap, 0);
        workbook.write(destOutputStream);
    }

    /**
     * 导出无动态表头的Excel文件,目标文件和模版文件均为文件路径
     * <p>
     * 参考重载的有动态表头注释
     * </p>
     * @param destFilePath
     * @param templateFilePath
     * @param data
     * @param dataKey
     * @param maxRowPerSheet
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static void generateExcelByTemplate(String destFilePath,
            String templateFilePath,
            List data, String dataKey, int maxRowPerSheet) throws Exception {
        generateExcelByTemplate(destFilePath, templateFilePath, null, null, data, dataKey, maxRowPerSheet);
    }

    /**
     * 导出有动态表头的Excel文件,目标文件和模版文件均为文件路径
     * <p>
     * 参考重载的有动态表头注释
     * </p>
     * @param destFilePath
     * @param templateFilePath
     * @param header
     * @param headerKey
     * @param data
     * @param dataKey
     * @param maxRowPerSheet
     * @throws Exception
     */
    @SuppressWarnings("rawtypes")
    public static void generateExcelByTemplate(String destFilePath,
            String templateFilePath,
            List header, String headerKey,
            List data, String dataKey, int maxRowPerSheet) throws Exception {
        generateExcelByTemplate(new FileOutputStream(destFilePath),
                new FileInputStream(templateFilePath),
                header, headerKey,
                data, dataKey, maxRowPerSheet);
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    private static List<List> splitList(List data, int maxRowPerSheet) {
        List<List> splitData = new ArrayList<List>();
        List sdata = null;
        for (int i = 0; i < data.size(); ++i) {
            if (0 == i % maxRowPerSheet) {
                if (null != sdata) {
                    splitData.add(sdata);
                }
                sdata = new ArrayList(maxRowPerSheet);
            }
            sdata.add(data.get(i));
        }
        if (0 != maxRowPerSheet % data.size()) {
            splitData.add(sdata);
        }

        return splitData;
    }
}

简单用法:

Java代码  

  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);
        List<VM> vms = new ArrayList<VM>();
        for (int i = 0; i < 21; ++i) {
            VM vma = new VM();
            vma.setId(i);
            vma.setName("我的CENTOS" + i);
            vma.setPrice(103);
            vma.setScale("2CPU, 2G MEM, 2T DISK");
            vma.setCreated(new Date());
            vms.add(vma);
        } 
ExcelUtil.generateExcelByTemplate("E:\\tmp\\ex-sample.xlsx", "E:\\tmp\\template-simple.xlsx", vms, "vms", 10);

运行结果:

可见有3个sheet生成。

接口中的动态表头是指表头是数据项中的字段,例如:日期,项目等。

例如下面这个模版:

调用示例:

Java代码  

  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);
         List<String> dates = new ArrayList<String>();
        int maxDates = 8;
        for (int i = 0; i < maxDates ; ++i) {
            dates.add("2013-08-1" + i);
        }
        List<ItemCount> itemCounts = new ArrayList<ItemCount>();
        for (int i = 0; i < 82; ++i) {
            ItemCount ic = new ItemCount();
            List<Integer> counts = new ArrayList<Integer>();
            for (int j = 0; j < maxDates; ++j) {
                counts.add(j);
            }
            ic.setCounts(counts);
            ic.setName("item" + i);
            itemCounts.add(ic);
        }
        ExcelUtil.generateExcelByTemplate("E:\\tmp\\ex-cpx.xlsx",
                "E:\\tmp\\template-matrix.xlsx", dates, "dates", itemCounts, "itemsx", 12);

结果:

时间: 2024-08-30 14:17:00

用JXLS和poi导出Excel的相关文章

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

POI导出EXCEL经典实现

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach

POI导出EXCEL经典实现(转)

http://www.cnblogs.com/xwdreamer/archive/2011/07/20/2296975.html 1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 POI 的功能. 2.POI结构 HSSF - 提供读写Microsoft Excel XLS格式档案的功能.XS

JAVA关于POI导出Excel内存溢出的解决方案

JAVA关于POI导出Excel内存溢出的解决方案 在我们使用JAVA开发过程中,经常要导出查询获得的数据,这些数据一般情况下都是以Excel存储的,因此我们在导出数据的时候要使用JAVA的POI库,其主要是对各种windows平台的数据格式进行操作,在这里,我们是对Excel操作. 生成Excel的过程原理是这样的,首先,我们对数据库进行查询,获取相应的结果集,一般是list集合,然后生成Workbook对象,根据生成的Workbook对象获取sheet对象,根据此sheet对象获取Row对象

用POI导出excel时,较长的数字不想被自动变为科学计数法的解决方式(转)

做过很多次导出excel了.都碰到一个问题,内容里如果包含一个比较长的数字,比如订单号“2546541656596”,excel会自动变成科学计数法... 弄过好几次都没有解决,最近又要导出excel了,下决心一定要找到解决办法 自己在excel里测试过,较长的数字,都会自动变成科学计数法,除非我们把单元格格式设置成“文本型” 哈哈,似乎找到了思路:用poi先把单元格设置成“文本型”就可以了把. 从文档里找到了这个方法HSSFCell.setCellType(int type),怎么看这个方法都

poi导出excel

Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能,介绍poi导出excel功能实现案例,算比较常用的功能实现以及导出excel需要注意的地方,采用的是poi-3.8-20120326.jar,poi-ooxml-3.8-20120326.jar,poi-scratchpad-3.8-20120326.jar 输出表格 poi输出excel最基本是输

Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach

使用poi导出Excel

很多时候,一个软件应用程序需要生成Microsoft Excel文件格式的报告.有时,一个应用程序甚至希望将Excel文件作为输入数据. 常见的java Excel  API Java Aspose Cells Java Aspose Cells 是一种纯粹的Java授权的Excel API,开发和供应商Aspose发布.这个API的最新版本是8.1.2,发布于2014年7月,是一个丰富而厚重的API(普通Java类和AWT类的组合)设计,可以读.写和操纵电子表格Excel的组件.此API常见用

POI导出EXCEL文档

package com.wiseweb.util.excel; import java.io.*; import java.util.*; import javax.swing.JOptionPane; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import com.wiseweb.pom.entity.BaiinfoPriceTime; public class Expo