title) { this.title = title; }}推荐:
[ 最近项⽬中⽤到⼤数据量导出功能.不能确定到底有多⼤,最少⼗来万条记录. 100M的excel⽂件,excel2003已经不能够打开了,只能⽤2007版.不知道后期数据量更⼤模版⽂件(通⽤):excel 头模板
xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:html=\"http://www.w3.org/TR/REC-html40\"> 1996-12-17T01:32:42Z2013-08-02T09:21:24Z 11.9999
4530 8505 480 120 False False
body模板:
$worksheet:{
$it.title:{$it$ | }$
$it.rows:{ $it.result:{$it$ | }$
}$
}$
实际处理类:传⼊list对象,利⽤反射获取对象属性名及属性值
long startTimne = System.currentTimeMillis();
StringTemplateGroup stGroup = new StringTemplateGroup(\"stringTemplate\");
//写⼊excel⽂件头部信息
StringTemplate head = stGroup.getInstanceOf(\"head\"); File file = new File(\"D:/output2.xls\");
PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream(file))); writer.print(head.toString()); writer.flush();
int totalRowNum = listWinningRecordDTOList.size(); int maxRowNum = 60000;
int sheets = totalRowNum % 60000 == 0 ? (totalRowNum/maxRowNum) : (totalRowNum/maxRowNum +1); //excel单表最⼤⾏数是65535
List record = listWinningRecordDTOList; List title = new ArrayList();List getMethods = new ArrayList(); Class> clazz = record.get(0).getClass();Field[] fields = clazz.getDeclaredFields(); if(fields != null && fields.length > 0){ for(Field field : fields){
if(!\"serialVersionUID\".equals(field.getName())) { title.add(field.getName());
getMethods.add(clazz.getDeclaredMethod(\"get\" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1))); } } }
// BeanInfo beanInfo=Introspector.getBeanInfo(clazz,Object.class);
// PropertyDescriptor[] proDescrtptors=beanInfo.getPropertyDescriptors();// for(PropertyDescriptor propertyDescriptor : proDescrtptors){// title.add(propertyDescriptor.getName());
// getMethods.add(propertyDescriptor.getReadMethod());// }
int columnLength = title.size();
SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\"); //写⼊excel⽂件数据信息 for(int i=0;iStringTemplate body = stGroup.getInstanceOf(\"body\"); Worksheet worksheet = new Worksheet(); worksheet.setTitle(title);worksheet.setSheet(\" \"+(i+1)+\" \");
worksheet.setColumnNum(columnLength); worksheet.setRowNum(maxRowNum+1); List rows = new ArrayList(); int startIndex = i*maxRowNum;int endIndex = Math.min((i+1)*maxRowNum -1,totalRowNum-1); for(int j=startIndex;j<=endIndex;j++){ Row row = new Row();
List result = new ArrayList(columnLength); for(int n=0;nObject value = getMethods.get(n).invoke(record.get(j)); if(value == null){ result.add(\"\"); }else{if(value instanceof Date){
result.add(sdf.format((Date)value)); }else{
result.add(value.toString()); } }
}
row.setResult(result); rows.add(row); }
worksheet.setRows(rows);
body.setAttribute(\"worksheet\ writer.print(body.toString()); writer.flush(); rows.clear(); rows = null;
worksheet = null; body = null;
Runtime.getRuntime().gc();
System.out.println(\"正在⽣成excel⽂件的 sheet\"+(i+1)); }
//写⼊excel⽂件尾部
writer.print(\"
\"); writer.flush(); writer.close();
System.out.println(\"⽣成excel⽂件完成\"); long endTime = System.currentTimeMillis();
System.out.println(\"⽤时=\"+((endTime-startTimne)/1000)+\"秒\");
整理后的公⽤类:
import org.antlr.stringtemplate.StringTemplate;
import org.antlr.stringtemplate.StringTemplateGroup;import java.io.*;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;
/**
* Created by Administrator on 2016/2/25. */
public class ExcelStUtil {
public static void export(OutputStream outputStream,List target) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { long startTime = System.currentTimeMillis();
StringTemplateGroup stGroup = new StringTemplateGroup(\"stringTemplate\"); //解决可能发⽣的中⽂乱码
stGroup.setFileCharEncoding(\"UTF-8\"); //写⼊excel⽂件头部信息
StringTemplate head = stGroup.getInstanceOf(\"st/head\");
PrintWriter writer = new PrintWriter(new BufferedOutputStream(outputStream)); writer.print(head.toString()); writer.flush();
int totalRowNum = target.size(); int maxRowNum = 60000;
int sheets = totalRowNum % 60000 == 0 ? (totalRowNum/maxRowNum) : (totalRowNum/maxRowNum +1); //excel单表最⼤⾏数是65535
List record = target;
List title = new ArrayList();List getMethods = new ArrayList(); Class> clazz = record.get(0).getClass();Field[] fields = clazz.getDeclaredFields(); if(fields != null && fields.length > 0){ for(Field field : fields){
if(!\"serialVersionUID\".equals(field.getName())) { title.add(field.getName());
getMethods.add(clazz.getDeclaredMethod(\"get\" + field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1))); } } }
// BeanInfo beanInfo=Introspector.getBeanInfo(clazz,Object.class);
// PropertyDescriptor[] proDescrtptors=beanInfo.getPropertyDescriptors();// for(PropertyDescriptor propertyDescriptor : proDescrtptors){// title.add(propertyDescriptor.getName());
// getMethods.add(propertyDescriptor.getReadMethod());// }
int columnLength = title.size();
SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\"); //写⼊excel⽂件数据信息 for(int i=0;iStringTemplate body = stGroup.getInstanceOf(\"st/body\"); Worksheet worksheet = new Worksheet(); worksheet.setTitle(title);worksheet.setSheet(\" \"+(i+1)+\" \");
worksheet.setColumnNum(columnLength); worksheet.setRowNum(maxRowNum+1); List rows = new ArrayList(); int startIndex = i*maxRowNum;int endIndex = Math.min((i+1)*maxRowNum -1,totalRowNum-1); for(int j=startIndex;j<=endIndex;j++){
Row row = new Row();
List result = new ArrayList(columnLength); for(int n=0;nObject value = getMethods.get(n).invoke(record.get(j)); if(value == null){ result.add(\"\"); }else{if(value instanceof Date){
result.add(sdf.format((Date)value)); }else{
result.add(value.toString()); } }
}
row.setResult(result); rows.add(row); }
worksheet.setRows(rows);
body.setAttribute(\"worksheet\ writer.print(body.toString()); writer.flush(); rows.clear(); rows = null;
worksheet = null; body = null;
Runtime.getRuntime().gc();
System.out.println(\"正在⽣成excel⽂件的 sheet\"+(i+1)); }
//写⼊excel⽂件尾部
writer.print(\"\"); writer.flush(); writer.close();
System.out.println(\"⽣成excel⽂件完成\"); long endTime = System.currentTimeMillis();
System.out.println(\"⽤时=\"+((endTime-startTime)/1000)+\"秒\"); }
public static void main(String[] args) throws IOException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { System.out.println(Thread.currentThread().getContextClassLoader().getResource(\"\").getPath()); System.out.println(ExcelStUtil.class.getResource(\"\").getPath());
System.out.println(ExcelStUtil.class.getClassLoader().getResource(\"\").getPath()); List result = new ArrayList(); for(int i=0;i<100;i++){result.add(new Sample(\"放⼤双⽅的\"+String.valueOf(i),String.valueOf(i))); }
//OutputStream outputStream = new FileOutputStream(\"D:/output2.xls\");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ExcelStUtil.export(byteArrayOutputStream,result);
//ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); //解决可能发⽣的中⽂乱码
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toString().getBytes(\"UTF-8\")); File file = new File(\"D:/output2.xls\");
OutputStream output = new FileOutputStream(file);
BufferedOutputStream bufferedOutput = new BufferedOutputStream(output); //bufferedOutput.write(byteArrayOutputStream.toByteArray());
bufferedOutput.write(byteArrayOutputStream.toString().getBytes(\"UTF-8\")); bufferedOutput.flush(); bufferedOutput.close(); }}
推荐: