上次不好意思。发这个贴没写完。被弄为隐藏帖了。
使用注解导出Excel主要使用了POI包和反射原理,使得导出段可以灵活配置,并且不需要额外的配置文件
1:注解代码:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author 1097877378
*
*/
@Target(value = ElementType.METHOD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface ExportColumn {
/**
* 列名
*/
public String[] name() default {};//为什么用数组,大家想一下
/**
* 格式化字符串
*/
public String format() default "";
/**
* 导出次序
*/
public int order() default 0;
}
2:在需要导出的DTO或实体中对需要导出的字段配置导出注解
示例:
import java.sql.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import =ExportColumn;
public class Users {
private Long id;
private String name;
private String password;
private Date birthday;
public Long getId() {
return id;
}
@ExportColumn(name={"姓名"})
public String getName() {
return name;
}
@ExportColumn(name={"密码"})
public String getPassword() {
return password;
}
@ExportColumn(format="%1$tY-%1$tm-%1$td", name={"生日"})
public Date getBirthday() {
return birthday;
}
...省略get,set
3:导出类,利用反射原理:
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import ExportColumn;
public class ExportExcelUtil {
/**
* 导出Excel文件到输出流
* @param response
* @throws IOException
*/
public static <T> void exportExcel(List<T> data, String fileName, HttpServletResponse response) throws Exception {
response.reset();
//fileName = URLEncoder.encode(fileName, "UTF-8");//only IE
fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");//IE and FireFox
response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xls");// 设定输出文件头
response.setContentType("application/msexcel");// 定义输出类型
HSSFWorkbook workbook = createWorkbook(data);
OutputStream os = response.getOutputStream();// 取得输出流
workbook.write(os);
os.flush();
os.close();
}
private static <T> HSSFWorkbook createWorkbook(List<T> data) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
HSSFWorkbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("sheet1"); {
createHeader(sheet, data.get(0));
createBody(sheet, data);
}
return workbook;
}
private static <T> void createHeader(Sheet sheet, T dataRow) {
Row header = sheet.createRow(0);
Method[] methods = dataRow.getClass().getMethods();
Arrays.sort(methods, new Comparator<Method>() {
public int compare(Method o1, Method o2) {
return o1.getName().compareTo(o2.getName());
}});
int cellindex = 0;
for(Method method : methods) {//取得DTO的导出列
if (method.isAnnotationPresent(ExportColumn.class)) {
ExportColumn export = method.getAnnotation(ExportColumn.class);
String[] titles = export.name();
Cell headerCell = header.createCell(cellindex);
headerCell.setCellValue(titles[0]);
cellindex ++;
}
}
}
private static <T> void createBody(Sheet sheet, List<T> data) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
if (!data.isEmpty()) {
int rowindex = 1;
for (T datarow : data) {
Row sheetrow = sheet.createRow(rowindex);
Method[] methods = datarow.getClass().getMethods();
Arrays.sort(methods, new Comparator<Method>() {
public int compare(Method o1, Method o2) {
return o1.getName().compareTo(o2.getName());
}});
int cellindex = 0;
for(Method method : methods) {//取得DTO的导出列
if (method.isAnnotationPresent(ExportColumn.class)) {
Object cellvalue = (Object)method.invoke(datarow);
Cell sheetcell = sheetrow.createCell(cellindex);
if (null != cellvalue) {
ExportColumn export = method.getAnnotation(ExportColumn.class);
String cellstr = cellvalue.toString();
if (!export.format().equals("")){
cellstr = String.format(export.format(), cellvalue);//按注解格式化
}
sheetcell.setCellValue(cellstr);
}
cellindex ++;
}
}
rowindex ++;
}
}
}
}
4: 搞定:导出时执行
得到Users 的list
ExportExcelUtil.exportExcel(usersList, "人员信息表", response);
这个是个比较老的版本,现在已经把注解和ExportExcelUtil升级了,不过还没有高强度测试。。
欢迎大家提出意见
分享到:
相关推荐
在J2EE项目开发中,Excel...综上所述,J2EE项目开发中的Excel导出涉及到Java编程、Apache POI库的使用以及数据处理技巧。提供的示例可以帮助开发者快速理解和实施这一功能,从而在实际项目中高效地完成数据导出任务。
在J2EE应用程序开发中,数据的导入导出是一项常见的需求,特别是在处理大量结构化数据时,Excel文件因其直观易用的特点,成为了理想的数据交换格式。本组件专注于解决这一问题,提供了一套完整的J2EE项目开发中进行...
在J2EE项目开发中,Excel的导入导出功能是一个常用且重要的部分,尤其是在处理大量数据时。这个组件源代码提供了实现这一功能的解决方案。让我们深入探讨一下相关知识点。 1. **J2EE基础**: J2EE,即Java 2 ...
本文将详细讲解如何使用J2EE平台结合开源库Jxl来实现Excel的导出功能,同时也会涉及到Java的反射机制。 J2EE(Java 2 Platform, Enterprise Edition)是Java平台上用于构建企业级应用的框架,它提供了服务器端组件...
在Java企业级应用开发中,J2EE组件是构建复杂应用程序的关键部分。这些组件提供了丰富的功能,使得开发者能够高效地处理各种业务需求。本压缩包包含的四个主要组件——验证码、上传下载、分页和导出Excel,都是Web...
总之,这个J2EE项目开发的Excel导入导出组件利用了Java的Apache POI库,实现了高效且灵活的Excel数据处理。开发者可以通过学习和使用这个组件,快速地在自己的项目中实现Excel数据的导入导出功能,提升开发效率,...
对于J2EE项目导入导出Excel是最普通和实用功能,本工具类使用步骤简单,功能强大,只需要对实体类进行简单的注解就能实现导入导出功能,导入导出操作的都是实体对象. 请看一下这个类都有哪些功能: * 1.实体属性配置了...
对于J2EE项目导入导出Excel是最普通和实用功能,本工具类使用步骤简单,功能强大,只需要对实体类进行简单的注解就能实现导入导出功能,导入导出操作的都是实体对象. 看看这个类都有哪些功能吧: * 1.实体属性配置了注解...
在这个场景中,我们关注的是如何使用Java J2EE来处理Excel文档,特别是通过Apache POI库进行读写操作,并涉及到XSL转换。 Apache POI是一个开源项目,专门用于读取和写入Microsoft Office格式的文件,包括Excel(....
### J2EE使用详解 #### 一、J2EE简介及安装配置 ##### 1.1 J2EE概述 J2EE(Java 2 Platform, Enterprise Edition)是Sun Microsystems为开发企业级应用而设计的一个软件平台。它基于Java 2 SDK, Standard Edition...
包含的“J2EE项目开发Excel导入导出操作组件源代码(附带说明文档)”很可能是项目开发的指南,详细解释了源码的使用方法、注意事项以及可能出现的问题,这对于理解和使用这些源码非常有帮助。 通过学习这个源码,...
本知识点主要围绕如何在J2EE环境中使用Ant来生成Excel文件并提供下载服务进行讲解。 首先,我们要理解Ant的核心概念。Ant是一个基于XML的构建工具,它的主要配置文件是`build.xml`,其中定义了各种构建任务。通过...
对于J2EE项目导入导出Excel是最普通和实用功能, 本工具类使用步骤简单,功能强大,只需要对实体类进行简单的注解就能实现导入导出功能,导入导出操作的都是实体对象. 看看这个类都有哪些功能吧: * 1.实体属性配置了...
4. **报表编译与执行**:在J2EE应用中,你需要将jrxml文件编译为.jasper二进制文件,然后通过Java代码调用JasperFillManager填充数据并使用JasperExportManager导出报表。编译过程通常使用JasperCompileManager,而...
j2ee j2ee j2ee j2ee j2ee j2ee j2ee j2ee j2ee
j2ee Filter使用原理本代码里面首先是介绍了Filter实现的原理,然后模拟的了j2ee项目中Filter的使用原理,然后由此又延伸了Struts2的Interceptor实现原理,并且给予了详细的注释。
它包括了组成J2EE平台的技术以及描述如何开发J2EE组件并部署在J2EE软件开发包上。 这篇指南不是为J2EE服务器及工具供应商准备的,它没有解释如何实现J2EE结构,也没有解释J2EE软件包。J2EE规范描述了J2EE结构并可以...
j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar架包j2ee.jar...
### J2EE 指南知识点详解 #### J2EE 概述 J2EE(Java 2 Platform, Enterprise Edition)是一种广泛应用于企业级应用程序开发的平台标准和技术框架。它基于Java SE,并针对大型分布式系统提供了更为丰富的特性和功能...
J2EE开发使用手册(PDF)