java导出大数据excel表格,导出数据

这个Java类展示了如何使用SXSSFWorkbook处理大数据量的Excel导出,避免了常规方法中65535行的限制。通过创建SXSSFWorkbook实例,可以实现内存优化并支持超过65535行的数据导出。类中包含导出表头和内容的方法,以及处理不同类型字段的方法。

常规的java导出excel表格最大的数据量是65535行。


package com.sf.module.timeManagement.biz;


import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;


import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;


import com.sf.module.basemanagement.domain.InfoSystem;
import com.sf.module.basemanagement.domain.OrgGroup;
import com.sf.module.dependwlm.domain.Version;
import com.sf.module.frameworkimpl.excel.ColumnDefine;
import com.sf.module.frameworkimpl.excel.TableDefine;
import com.sf.module.organization.domain.Department;
import com.sf.module.organization.domain.Employee;
import com.sf.module.qasbaseinfo.domain.QasDictionarys;
import com.sf.module.worksystem.domain.JobType;


import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;


/**
 * 单纯地数据导出,不做其他处理 2015-08-05
 * 
 * @author 591028
 * 
 */


public class ExcelExportSpBigData {
// Excel导出表格式定义
private TableDefine tableDefine;
// 创建工作本 TOS
public SXSSFWorkbook workbook = new SXSSFWorkbook(100);
public int num = 0;


public ExcelExportSpBigData(TableDefine tableDefine) {
this.tableDefine = tableDefine;
}


/**
* 导出数据到InputStream

* @param data
* @return
*/
public InputStream export(Collection<?> data) {
workbook = new SXSSFWorkbook(100);
workbook.setCompressTempFiles(true);
num = data.size();
SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet(tableDefine
.getSheetName());
writeSheet(sheet, data);


return save(workbook);
}


/**
* 导出Excel

* @param sheet
* @param data
*/
private void writeSheet(SXSSFSheet sheet, Collection<?> data) {
try {
writeSheetHeader(sheet);
writeSheetContent(sheet, data);
} catch (Exception e) {
throw new RuntimeException(e);
}
}


/**
* 生成表头

* @param sheet
*/
private void writeSheetHeader(SXSSFSheet sheet) {
Row row = sheet.createRow(0);
for (ColumnDefine column : tableDefine.getColumns()) {
short columnIndex = (short) column.getIndex();
Cell cell = row.createCell(columnIndex);
if (column.getWidth() > 0) {
sheet.setColumnWidth(columnIndex, (short) column.getWidth());
}
Object value = column.getTitle();
if (column.getExportCellEvent() != null) {
value = column.getExportCellEvent().onExportCell(column, 0,
cell, value);
// .onExportCell(column, 0,
// cell, value);
}
XSSFRichTextString richText = new XSSFRichTextString(
(value == null) ? "" : value.toString());
cell.setCellValue(richText);
}
}


/**
* 生成Excel内容

* @param sheet
* @param data
* @throws Exception
*/
private void writeSheetContent(SXSSFSheet sheet, Collection<?> data)
throws Exception {
if (data.size() > 0) {
Map<String, Field> fields = getClazzFields(data.iterator().next()
.getClass());
int rowIndex = 0;
for (Object obj : data) {
Row row = sheet.createRow(++rowIndex);
for (ColumnDefine column : tableDefine.getColumns()) {
short columnIndex = (short) column.getIndex();
Cell cell = row.createCell(columnIndex);
Object value = null;
if (column.getPropName().equals("systemCode")) {
if (null != fields.get("infoSystem")) {
value = (fields.get("infoSystem").get(obj));
InfoSystem aa = (InfoSystem) value;
value = aa != null ? aa.getSysCode() : "";
} else {
if (null != fields.get(column.getPropName())) {
value = fields.get(column.getPropName()).get(
obj);
} else {
value = "";
}
}


} else if (column.getPropName().equals("preDevMgr")) {
value = (fields.get("empMgr").get(obj));
Employee aa = (Employee) value;
value = aa != null ? aa.getEmpName() : "";
}


else if (column.getPropName().equals("versionId")) {
value = (fields.get("version").get(obj));
Version aa = (Version) value;
value = aa != null ? aa.getVersionNo() : "";
} else if (column.getPropName().equals("versionGroupCode")) {
value = (fields.get("orgGroup").get(obj));
OrgGroup aa = (OrgGroup) value;
value = aa != null ? aa.getGroupName() : "";
} else if (column.getPropName().equals("pubReSystemId")) {
value = fields.get("sysName").get(obj);
} else if (column.getPropName().equals("pubReVersionId")) {
value = fields.get("versionNo").get(obj);
} else if (column.getPropName().equals("departmentName")) {
value = (fields.get("department").get(obj));
Department aa = (Department) value;
value = aa != null ? aa.getDepartmentName() : "";
} else if (column.getPropName().equals("jobTypeName")) {
value = (fields.get("jobType").get(obj));
JobType aa = (JobType) value;
value = aa != null ? aa.getJobTypeName() : "";
} else if (column.getPropName().equals("childrenName")) {
value = (fields.get("jobType2").get(obj));
JobType aa = (JobType) value;
value = aa != null ? aa.getJobTypeName() : "";
} else if (column.getPropName().equals("workinghourType")) {
value = (fields.get("qasDictionarys").get(obj));
QasDictionarys aa = (QasDictionarys) value;
value = aa != null ? aa.getDictvalue() : "";
} else {
if (null != fields.get(column.getPropName())) {
value = fields.get(column.getPropName()).get(obj);
} else {
value = "";
}
}


if (column.getExportCellEvent() != null) {
value = column.getExportCellEvent().onExportCell(
column, rowIndex, cell, value);
}
if (value != null) {
HSSFRichTextString richText = new HSSFRichTextString(
(value == null) ? "" : value.toString());
// System.out.println(column.getIndex()+"="+value.toString());
if (isNumeric(value.toString())) {// column.getIndex()
// == 0 设置第一列为数字
// System.out.println(column.getIndex()+"***="+value.toString());
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
// //新增的四句话,设置CELL格式为文本格式
CellStyle cellStyle2 =   workbook
.createCellStyle();
DataFormat format =  workbook.createDataFormat();
cellStyle2.setDataFormat(format.getFormat("0.00"));
cell.setCellStyle(cellStyle2);

cell.setCellValue(Double.parseDouble(value
.toString()));

} else {
cell.setCellValue(richText);
}
} else {
cell.setCellValue("");
}



}


}


}





}


/**
* 获取对象的全部属性

* @param clazz
* @return
*/
private Map<String, Field> getClazzFields(Class<?> clazz) {
Map<String, Field> fieldMap = new HashMap<String, Field>();
for (Class<?> superClass = clazz; superClass != Object.class; superClass = superClass
.getSuperclass()) {
Field[] fields = superClass.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
fieldMap.put(field.getName(), field);
}
}
return fieldMap;
}


/**
* 保存Excel到InputStream

* @param workbook2
* @return
*/
private InputStream save(SXSSFWorkbook workbook) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
workbook.write(bos);
InputStream bis = new ByteArrayInputStream(bos.toByteArray());
return bis;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}


public boolean isNumeric(String str) {
if ("".equals(str) || str == null)
return false;
// Pattern pattern = Pattern.compile("[0-9]*");
Pattern pattern = Pattern.compile("\\d+\\.\\d+");
return pattern.matcher(str).matches();
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值