JAVA利用jxls导出Excel

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA利用jxls导出Excel相关的知识,希望对你有一定的参考价值。

JAVA利用jxls导出Excel,本机测试没有问题,在客户的机器上部署,一直提示java.lang.NoClassDefFoundError: net/sf/jxls/transformer/XLSTransformer,但是查看部署的文件,是存在WEB-INF\lib\jxls-core-0.9.5.jar的,现在一点思路都没有,不知道什么地方出的问题,请各位大侠帮忙分析下有可能的原因,提供点思路,我再去查一下。Thanks!

参考技术A classpath设置是否有问题?如果jar包位置已经在classpath中,但是还出现问题,就可能是包次序问题,有相近的包冲突导致

请问你用jxls 导出2007格式的Excel搞定了没有?求解决方案

参考技术A 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, StringdestFilePath) throws ParsePropertyException, IOException, InvalidFormatException

Java代码
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代码
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>
* 序号 名称 规格 创建时间 价格
* <jx:forEach items="$vms" var="vm">
* $vm.id $vm.name $vm.scale $vm.created $vm.price
* </jx:forEach>
* </pre>
* </li>
* <li>有动态表头
* <pre>
* 项目/数量/时间 <jx:forEach items="$dates" var="date"> $date </jx:forEach>
* <jx:forEach items="$itemsx" var="item">
* $item.name <jx:forEach items="$item.counts" var="count"> $count </jx:forEach>
* </jx:forEach>
* </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代码
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代码
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);
结果:

以上是关于JAVA利用jxls导出Excel的主要内容,如果未能解决你的问题,请参考以下文章

使用jxls-poi导出excel

java/jsp JXLS 导出多sheet的excel

JXLS-----JXLS导出Excel

jxls用模板导出excel数据类型的问题

请问你用jxls 导出2007格式的Excel搞定了没有?求解决方案

JXLS 2.4.0系列教程——最简单的模板导出