用jXLS和poi导出Excel poi导出excel
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) throws ParsePropertyException, IOException, InvalidFormatException
Java代码
StringsrcFilePath="E:\tmp\template-simple.xlsx";
Map<String,Object>beanParams=newHashMap<String,Object>();
List<VM>vms=newArrayList<VM>();
VMvm=newVM();
vm.setName("我的CENTOS");
vm.setPrice(103);
vm.setScale("2CPU,2GMEM,2TDISK");
vm.setCreated(newDate());
vms.add(vm);
VMvm2=newVM();
vm2.setName("my-ubuntu");
vm2.setPrice(200);
vm2.setScale("1CPU,3GMEM,1TDISK");
vm2.setCreated(newDate());
vms.add(vm2);
beanParams.put("vms",vms);
StringdestFilePath="E:\tmp\simple.xlsx";
XLSTransformertransformer=newXLSTransformer();
transformer.transformXLS(srcFilePath,beanParams,destFilePath);
执行结果:
jXLS提供了很多方法,支持很复杂的表格生成。
但如果要指定在一个sheet最大行数,不是很方便,我包装了一个util方法:
Java代码
packageorg.jamee.demo.poiexcel;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importnet.sf.jxls.transformer.XLSTransformer;
importorg.apache.poi.ss.usermodel.Workbook;
publicclassExcelUtil{
privatestaticfinalStringDEFAULT_SHEET_NAME="sheet";
/**
*导出无动态表头的Excel文件
*<p>
*参考重载的有动态表头注释
*</p>
*@paramdestOutputStream
*@paramtemplateInputStream
*@paramdata
*@paramdataKey
*@parammaxRowPerSheet
*@throwsException
*/
@SuppressWarnings("rawtypes")
publicstaticvoidgenerateExcelByTemplate(OutputStreamdestOutputStream,
InputStreamtemplateInputStream,
Listdata,StringdataKey,
intmaxRowPerSheet)throwsException{
generateExcelByTemplate(destOutputStream,
templateInputStream,
null,null,
data,dataKey,
maxRowPerSheet);
}
/**
*通过Excel模版生成Excel文件
*<p>
*创建Excel模版,变量类似JSPtag风格。
*例如:
*<ul>
*<li>无动态表头
*<pre>
*序号名称规格创建时间价格
*<jx:forEachitems="${vms}"var="vm">
*${vm.id}${vm.name}${vm.scale}${vm.created}${vm.price}
*</jx:forEach>
*</pre>
*</li>
*<li>有动态表头
*<pre>
*项目/数量/时间<jx:forEachitems="${dates}"var="date">${date}</jx:forEach>
*<jx:forEachitems="${itemsx}"var="item">
*${item.name}<jx:forEachitems="${item.counts}"var="count">${count}</jx:forEach>
*</jx:forEach>
*</pre>
*</li>
*</ul>
*调用该方法则生成对应的Excel文件。
*</p>
*<p>
*注意:dataKey不能是items,items是保留字,如果用items则会提示:Collectionisnull并抛出NullPointerException
*</p>
*@paramdestOutputStreamExcel输出流
*@paramtemplateInputStreamExcel模版输入流
*@paramheader动态表头
*@paramheaderKey表头的变量
*@paramdata数据项
*@paramdataKey数据项变量
*@parammaxRowPerSheet每个sheet最多行数
*@throwsException
*/
@SuppressWarnings("rawtypes")
publicstaticvoidgenerateExcelByTemplate(OutputStreamdestOutputStream,
InputStreamtemplateInputStream,
Listheader,StringheaderKey,
Listdata,StringdataKey,
intmaxRowPerSheet)throwsException{
List<List>splitData=null;
@SuppressWarnings("unchecked")
Map<String,List>beanMap=newHashMap();
List<String>sheetNames=newArrayList<String>();
if(data.size()>maxRowPerSheet){
splitData=splitList(data,maxRowPerSheet);
sheetNames=newArrayList<String>(splitData.size());
for(inti=0;i<splitData.size();++i){
sheetNames.add(DEFAULT_SHEET_NAME+i);
}
}else{
splitData=newArrayList<List>();
sheetNames.add(DEFAULT_SHEET_NAME+0);
splitData.add(data);
}
if(null!=header){
beanMap.put(headerKey,header);
}
XLSTransformertransformer=newXLSTransformer();
Workbookworkbook=transformer.transformMultipleSheetsList(
templateInputStream,splitData,sheetNames,dataKey,beanMap,0);
workbook.write(destOutputStream);
}
/**
*导出无动态表头的Excel文件,目标文件和模版文件均为文件路径
*<p>
*参考重载的有动态表头注释
*</p>
*@paramdestFilePath
*@paramtemplateFilePath
*@paramdata
*@paramdataKey
*@parammaxRowPerSheet
*@throwsException
*/
@SuppressWarnings("rawtypes")
publicstaticvoidgenerateExcelByTemplate(StringdestFilePath,
StringtemplateFilePath,
Listdata,StringdataKey,intmaxRowPerSheet)throwsException{
generateExcelByTemplate(destFilePath,templateFilePath,null,null,data,dataKey,maxRowPerSheet);
}
/**
*导出有动态表头的Excel文件,目标文件和模版文件均为文件路径
*<p>
*参考重载的有动态表头注释
*</p>
*@paramdestFilePath
*@paramtemplateFilePath
*@paramheader
*@paramheaderKey
*@paramdata
*@paramdataKey
*@parammaxRowPerSheet
*@throwsException
*/
@SuppressWarnings("rawtypes")
publicstaticvoidgenerateExcelByTemplate(StringdestFilePath,
StringtemplateFilePath,
Listheader,StringheaderKey,
Listdata,StringdataKey,intmaxRowPerSheet)throwsException{
generateExcelByTemplate(newFileOutputStream(destFilePath),
newFileInputStream(templateFilePath),
header,headerKey,
data,dataKey,maxRowPerSheet);
}
@SuppressWarnings({"rawtypes","unchecked"})
privatestaticList<List>splitList(Listdata,intmaxRowPerSheet){
List<List>splitData=newArrayList<List>();
Listsdata=null;
for(inti=0;i<data.size();++i){
if(0==i%maxRowPerSheet){
if(null!=sdata){
splitData.add(sdata);
}
sdata=newArrayList(maxRowPerSheet);
}
sdata.add(data.get(i));
}
if(0!=maxRowPerSheet%data.size()){
splitData.add(sdata);
}
returnsplitData;
}
}
简单
用法:
Java代码
List<VM>vms=newArrayList<VM>();
for(inti=0;i<21;++i){
VMvma=newVM();
vma.setId(i);
vma.setName("我的CENTOS"+i);
vma.setPrice(103);
vma.setScale("2CPU,2GMEM,2TDISK");
vma.setCreated(newDate());
vms.add(vma);
}
ExcelUtil.generateExcelByTemplate("E:\tmp\ex-sample.xlsx","E:\tmp\template-simple.xlsx",vms,"vms",10);
运行结果:
可见有3个sheet生成。
接口中的动态表头是指表头是数据项中的字段,例如:日期,项目等。
例如下面这个模版:
调用示例:
Java代码
List<String>dates=newArrayList<String>();
intmaxDates=8;
for(inti=0;i<maxDates;++i){
dates.add("2013-08-1"+i);
}
List<ItemCount>itemCounts=newArrayList<ItemCount>();
for(inti=0;i<82;++i){
ItemCountic=newItemCount();
List<Integer>counts=newArrayList<Integer>();
for(intj=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);
结果:
更多阅读
化妆水柔肤水怎么用 柔肤水和化妆水区别
化妆水柔肤水怎么用——简介柔肤水是指PH值接近于7的较温和的化妆水。专家给出以下建议,油性皮肤使用紧肤水,健康皮肤使用爽肤水,干性皮肤使用柔肤水。对混合皮肤来说,T区使用紧肤水,其它部位使用柔肤水和爽肤水皆可。敏感皮肤则可以选用
用PhotoShop和ImageReady制作Gif动画图解 精 photoshop imageready
相信大多数人都看到过各大网站首页都有不断切换的动画图片宣传效果很不错,但是苦于自己不是电脑专业,不能设计。在这里,我就教大家怎么制作简单的两帧Gif动画。(特别适合网站编辑人员吆) 首先,要选定想要切换播放的背景图片两张。用Pho
用圆规和直尺画出的美丽图案四 只用圆规画出美丽图案
用圆规和直尺画出的美丽图案(四)——简介用圆规和直尺可以画出很多美丽的图案,现在再给朋友展现一个图案的制作过程。用圆规和直尺画出的美丽图案(四)——工具/原料圆规 直尺 橡皮用圆规和直尺画出的美丽图案(四)——方法/步骤用圆规和直
古方妙用阳和汤 阳和汤方歌
治疗阳虚失眠症 中医汤方的名称,有的就是定义。定义的意思就是用最少数的字,表达这个词的全部意义。阳和汤只有三个字,表达什么意义呢? 中医治病讲阴阳平衡。阳和,就是用阳气来讲和。生了病,阳气不足,阴寒就盛起来了,叫做阴盛阳衰,变生出很
用Python和OpenCV创建一个图片搜索引擎的完整指南 - Python - 伯 考研指南完整版
本文由 伯乐在线 - Daetalus 翻译,sunbiaobiao 校稿。未经许可,禁止转载!英文出处:www.pyimagesearch.com。欢迎加入翻译小组。大家都知道,通过文本或标签来搜索图片的体验非常糟糕。无论你是将个人照片贴标签并分类,或是在公司的网站上搜