`
shangwangwuzui1988
  • 浏览: 11506 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

Struts2导出Excel步骤及问题汇总 poi分页

    博客分类:
  • poi
阅读更多

ps: 转载的struts2 + excel(poi)+sheet分页文章,在原有基础上修改了一点点内容。这篇文章主要讲解通过annotation的方式配置导出excle(poi)的方式,比原始方式简单,方便操作。另外,文章汇总涉及到了sheet分页,换句话说可以支持大数据的导出。原文作者亲测测试30W条数据导出时失败(内存溢出),我自己测试时30W可以导出,甚至50W都没问题,可能是内存的限制吧,我想通过增大内存的方式,可以导出更多条数据。 但是不建议一次导出这么多数据,这种方式不是什么好的处理方式。

原文地址:http:/jingyan.baidu.com/article/9158e00071b9e5a25412288d.html--------------------------------------------------分页线--------------------------------------------------
   最近开发项目中遇到了很多问题,终于可以在空闲的时候总结一下,今天要汇总的是Excel下载导出等相关问题,主要涉及到问题,如下:
   1. 生成Excel
   2. 大数据Excel导出(支持多个sheet,亲测可以导出30W数据,再大程序报内存溢出)
   3. 下载文件,及中文文件名下载乱码,为空等问题

 

所需jar包: poi-3.8.jar、poi-ooxml-3.8.jar

 

方法步骤

步骤一: 添加Excel标题对象

/**
 * 用来存储Excel标题的对象,通过该对象可以获取标题和方法的对应关系
 * 
 * @author 
 * 
 */
public class ExcelHeader implements Comparable<ExcelHeader> {
	/**
	 * excel的标题名称
	 */
	private String title;
	/**
	 * 每一个标题的顺序
	 */
	private int order;
	/**
	 * 说对应方法名称
	 */
	private String methodName;
public String getTitle() {
		return title;
	}
public void setTitle(String title) {
		this.title = title;
	}
public int getOrder() {
		return order;
	}
public void setOrder(int order) {
		this.order = order;
	}
public String getMethodName() {
		return methodName;
	}
public void setMethodName(String methodName) {
		this.methodName = methodName;
	}
public int compareTo(ExcelHeader o) {
		return order > o.order ? 1 : (order < o.order ? -1 : 0);
	}
public ExcelHeader(String title, int order, String methodName) {
		super();
		this.title = title;
		this.order = order;
		this.methodName = methodName;
	}
@Override
	public String toString() {
		return "ExcelHeader [title=" + title + ", order=" + order
				+ ", methodName=" + methodName + "]";
	}
}

 步骤二:定义annotation类,可以通过该类设置导出相应的属性,标题及排序

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
 * 用来在对象的get方法上加入的annotation,通过该annotation说明某个属性所对应的标题
 * @author Administrator
 *
 */
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelResources {
	/**
	 * 属性的标题名称
	 * @return
	 */
	String title();
	/**
	 * 在excel的顺序
	 * @return
	 */
	int order() default 9999;
}

 步骤三:操作Excel,设置Excel标题样式,sheet名称,sheet每页显示条数等信息(struts2+excel(poi)+sheet分页)
说明: Excel样式部分内容可以自己扩展区,这里我也没有做过的的扩展

 

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Workbook;
/**
 * Excel 操作类
 * 
 * @author 
 * 
 */
@SuppressWarnings("unchecked")
public class ExcelUtil {
private static final String POSITION_TITLE = "title";
private static final String POSITION_BODY = "body";
private static ExcelUtil eu = new ExcelUtil();
private ExcelUtil() {
	}
public static ExcelUtil getInstance() {
		return eu;
	}
/**
	 * 导出对象到Excel,不是基于模板的,直接新建一个Excel完成导出,基于路径的导出
	 * 
	 * @param outPath
	 *            输出路径
	 * @param objs
	 *            数据源
	 * @param clz
	 *            类
	 * @param sheetName
	 *            分sheet导出是sheet的名字 , 如 “sheet” -> sheet1,sheet2...
	 * @param pageSize
	 *            每个sheet要显示多少条数据
	 */
	public void exportObj2Excel(String outPath, List objs, Class clz,
			String sheetName, int pageSize) {
		Workbook wb = handleObj2Excel(objs, clz, sheetName, pageSize);
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(outPath);
			wb.write(fos);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (fos != null)
					fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
/**
	 * 导出对象到Excel,不是基于模板的,直接新建一个Excel完成导出,基于路径的导出
	 * 
	 * @param outPath
	 *            输出路径
	 * @param objs
	 *            数据源
	 * @param clz
	 *            类
	 * @param sheetName
	 *            分sheet导出是sheet的名字 , 如 “sheet” -> sheet1,sheet2...
	 * @param pageSize
	 *            每个sheet要显示多少条数据
	 */
	public HSSFWorkbook handleObj2Excel(List objs, Class clz, String sheetName,
			int pageSize) {
		HSSFWorkbook wb = null;
		try {
			wb = new HSSFWorkbook();
			// TODO 获取表头
			List<ExcelHeader> headers = getHeaderList(clz);
			Collections.sort(headers);
if (null != objs && objs.size() > 0) {
int sheetCount = objs.size() % pageSize == 0 ? objs.size()
						/ pageSize : objs.size() / pageSize + 1;
for (int i = 1; i <= sheetCount; i++) {
HSSFSheet sheet = null;
					if(!StringUtils.isEmpty(sheetName)) {
						sheet = wb.createSheet(sheetName + i);
					} else {
						sheet = wb.createSheet();
					}
HSSFRow row = sheet.createRow(0);
// 写标题
					CellStyle titleStyle = setCellStyle(wb, POSITION_TITLE);
					for (int m = 0; m < headers.size(); m++) {
						HSSFCell cell = row.createCell(m);
						cell.setCellStyle(titleStyle);
						cell.setCellValue(headers.get(m).getTitle());
						sheet.setColumnWidth(m, 5000); // 设置每列的宽度
					}
// 写数据
					Object obj = null;
					CellStyle bodyStyle = setCellStyle(wb, POSITION_BODY);
					int begin = (i - 1) * pageSize;
					int end = (begin + pageSize) > objs.size() ? objs.size()
							: (begin + pageSize);
System.out.println("begin:" + begin + ",end=" + end);
int rowCount = 1;
					for (int n = begin; n < end; n++) {
						row = sheet.createRow(rowCount);
						rowCount++;
						obj = objs.get(n);
						for (int x = 0; x < headers.size(); x++) {
							Cell cell = row.createCell(x);
							cell.setCellStyle(bodyStyle);
							cell.setCellValue(BeanUtils.getProperty(obj,
									getMethodName(headers.get(x))));
						}
					}
}
			}
} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException("生成excel失败");
		}
		return wb;
	}
/**
	 * 根据标题获取相应的方法名称
	 * 
	 * @param eh
	 * @return
	 */
	private String getMethodName(ExcelHeader eh) {
		String mn = eh.getMethodName().substring(3);
		mn = mn.substring(0, 1).toLowerCase() + mn.substring(1);
		return mn;
	}
/**
	 * 获取excel标题列表
	 * 
	 * @param clz
	 * @return
	 */
	private List<ExcelHeader> getHeaderList(Class clz) {
		List<ExcelHeader> headers = new ArrayList<ExcelHeader>();
		Method[] ms = clz.getDeclaredMethods();
		for (Method m : ms) {
			String mn = m.getName();
			if (mn.startsWith("get")) {
				if (m.isAnnotationPresent(ExcelResources.class)) {
					ExcelResources er = m.getAnnotation(ExcelResources.class);
					headers.add(new ExcelHeader(er.title(), er.order(), mn));
				}
			}
		}
		return headers;
	}
/**
	 * 设置单元格样式
	 * 
	 * @param position
	 *            ["body","title"]
	 */
	private static CellStyle setCellStyle(Workbook workBook, String position) {
CellStyle cellStyle = workBook.createCellStyle();
		cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		// 设置单元格字体
		Font headerFont = workBook.createFont(); // 字体
		if (POSITION_TITLE.equals(position)) {
			headerFont.setFontHeightInPoints((short) 12);
		} else {
			headerFont.setFontHeightInPoints((short) 10);
		}
		headerFont.setFontName("宋体");
		if (POSITION_TITLE.equals(position))
			headerFont.setBoldweight((short) 10);
		cellStyle.setFont(headerFont);
		cellStyle.setWrapText(true);
cellStyle.setFillBackgroundColor(HSSFCellStyle.THICK_FORWARD_DIAG);
		// 设置单元格边框及颜色
		cellStyle.setBorderBottom((short) 1);
		cellStyle.setBorderLeft((short) 1);
		cellStyle.setBorderRight((short) 1);
		cellStyle.setBorderTop((short) 1);
		cellStyle.setWrapText(true);
cellStyle.setLeftBorderColor(HSSFColor.BLACK.index); // 设置边框颜色
		cellStyle.setRightBorderColor(HSSFColor.BLACK.index);
		cellStyle.setTopBorderColor(HSSFColor.BLACK.index);
		cellStyle.setBottomBorderColor(HSSFColor.BLACK.index);
return cellStyle;
	}
}

 步骤四:导出对象实体类,实际项目中这个类可以有更多的属性

import java.io.Serializable;
import java.util.Date;
import com.monkey.poi.util.ExcelResources;
public class ProductCard implements Serializable {
private static final long serialVersionUID = -70571478472359104L;
private Integer id;
private String code;
private String codePwd;
public Integer getId() {
		return id;
	}
public void setId(Integer id) {
		this.id = id;
	}
@ExcelResources(title = "卡号", order = 1)
	public String getCode() {
		return code;
	}
public void setCode(String code) {
		this.code = code;
	}
@ExcelResources(title = "密码", order = 2)
	public String getCodePwd() {
		return codePwd;
	}
public void setCodePwd(String codePwd) {
		this.codePwd = codePwd;
	}
}

 步骤五: junit测试

@Test
   public void test002() {
       List<ProductCard> pcList = new ArrayList<ProductCard>();
       for (int i = 0; i < 300000; i++) {
           ProductCard p = new ProductCard();
           p.setCode(DateUtils.formatDate(DateUtils.DATE_PATTERN_PLAIN,new Date()));
           p.setCodePwd("123456" + i);
           
           pcList.add(p);
       }
       
       ExcelUtil.getInstance().exportObj2Excel("d:/product-1.xls", pcList,
               ProductCard.class, "我的sheet", 10000);
   }

 

注意事项:

  1. Excel样式部分我是按照我们项目中的所用的格式导出,各位在自己项目中可以自己定义
  2. Excel可以分开单独显示不同的
  3. 下载部分请查考下一篇文章

参考资料:

http:/jingyan.baidu.com/article/9158e00071b9e5a25412288d.html

分享到:
评论

相关推荐

    struts2导出Excel poi

    总结来说,通过Struts2和Apache POI的结合,你可以轻松实现从SQL Server数据库导出数据到Excel的功能。这种方式适用于初学者,因为它具有清晰的步骤和简单的代码结构。在实际项目中,你可能需要考虑更多细节,比如...

    JSP Struts2 分页 导出Excel

    **JSP Struts2 分页 导出Excel** 在Web开发中,经常需要处理大量数据,这时分页显示和导出功能就显得尤为重要。JSP(JavaServer Pages)和Struts2作为Java Web开发中的常见技术,可以帮助我们构建动态、交互的网页...

    struts2导出excel笔记

    通过以上步骤,我们可以实现一个简单的Struts2应用,该应用能够根据用户请求,使用Apache POI库动态生成并导出Excel文件。在实际项目中,可能还需要考虑数据过滤、排序、分页等功能,以及与数据库的交互,这些都可以...

    struts2导出excel.rar

    Struts2是一个非常流行的Java Web框架,用于构建企业...通过这个压缩包,开发者可以获得关于如何在Struts2框架下使用Apache POI实现Excel导出的完整示例,这对于任何涉及数据导出的Struts2项目都是一个宝贵的参考资料。

    struts2+poi实现excel表格导出

    Struts2和Apache POI是Java开发中两个重要的工具,它们在处理Web应用程序中的数据导出,特别是Excel表格导出方面发挥着重要作用。Struts2是一个基于MVC设计模式的Web应用框架,它极大地简化了Java Web开发。而Apache...

    整合struts2 ssh导出excel

    通过以上步骤,你可以在Struts2与SSH集成的环境中实现Excel文件的导出功能。这个过程涉及到了前端请求处理、后端数据生成、文件流的读写以及框架间的协作。在实际开发中,可能还需要根据具体需求进行调整和优化。

    基于struts2 spring ibatis poi开发的导出Excel实例

    【基于Struts2 Spring iBatis POI开发的导出Excel实例详解】 在现代Web应用程序中,导出数据到Excel格式是一种常见的需求,这有助于用户分析、存储或共享信息。本实例将详细介绍如何利用Struts2、Spring和iBatis...

    struts2实现excel导出

    通过以上步骤,你就可以在Struts2应用中实现Excel导出了。需要注意的是,实际项目中可能需要处理更复杂的需求,例如分页、过滤、排序等,你可能需要根据实际情况对上述代码进行扩展和优化。同时,为了保证性能,避免...

    s2sh实现登录验证码,分页,报表,导出到excel

    在这个主题中,我们将探讨S2SH如何实现登录验证码、分页功能、报表生成以及数据导出到Excel的功能。 首先,登录验证码是为了防止恶意自动化程序(如机器人)对系统的非法访问。在S2SH框架中,我们可以使用第三方库...

    java导出excel实例

    总结来说,这段代码展示了如何在Java中使用Struts2和Apache POI库来处理用户请求,从数据库中获取数据,创建并导出Excel文件,以及处理分页。在实际开发中,还需要考虑异常处理、性能优化、用户体验(如下载进度提示...

    Spring集成struts2、ibatis、dwr、poi实现的demo

    使用Spring集成struts2、ibatis、poi实现的增删改查功能,包括采用jquery实现的无刷新查询机分页、dwr实现的两级联动、以及采用poi动态将数据库数据导出成excel,本demo采用mysql数据库,附有建表sql,项目导入...

    Java将数据导出Excel.docx

    总结起来,Java将数据导出到Excel涉及以下关键步骤: 1. 创建Excel对象并设置标题、列名和文件名。 2. 获取数据源,如数据库中的用户信息。 3. 遍历数据,将每条记录转换为Excel行数据。 4. 使用Apache POI或其他...

    基于easyui的通用导出

    后端接收到请求后,根据这些标识查询数据库,获取对应的数据,然后使用像Apache POI这样的库来创建Excel文件。NewXLSExport类可能会包含处理这些逻辑的方法,如`exportToExcel()`,它可能接收请求参数,处理数据,...

    Struts2 + JasperReport应用一:导PDF,Excel,HTML显示

    首先,我们需要确保在项目中引入了必要的库,这可能包括Struts2的核心库、JasperReport库以及相关的依赖,例如iText(用于PDF生成)和Apache POI(用于Excel生成)。 1. **Struts2配置**: - 在`struts.xml`配置...

    struts2+spring+hibernate+生成报表

    总结起来,"struts2+spring+hibernate+生成报表"的组合利用了Struts2的请求处理能力,Spring的依赖注入和事务管理,Hibernate的数据持久化,以及Apache POI的Excel文件生成,共同实现了高效、灵活的报表生成系统。...

    “java+poi+模板”打造复杂excel报表.docx

    2. **编写Struts Action函数**:在Struts框架下,创建一个名为`ExcelExportAction`的动作类。当用户触发导出操作时,该函数会被调用。函数中,首先执行SQL查询获取需要的数据,然后指定输出报表的路径和文件名,以及...

    java 导出exlce报表

    在Struts2框架中,导出Excel报表的过程通常包括以下几个步骤: 1. **创建Excel工作簿**:使用Apache POI的HSSFWorkbook(对于.xls文件)或XSSFWorkbook(对于.xlsx文件)类创建一个新的工作簿对象。 ```java ...

    ssh框架整合分页--内部类回调函数

    1. **Struts2配置**:首先,我们需要在Struts2的配置文件(struts.xml)中定义一个用于分页的Action,设置其结果页面,并配置拦截器,确保请求的处理符合我们的需求。 2. **Hibernate整合**:Hibernate作为ORM框架...

    struts+spring+ibatis+mysql小例子

    在这个小例子中,我们将探讨如何利用这些技术实现分页、增删改查(CRUD)操作以及Excel数据导出。 1. **Struts框架**:Struts是一个基于MVC(Model-View-Controller)设计模式的开源Java Web框架,用于处理用户的...

    一个的完整的基于SSH的javaweb程序

    SSH(Struts2 + Spring + Hibernate)是Java Web开发中常用的一种框架集成,它结合了Struts2的MVC设计模式、Spring的依赖注入和事务管理以及Hibernate的对象关系映射功能,大大简化了企业级应用的开发流程。...

Global site tag (gtag.js) - Google Analytics