我们使用的导出并下载功能是利用一个插件叫POI的插件提供的导出功能,很实用;首先先导入Jar包:
Jar包下载地址:http://poi.apache.org/ 官方文档地址:http://poi.apache.org/spreadsheet/quick-guide.html
Action代码:
public void exportToExcel(List<PortalContactVO> data) throws Exception
{
this.setEnableAccessRequest(true);
this.setEnableAccessResponse(true);
HttpServletRequest request = this.getRequest();
HttpServletResponse response = this.getResponse();
String randomNumber = request.getParameter("randomNumber");// session名称
try {
session = request.getSession();
session.setAttribute(randomNumber, new Double(1));
// 导出的EXCEL文件名
String exportFileName = "addressBook.xlsx";
response.reset();
response.setContentType("octets/stream");
// response.setHeader("Content-Disposition","attachment;filename="+exportFileName);
response.setHeader("Content-Disposition", "attachment;filename=\"" + new String(exportFileName.getBytes("UTF-8"), "iso8859-1") + "\"");
// 导出的EXCEL列属性
List<String> columnListName = new ArrayList<String>();
columnListName.add("userName&姓名");
columnListName.add("mobile&手机");
columnListName.add("shopTel&分店电话");
columnListName.add("postName&职位");
columnListName.add("email&邮箱");
columnListName.add("shopAddress&分店地址");
Bean2ExcelConversionUtils.beans2excelFile07(columnListName, data, response.getOutputStream());
session.setAttribute(randomNumber, new Double(100));
} catch (Exception e) {
e.printStackTrace();
session.setAttribute(randomNumber, new Double(100));
} catch (Throwable e) {
e.printStackTrace();
session.setAttribute(randomNumber, new Double(100));
}
}
JSP代码:
<form id="exportForm">
<input class="btnStyle" type="submit" id="inputExport" value="导出" onclick="exportToExcel()" />
</form>
function exportToExcel() {
var randomNumber=new Date().getTime();
top.$.jBox.tip("正在导出...", 'loading');
var exportDate = "${ctx}/xxxAction.do?method=export&randomNumber="+randomNumber;
$("#exportForm").attr("action", exportDate);
$("#exportForm").attr("method","post");
$("#exportForm").submit();
}
因为是使用的插件,所以需要引入一个工具类(下面的工具类直接复制到新建的类文件里面即可)
也可以通过:http://download.csdn.net/detail/work201003/9404952 进行下载
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
/**
* @author Tan Jiangyong
* @date 2013-9-3 下午3:36:43
* @version V1.0
*/
@SuppressWarnings("all")
public class Bean2ExcelConversionUtils {
private static final String PATTERN="yyyy-MM-dd HH:mm:ss"; //excel日期格式,默认配置
private static final String DATE_PATTERN="yyyy-MM-dd"; //excel日期格式
private static final String DATE_HH_PATTERN="HH:mm:ss"; //excel时间格式
private static final int TOTAL_SIZE=40000; //每个excel写入多少数据(默认配置)
private static final int MAX_SHEET_SIZE=10000; //每一个sheet的大小(默认配置)
private static final int COLUMN_WIDTH_WORD=25; //列宽,默认汉字个数为25个
private static final int FLUSH_ROWS=100; //每生成excel行数,内存中缓存记录数清空(目的,避免零时文件过大)
/**
* 07、10办公版EXCEL导出(数据直接写到服务器的EXCEL里,以下载的形式,下载导出的数据)
* @param listName 列表头名称
* @param beans 实体集合
* @param result 数字字典Map集
* @param filePath 服务器存放文件路径
* @param fileName 文件名称
* @param totalSize EXCEL条数量
* @param maxSheetSize sheet页条数量
* @return 文件集合
* @throws Exception
*/
public static <T> List<File> beans2excelFile07(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize) throws Exception{
if(totalSize==null || totalSize<=0)
totalSize=TOTAL_SIZE;
if(maxSheetSize==null || maxSheetSize<=0)
maxSheetSize=MAX_SHEET_SIZE;
if(fileName==null)
fileName="";
return beans2excelFile2007(listName, beans, result, filePath, fileName,totalSize,maxSheetSize);
}
/**
* 07、10办公版EXCEL导出(数据直接写到服务器的EXCEL里,以下载的形式,下载导出的数据)
* @param listName 列表头名称
* @param beans 实体集合
* @param result 数字字典Map集
* @param filePath 服务器存放文件路径
* @param fileName 文件名称
* @param totalSize EXCEL条数量
* @param maxSheetSize sheet页条数量
* @param request 客户端请求对象
* @param response 客户端响应对象
* @throws Exception
*/
public static <T> void beans2excelFile07(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize,HttpServletRequest request,HttpServletResponse response) throws Exception{
if(totalSize==null || totalSize<=0)
totalSize=TOTAL_SIZE;
if(maxSheetSize==null || maxSheetSize<=0)
maxSheetSize=MAX_SHEET_SIZE;
if(fileName==null)
fileName="";
List<File> files = beans2excelFile2007(listName, beans, result, filePath, fileName,totalSize,maxSheetSize);
DownLoadUtils.downLoadFiles(files, filePath, request, response);
}
/**
* 07、10办公版EXCEL导出,每个EXCEL组织数据
* @param listName 列表头名称
* @param beans 实体集合
* @param result 数字字典Map集
* @param filePath 服务器存放文件路径
* @param fileName 文件名称
* @param totalSize EXCEL条数量
* @param maxSheetSize sheet页条数量
* @return 文件集合
* @throws Exception
*/
private static <T> List<File> beans2excelFile2007(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize) throws Exception{
if ((listName == null) || (listName.size() == 0)) {
throw new Exception("listName is null when create excel document");
}
List<File> listFile=new ArrayList<File>();//返回的文件集合
int size=beans==null?0:beans.size();
String fileSuffixName=".xlsx";//后缀
String path="";//文件路径
Integer startIdx=0;//数据读取的起始行
Integer endIdx=0;//数据读取的结束行
(new File(filePath)).mkdirs(); //没有该目录创建目录
if(size==0){
startIdx=0;
endIdx=(totalSize)>size?size:(totalSize);
String name=fileName+"_第0-0条数据";
path=filePath+File.separatorChar+name+fileSuffixName;
Workbook wb =new SXSSFWorkbook();
buildExcelDocument2007(wb, listName, beans,result,startIdx,endIdx,maxSheetSize);
//没有文件,创建文件
File file = new File(path);
if (!file.exists()){
file.createNewFile();
}
FileOutputStream out=new FileOutputStream(file);
wb.write(out);
out.close();
return listFile;
}
for (int i = 0; i < size;i++) {
int remainder=i%totalSize;
if(size==0 || remainder==0){
startIdx=i;
endIdx=(i+totalSize)>size?size:(i+totalSize);
String name=fileName+"_第"+(startIdx+1)+"-"+(endIdx)+"条数据";
path=filePath+"/"+name+fileSuffixName;
Workbook wb =new SXSSFWorkbook();
buildExcelDocument2007(wb, listName, beans,result,startIdx,endIdx,maxSheetSize);
//没有文件,创建文件
File file = new File(path);
if (!file.exists()){
file.createNewFile();
}
FileOutputStream out=new FileOutputStream(file);
wb.write(out);
out.close();
listFile.add(file);
}else if((size-i)<totalSize && i>endIdx){//最后,不满一万条
startIdx=i;
endIdx=i+totalSize;
String name=fileName+"_第"+(startIdx+1)+"-"+(endIdx)+"条数据";
path=filePath+name+"."+fileSuffixName;//没有文件,创建文件
Workbook wb =new SXSSFWorkbook();
buildExcelDocument2007(wb, listName, beans, result,startIdx,endIdx,maxSheetSize);
//没有文件,创建文件
File file = new File(path);
if (!file.exists()){
file.createNewFile();
}
FileOutputStream out=new FileOutputStream(file);
wb.write(out);
out.close();
listFile.add(file);
}
}
return listFile;
}
/**
* 07、10办公版EXCEL导出,每个EXCEL写入数据
* @param wb EXCEL工作薄
* @param listName 列表头名称
* @param beans 实体集合
* @param result 数字字典Map集
* @param startIdx 数据集合,开始行
* @param endIdx 数据集合,结束始行
* @param maxSheetSize SHEET页条数
* @throws Exception
*/
private static <T> void buildExcelDocument2007(Workbook wb, List<String> listName, List<T> beans,HashMap<String,HashMap<String,String>> result,Integer startIdx,Integer endIdx,Integer maxSheetSize) throws Exception
{
int totalSize=endIdx-startIdx;//总共条数
try
{
CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null);
List titles = new ArrayList();
List beanAttrNames = new ArrayList();
boolean flagListExists=false;
List flagList=new ArrayList();
List widthList=new ArrayList();
HashMap<String,String> dateMap=new HashMap<String, String>();
String[] header = new String[listName.size()];
int rows_max = 0;//标题占多少列
for (int i=0;i<listName.size();i++)
{
String[] str=listName.get(i).split("&");
String en_name=str[0];
String zh_name=str[1];
beanAttrNames.add(i,en_name);
titles.add(i, zh_name);
header[i]=zh_name;
if (zh_name.split("_").length > rows_max) {
rows_max = zh_name.split("_").length;
}
if(str.length>2){
String flag=str[2];
flagList.add(i,flag);
if(!flagListExists)
flagListExists=true;
}
if(str.length>3){
widthList.add(str[3]);
}
if(str.length>4){
dateMap.put(en_name, str[4]);
}
}
PropertyDescriptor[] props = null;
int size=endIdx-startIdx;
Sheet sheet=null;
//如果没有数据,导出表头
if(size==0){
sheet=ExcelHeadUtils.getExcelHead2007(wb, header, "Sheet1");
sheet.setDefaultRowHeight((short)350);//高度
setColumnWidth2007(widthList, sheet,beanAttrNames.size());
return ;
}
int u=1;//用来创建每个sheet的行
int h=0;//用来标注每个sheet也得名字:多少行-多少行
for (int i = startIdx; i < endIdx ; i++) {
int remainder=h%maxSheetSize;
if(size==0 || i==startIdx || remainder==0){
u=1;
int section=(h+maxSheetSize)>totalSize?totalSize:(h+maxSheetSize);
sheet=ExcelHeadUtils.getExcelHead2007(wb, header,"第"+(h+1)+"-"+section+"条");
sheet.createFreezePane( 1, rows_max, 1, rows_max);
sheet.setDefaultRowHeight((short)350);//高度
setColumnWidth2007(widthList, sheet,beanAttrNames.size());
}
if(props==null)
props=Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors();
Object bean = beans.get(i);
Row row = sheet.createRow(u+rows_max-1);
u++;
h++;
for (int j = 0; j < beanAttrNames.size(); j++) {
String beanAttrName = (String)beanAttrNames.get(j);
String flag="";
if(flagListExists)
flag=(String)flagList.get(j);
for (int k = 0; k < props.length; k++) {
String propName = props[k].getName();
if (propName.equals(beanAttrName))
{
String pattern=dateMap.get(beanAttrName);
Cell cell = row.createCell((short)j);
Object cellValue = callGetter(bean, props[k],pattern);
if("true".equalsIgnoreCase(flag)){
if(result!=null){
HashMap<String,String> hash=result.get(beanAttrName);
if(hash!=null)
cellValue=hash.get(cellValue);
}
}
if (cellValue == null) {
cellValue = "";
}
setExcelCellText2007(cell, cellValue.toString(),cellStyle);
}
}
}
//每当行数达到设置的值就刷新数据到硬盘,以清理内存
if(i%FLUSH_ROWS==0){
((SXSSFSheet)sheet).flushRows();
}
}
} catch (Exception e) {
throw new Exception(e);
}
}
/**
* 07、10办公版EXCEL导出(直接以流的方式,写到客户端,导出的EXCEL文件只有一个)
* @param listName 列表头名称
* @param beans 实体集合
* @param maxSheetSize SHEET页的条数
* @param outputStream 客户端输出流
* @throws Exception
*/
public static <T> void beans2excelFile07(List<String> listName,List<T> beans, OutputStream outputStream) throws Exception{
if ((listName == null) || (listName.size() == 0)) {
throw new Exception("listName is null when create excel document");
}
if (outputStream == null) {
throw new Exception("outputStream is null when create excel document");
}
Workbook wb =new SXSSFWorkbook();
beans2excelFile07(listName, beans, null, null, MAX_SHEET_SIZE, outputStream);
try {
wb.write(outputStream);
outputStream.close();
} catch (IOException e) {
throw new Exception(e);
}
}
/**
* 07、10办公版EXCEL导出(直接以流的方式,写到客户端,导出的EXCEL文件只有一个)
* @param listName 列表头名称
* @param beans 实体集合
* @param maxSheetSize SHEET页的条数
* @param outputStream 客户端输出流
* @throws Exception
*/
public static <T> void beans2excelFile07(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String sheetName,Integer maxSheetSize, OutputStream outputStream) throws Exception{
if ((listName == null) || (listName.size() == 0)) {
throw new Exception("listName is null when create excel document");
}
if (outputStream == null) {
throw new Exception("outputStream is null when create excel document");
}
if(maxSheetSize==null || maxSheetSize<=0){
maxSheetSize=MAX_SHEET_SIZE;
}
if(sheetName==null || "".equals(sheetName.trim())){
sheetName="Sheet";
}
Workbook wb =new SXSSFWorkbook();
if(maxSheetSize==null || maxSheetSize<=0){
maxSheetSize=MAX_SHEET_SIZE;
}
buildExcelDocument2007(wb, listName, beans,result,sheetName,maxSheetSize);
try {
wb.write(outputStream);
outputStream.close();
} catch (IOException e) {
throw new Exception(e);
}
}
/**
*
* @param listName
* @param beans
* @param response
* @param fileName 导出的文件名称
* @throws Exception
*/
public static <T> void beans2excelFile07(List<String> listName, List<T> beans, HttpServletResponse response,String fileName) throws Exception {
response.reset();
response.setContentType("octets/stream");
response.setHeader("Content-Disposition", "attachment;filename="+java.net.URLEncoder.encode(fileName, "UTF-8"));
if ((listName == null) || (listName.size() == 0)) {
throw new Exception("listName is null when create excel document");
}
if (response.getOutputStream() == null) {
throw new Exception("outputStream is null when create excel document");
}
beans2excelFile07(listName, beans, null, null, MAX_SHEET_SIZE, response.getOutputStream());
}
/**
* 07、10办公版EXCEL导出,EXCEL写入数据
* @param wb EXCEL工作薄
* @param listName 列表头名称
* @param beans 实体集合
* @param maxSheetSize SHEET页的条数
* @throws Exception
*/
private static <T> void buildExcelDocument2007(Workbook wb, List<String> listName, List<T> beans,HashMap<String,HashMap<String,String>> result,String sheetName,Integer maxSheetSize) throws Exception
{
try
{
CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null);
List titles = new ArrayList();
List beanAttrNames = new ArrayList();
List widthList = new ArrayList();
HashMap<String,String> dateMap=new HashMap<String, String>();
String[] header = new String[listName.size()];
int rows_max = 0;//标题占多少列
List flagList=new ArrayList();
boolean flagListExists=false;
for (int i=0;i<listName.size();i++)
{
String[] str=listName.get(i).split("&");
String en_name=str[0];
String zh_name=str[1];
beanAttrNames.add(i,en_name);
titles.add(i, zh_name);
header[i]=zh_name;
if (zh_name.split("_").length > rows_max) {
rows_max = zh_name.split("_").length;
}
if(str.length>2){
String flag=str[2];
flagList.add(i,flag);
if(!flagListExists)
flagListExists=true;
}
if(str.length>3){
widthList.add(str[3]);
}
if(str.length>4){
dateMap.put(en_name, str[4]);
}
}
PropertyDescriptor[] props = null;
int size=beans==null?0:beans.size();
Sheet sheet=null;
//如果没有数据,导出表头
if(size==0){
sheet=ExcelHeadUtils.getExcelHead2007(wb, header, sheetName);
sheet.setDefaultRowHeight((short)350);//高度
setColumnWidth2007(widthList, sheet,beanAttrNames.size());
return ;
}
for (int i = 0; i < size ; i++) {
int remainder=i%maxSheetSize;
if(size==0 || i==0 || remainder==0){
sheet=ExcelHeadUtils.getExcelHead2007(wb, header,sheetName+(i/maxSheetSize));
sheet.createFreezePane( 1, rows_max, 1, rows_max);
sheet.setDefaultRowHeight((short)350);//高度
setColumnWidth2007(widthList, sheet,beanAttrNames.size());
}
if(props==null)
props=Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors();
Object bean = beans.get(i);
Row row = sheet.createRow(remainder+rows_max);
for (int j = 0; j < beanAttrNames.size(); j++) {
String beanAttrName = (String)beanAttrNames.get(j);
String flag="";
if(flagListExists)
flag=(String)flagList.get(j);
for (int k = 0; k < props.length; k++) {
String propName = props[k].getName();
if (propName.equals(beanAttrName))
{
String pattern=dateMap.get(beanAttrName);
Cell cell = row.createCell((short)j);
Object cellValue = callGetter(bean, props[k],pattern);
if("true".equalsIgnoreCase(flag)){
if(result!=null){
HashMap<String,String> hash=result.get(beanAttrName);
if(hash!=null)
cellValue=hash.get(cellValue);
}
}
if (cellValue == null) {
cellValue = "";
}
setExcelCellText2007(cell, cellValue.toString(),cellStyle);
}
}
}
//每当行数达到设置的值就刷新数据到硬盘,以清理内存
if(i%FLUSH_ROWS==0){
((SXSSFSheet)sheet).flushRows();
}
}
} catch (Exception e) {
throw new Exception(e);
}
}
/**
* 07、10办公版EXCEL导出(直接以流的方式,写到客户端,导出的EXCEL文件只有一个)
* @param listName 列表头名称
* @param beans 实体集合
* @param maxSheetSize SHEET页的条数
* @param outputStream 客户端输出流
* @throws Exception
*/
public static <T> void beans2excelFile07List(List<ArrayList<String>> listColumnName,List<List> list2beans,HashMap<String,HashMap<String,HashMap<String,String>>> result,List<String> listSheetName, OutputStream outputStream) throws Exception{
if ((listColumnName == null) || (listColumnName.size() == 0)) {
throw new Exception("listColumnName is null when create excel document");
}
if (list2beans.size() != listColumnName.size()) {
throw new Exception("list2beans and listColumnName size Unequal");
}
if (outputStream == null) {
throw new Exception("outputStream is null when create excel document");
}
Workbook wb =new SXSSFWorkbook();
buildExcelDocument2007List(wb, listColumnName, list2beans, result, listSheetName);
try {
wb.write(outputStream);
outputStream.close();
} catch (IOException e) {
throw new Exception(e);
}
}
/**
* 07、10办公版EXCEL导出,EXCEL写入数据
* @param wb EXCEL工作薄
* @param listName 列表头名称
* @param beans 实体集合
* @param maxSheetSize SHEET页的条数
* @throws Exception
*/
private static <T> void buildExcelDocument2007List(Workbook wb, List<ArrayList<String>> listColumnName,List<List> list2beans,HashMap<String,HashMap<String,HashMap<String,String>>> resultMap,List<String> listSheetName) throws Exception
{
try
{
int sheets=listColumnName.size();
boolean sheetNameIsNullFlag=false;
if(listSheetName==null || listSheetName.size()!=sheets){
sheetNameIsNullFlag=true;
}
for (int s = 0; s < sheets; s++) {
String sheetName="Sheet"+s;
if(!sheetNameIsNullFlag){
sheetName=listSheetName.get(s);
}
List<String> listName=listColumnName.get(s);
CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null);
List titles = new ArrayList();
List beanAttrNames = new ArrayList();
List widthList = new ArrayList();
HashMap<String,String> dateMap=new HashMap<String, String>();
String[] header = new String[listName.size()];
int rows_max = 0;//标题占多少列
List flagList=new ArrayList();
boolean flagListExists=false;
for (int i=0;i<listName.size();i++)
{
String[] str=listName.get(i).split("&");
String en_name=str[0];
String zh_name=str[1];
beanAttrNames.add(i,en_name);
titles.add(i, zh_name);
header[i]=zh_name;
if (zh_name.split("_").length > rows_max) {
rows_max = zh_name.split("_").length;
}
if(str.length>2){
String flag=str[2];
flagList.add(i,flag);
if(!flagListExists)
flagListExists=true;
}
if(str.length>3){
widthList.add(str[3]);
}
if(str.length>4){
dateMap.put(en_name, str[4]);
}
}
PropertyDescriptor[] props = null;
ArrayList<T> beans=(ArrayList<T>)list2beans.get(s);
int size=beans==null?0:beans.size();
Sheet sheet=null;
//如果没有数据,导出表头
if(size==0){
sheet=ExcelHeadUtils.getExcelHead2007(wb, header, sheetName);
sheet.setDefaultRowHeight((short)350);//高度
setColumnWidth2007(widthList, sheet,beanAttrNames.size());
return ;
}
HashMap<String,HashMap<String,String>> result=null;
if(resultMap!=null){
result=resultMap.get(sheetName);
}
sheet=ExcelHeadUtils.getExcelHead2007(wb, header,sheetName);
sheet.createFreezePane( 1, rows_max, 1, rows_max);
sheet.setDefaultRowHeight((short)350);//高度
setColumnWidth2007(widthList, sheet,beanAttrNames.size());
for (int i = 0; i < size ; i++) {
if(props==null)
props=Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors();
Object bean = beans.get(i);
Row row = sheet.createRow(rows_max+i);
for (int j = 0; j < beanAttrNames.size(); j++) {
String beanAttrName = (String)beanAttrNames.get(j);
String flag="";
if(flagListExists)
flag=(String)flagList.get(j);
for (int k = 0; k < props.length; k++) {
String propName = props[k].getName();
if (propName.equals(beanAttrName))
{
String pattern=dateMap.get(beanAttrName);
Cell cell = row.createCell((short)j);
Object cellValue = callGetter(bean, props[k],pattern);
if("true".equalsIgnoreCase(flag)){
if(result!=null){
HashMap<String,String> hash=result.get(beanAttrName);
if(hash!=null)
cellValue=hash.get(cellValue);
}
}
if (cellValue == null) {
cellValue = "";
}
setExcelCellText2007(cell, cellValue.toString(),cellStyle);
}
}
}
//每当行数达到设置的值就刷新数据到硬盘,以清理内存
if(i%FLUSH_ROWS==0){
((SXSSFSheet)sheet).flushRows();
}
}
}
} catch (Exception e) {
throw new Exception(e);
}
}
/**
* 07、10办公版EXCEL导出,单元格设置
* @param cell 单元格对象
* @param text 单元格文本内容
* @param cellStyle 单元格格式
*/
private static void setExcelCellText2007(Cell cell, Object text,CellStyle cellStyle)
{
cell.setCellValue(text.toString());
cell.setCellType(1);//单元格类型
cell.setCellStyle(cellStyle);
}
/**
* 07、10办公版EXCEL导出,单元格宽度设置
* @param widthList 列宽集合
* @param sheet sheet对象
* @param allSize 总列数
*/
private static void setColumnWidth2007(List widthList,Sheet sheet,int allSize){
if(widthList!=null && widthList.size()>0){
int size=widthList.size();
for (int i = 0; i < size; i++) {
try {
Integer width=Integer.parseInt((String) widthList.get(i));
sheet.setColumnWidth((short) i,width*256);
} catch (NumberFormatException e) {
continue;
}
}
}else{
for (int i = 0; i < allSize; i++) {
try {
sheet.setColumnWidth((short) i,COLUMN_WIDTH_WORD*256);
} catch (NumberFormatException e) {
continue;
}
}
}
}
/**
* 03、WPS:EXCEL导出(数据直接写到服务器的EXCEL里,以下载的形式,下载导出的数据)
* @param listName 列表头名称
* @param beans 实体集合
* @param result 数字字典Map集
* @param filePath 服务器存放文件路径
* @param fileName 文件名称
* @param totalSize EXCEL条数量
* @param maxSheetSize sheet页条数量
* @return List<File> 文件集合
* @throws Exception
*/
public static <T> List<File> beans2excelFile03(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize) throws Exception{
if(totalSize==null || totalSize<=0)
totalSize=TOTAL_SIZE;
if(maxSheetSize==null || maxSheetSize<=0)
maxSheetSize=MAX_SHEET_SIZE;
if(fileName==null)
fileName="";
return beans2excelFile2003(listName, beans, result, filePath, fileName,totalSize,maxSheetSize);
}
/**
* 03、WPS:EXCEL导出(数据直接写到服务器的EXCEL里,以下载的形式,下载导出的数据)
* @param listName 列表头名称
* @param beans 实体集合
* @param result 数字字典Map集
* @param filePath 服务器存放文件路径
* @param fileName 文件名称
* @param totalSize EXCEL条数量
* @param maxSheetSize sheet页条数量
* @param request 客户端请求对象
* @param response 客户端响应对象
* @throws Exception
*/
public static <T> void beans2excelFile03(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize,HttpServletRequest request,HttpServletResponse response) throws Exception{
if(totalSize==null || totalSize<=0)
totalSize=TOTAL_SIZE;
if(maxSheetSize==null || maxSheetSize<=0)
maxSheetSize=MAX_SHEET_SIZE;
if(fileName==null)
fileName="";
List<File> files=beans2excelFile2003(listName, beans, result, filePath, fileName,totalSize,maxSheetSize);
DownLoadUtils.downLoadFiles(files, filePath, request, response);
}
/**
* 03、WPS:EXCEL导出,每个EXCEL组织数据
* @param listName 列表头名称
* @param beans 实体集合
* @param result 数字字典Map集
* @param filePath 服务器存放文件路径
* @param fileName 文件名称
* @param totalSize EXCEL条数量
* @param maxSheetSize sheet页条数量
* @return 文件集合
* @throws Exception
*/
private static <T> List<File> beans2excelFile2003(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String filePath,String fileName,Integer totalSize,Integer maxSheetSize) throws Exception{
if ((listName == null) || (listName.size() == 0)) {
throw new Exception("listName is null when create excel document");
}
List<File> listFile=new ArrayList<File>();//返回的文件集合
int size=beans==null?0:beans.size();
String fileSuffixName=".xls";//后缀
String path="";//文件路径
Integer startIdx=0;//数据读取的起始行
Integer endIdx=0;//数据读取的结束行
(new File(filePath)).mkdirs(); //没有该目录创建目录
if(size==0){
startIdx=0;
endIdx=(totalSize)>size?size:(totalSize);
String name=fileName+"_第0-0条数据";
path=filePath+File.separatorChar+name+fileSuffixName;
HSSFWorkbook wb =new HSSFWorkbook();
buildExcelDocument2003(wb, listName, beans,result,startIdx,endIdx,maxSheetSize);
//没有文件,创建文件
File file = new File(path);
if (!file.exists()){
file.createNewFile();
}
FileOutputStream out=new FileOutputStream(file);
wb.write(out);
out.close();
return listFile;
}
for (int i = 0; i < size;i++) {
int remainder=i%totalSize;
if(size==0 || remainder==0){
startIdx=i;
endIdx=(i+totalSize)>size?size:(i+totalSize);
String name=fileName+"_第"+(startIdx+1)+"-"+(endIdx)+"条数据";
path=filePath+"/"+name+fileSuffixName;
HSSFWorkbook wb =new HSSFWorkbook();
buildExcelDocument2003(wb, listName, beans,result,startIdx,endIdx,maxSheetSize);
//没有文件,创建文件
File file = new File(path);
if (!file.exists()){
file.createNewFile();
}
FileOutputStream out=new FileOutputStream(file);
wb.write(out);
out.close();
listFile.add(file);
}else if((size-i)<totalSize && i>endIdx){//最后,不满一万条
startIdx=i;
endIdx=i+totalSize;
String name=fileName+"_第"+(startIdx+1)+"-"+(endIdx)+"条数据";
path=filePath+name+"."+fileSuffixName;//没有文件,创建文件
HSSFWorkbook wb =new HSSFWorkbook();
buildExcelDocument2003(wb, listName, beans, result,startIdx,endIdx,maxSheetSize);
//没有文件,创建文件
File file = new File(path);
if (!file.exists()){
file.createNewFile();
}
FileOutputStream out=new FileOutputStream(file);
wb.write(out);
out.close();
listFile.add(file);
}
}
return listFile;
}
/**
* 03,WPS:EXCEL导出,每个EXCEL写入数据
* @param wb EXCEL工作薄
* @param listName 列表头名称
* @param beans 实体集合
* @param result 数字字典Map集
* @param startIdx 数据集合,开始行
* @param endIdx 数据集合,结束始行
* @param maxSheetSize SHEET页条数
* @throws Exception
*/
private static <T> void buildExcelDocument2003(HSSFWorkbook wb, List<String> listName, List<T> beans,HashMap<String,HashMap<String,String>> result,Integer startIdx,Integer endIdx,Integer maxSheetSize) throws Exception
{
int totalSize=endIdx-startIdx;//总共条数
try
{
CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null);
List titles = new ArrayList();
List beanAttrNames = new ArrayList();
List widthList=new ArrayList();
String[] header = new String[listName.size()];
List flagList=new ArrayList();
boolean flagListExists=false;
int rows_max = 0;//标题占多少列
HashMap<String,String> dateMap=new HashMap<String, String>();
for (int i=0;i<listName.size();i++)
{
String[] str=listName.get(i).split("&");
String en_name=str[0];
String zh_name=str[1];
beanAttrNames.add(i,en_name);
titles.add(i, zh_name);
header[i]=zh_name;
if (zh_name.split("_").length > rows_max) {
rows_max = zh_name.split("_").length;
}
if(str.length>2){
String flag=str[2];
flagList.add(i,flag);
if(!flagListExists)
flagListExists=true;
}
if(str.length>3){
widthList.add(str[3]);
}
if(str.length>4){
dateMap.put(en_name, str[4]);
}
}
PropertyDescriptor[] props = null;
int size=endIdx-startIdx;
HSSFSheet sheet=null;
//如果没有数据,导出表头
if(size==0){
sheet=ExcelHeadUtils.getExcelHead2003(wb, header, "Sheet1");
sheet.setDefaultRowHeight((short)350);//高度
setColumnWidth2003(widthList, sheet,beanAttrNames.size());
return ;
}
int u=1;//用来创建每个sheet的行
int h=0;//用来标注每个sheet也得名字:多少行-多少行
for (int i = startIdx; i < endIdx ; i++) {
int remainder=h%maxSheetSize;
if(size==0 || i==startIdx || remainder==0){
u=1;
int section=(h+maxSheetSize)>totalSize?totalSize:(h+maxSheetSize);
sheet=ExcelHeadUtils.getExcelHead2003(wb, header, "第"+(h+1)+"-"+section+"条");
sheet.createFreezePane( 1, rows_max, 1, rows_max);
sheet.setDefaultRowHeight((short)350);//高度
setColumnWidth2003(widthList, sheet,beanAttrNames.size());
}
if(props==null)
props=Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors();
Object bean = beans.get(i);
HSSFRow row = sheet.createRow(u+rows_max-1);
u++;
h++;
for (int j = 0; j < beanAttrNames.size(); j++) {
String beanAttrName = (String)beanAttrNames.get(j);
String flag=null;
if(flagListExists)
flag=(String)flagList.get(j);
for (int k = 0; k < props.length; k++) {
String propName = props[k].getName();
if (propName.equals(beanAttrName))
{
String pattern=dateMap.get(beanAttrName);
HSSFCell cell = row.createCell((short)j);
Object cellValue = callGetter(bean, props[k],pattern);
if("true".equalsIgnoreCase(flag)){
if(result!=null){
HashMap<String,String> hash=result.get(beanAttrName);
if(hash!=null)
cellValue=hash.get(cellValue);
}
}
if (cellValue == null) {
cellValue = "";
}
setExcelCellText2003(cell, cellValue.toString(),cellStyle);
}
}
}
}
} catch (Exception e) {
throw new Exception(e);
}
}
/**
* 03,WPS:EXCEL导出(直接以流的方式,写到客户端,导出的EXCEL文件只有一个)
* @param listName 列表头名称
* @param beans 实体集合
* @param maxSheetSize sheet页条数量
* @param outputStream 客户端输出流
* @throws Exception
*/
public static <T> void beans2excelFile03(List<String> listName,List<T> beans,HashMap<String,HashMap<String,String>> result,String sheetName,Integer maxSheetSize, OutputStream outputStream) throws Exception{
if ((listName == null) || (listName.size() == 0)) {
throw new Exception("listName is null when create excel document");
}
if(maxSheetSize==null || maxSheetSize<=0){
maxSheetSize=MAX_SHEET_SIZE;
}
if(sheetName==null || "".equals(sheetName.trim())){
sheetName="Sheet";
}
HSSFWorkbook wb =new HSSFWorkbook();
if(maxSheetSize==null || maxSheetSize<=0)
maxSheetSize=MAX_SHEET_SIZE;
buildExcelDocument2003(wb, listName, beans,result,sheetName,maxSheetSize);
try {
wb.write(outputStream);
outputStream.close();
} catch (IOException e) {
throw new Exception(e);
}
}
/**
* 03,WPS:EXCEL导出,EXCEL写入数据
* @param wb EXCEL工作薄
* @param listName 列表头名称
* @param beans 实体集合
* @param maxSheetSize sheet页条数量
* @throws Exception
*/
private static <T> void buildExcelDocument2003(HSSFWorkbook wb, List<String> listName, List<T> beans,HashMap<String,HashMap<String,String>> result,String sheetName,Integer maxSheetSize) throws Exception
{
try
{
CellStyle cellStyle=POIUtils.getCellStyleFont(wb,null);
List titles = new ArrayList();
List beanAttrNames = new ArrayList();
List widthList = new ArrayList();
HashMap<String,String> dateMap=new HashMap<String, String>();
String[] header = new String[listName.size()];
int rows_max = 0;//标题占多少列
List flagList=new ArrayList();
boolean flagListExists=false;
for (int i=0;i<listName.size();i++)
{
String[] str=listName.get(i).split("&");
String en_name=str[0];
String zh_name=str[1];
beanAttrNames.add(i,en_name);
titles.add(i, zh_name);
header[i]=zh_name;
if (zh_name.split("_").length > rows_max) {
rows_max = zh_name.split("_").length;
}
if(str.length>2){
String flag=str[2];
flagList.add(i,flag);
if(!flagListExists)
flagListExists=true;
}
if(str.length>3){
widthList.add(str[3]);
}
if(str.length>4){
dateMap.put(en_name, str[4]);
}
}
PropertyDescriptor[] props =null;
int size=beans==null?0:beans.size();
HSSFSheet sheet=null;
//如果没有数据,导出表头
if(size==0){
sheet=ExcelHeadUtils.getExcelHead2003(wb, header, sheetName);
setColumnWidth2003(widthList, sheet,beanAttrNames.size());
sheet.setDefaultRowHeight((short)350);//高度
return ;
}
for (int i = 0; i < size ; i++) {
int remainder=i%maxSheetSize;
if(size==0 || i==0 || remainder==0){
sheet=ExcelHeadUtils.getExcelHead2003(wb, header, sheetName+(i/maxSheetSize));
sheet.createFreezePane( 1, rows_max, 1, rows_max);
setColumnWidth2003(widthList, sheet,beanAttrNames.size());
sheet.setDefaultRowHeight((short)350);//高度
}
if(props==null)
props= Introspector.getBeanInfo(beans.get(0).getClass()).getPropertyDescriptors();
Object bean = beans.get(i);
HSSFRow row = sheet.createRow(remainder+rows_max);
for (int j = 0; j < beanAttrNames.size(); j++) {
String beanAttrName = (String)beanAttrNames.get(j);
String flag=null;
if(flagListExists)
flag=(String)flagList.get(j);
for (int k = 0; k < props.length; k++) {
String propName = props[k].getName();
if (propName.equals(beanAttrName))
{
String pattern=dateMap.get(beanAttrName);
HSSFCell cell = row.createCell((short)j);
Object cellValue = callGetter(bean, props[k],pattern);
if("true".equalsIgnoreCase(flag)){
if(result!=null){
HashMap<String,String> hash=result.get(beanAttrName);
if(hash!=null)
cellValue=hash.get(cellValue);
}
}
if (cellValue == null) {
cellValue = "";
}
setExcelCellText2003(cell, cellValue.toString(),cellStyle);
}
}
}
}
} catch (Exception e) {
throw new Exception(e);
}
}
/**
* 03,WPS:EXCEL导出,单元格设置
* @param cell 单元格对象
* @param text 单元格文本内容
* @param cellStyle 单元格格式
*/
private static void setExcelCellText2003(HSSFCell cell, Object text,CellStyle cellStyle)
{
cell.setCellValue(text.toString());
cell.setCellType(1);//单元格类型
cell.setCellStyle(cellStyle);
}
/**
* 03,WPS:EXCEL导出,单元格宽度设置
* @param widthList 列宽集合
* @param sheet sheet对象
* @param allSize 总列数
*/
private static void setColumnWidth2003(List widthList,HSSFSheet sheet,int allSize){
if(widthList!=null && widthList.size()>0){
int size=widthList.size();
for (int i = 0; i < size; i++) {
try {
Integer width=Integer.parseInt((String) widthList.get(i));
sheet.setColumnWidth((short) i,width*256);
} catch (NumberFormatException e) {
continue;
}
}
}else{
for (int i = 0; i < allSize; i++) {
try {
sheet.setColumnWidth((short) i,COLUMN_WIDTH_WORD*256);
} catch (NumberFormatException e) {
continue;
}
}
}
}
/**
* 根据反射,获取实体属性的值
* @param target 实体属性
* @param prop 反射调用类
* @param pattern 日期格式
* @return
*/
private static Object callGetter(Object target, PropertyDescriptor prop,String pattern) {
Object o = null;
if (prop.getReadMethod() != null) {
try {
o = prop.getReadMethod().invoke(target, null);
if (Date.class.equals(prop.getPropertyType())) {
if(pattern!=null && !"".equals(pattern)){
try {
o = new SimpleDateFormat(pattern).format(o);
} catch (Exception e) {
o = new SimpleDateFormat(PATTERN).format(o);
}
}else{
o = formatDate(o);
}
}
} catch (Exception e) {
o = null;
}
}
return o;
}
/**
* 日期转换
* @param date
* @return 字符串的日期
*/
private static String formatDate(Object date) {
if(date==null)
return "";
String dateStr = new SimpleDateFormat(DATE_HH_PATTERN).format(date);
if("00:00:00".equals(dateStr)){
return new SimpleDateFormat(DATE_PATTERN).format(date);
}
return new SimpleDateFormat(PATTERN).format(date);
}
}
然后看看效果吧: