`
zhxp791008
  • 浏览: 31898 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

扩展Struts2,傻瓜化将数据导出为excel

阅读更多
以前做开发,在有数据导出为excel的时候,不加思索就一个cell一个cell地拼凑完成一个excel内存流,输入出到客户端了事,有天想这些代码80%都是重复的,能不能不那么麻烦地ctrl c、ctrl v来做这件事。尝试了下,还可以。(代码部份中是演示)
首先定义一个Annotation
@Retention(RetentionPolicy.RUNTIME)
public @interface Excel {
String title() default "";
}

在需要导出为excel的类上加上此Excel注解,如:
class User {
public User(String name, Integer age) {
  this.name = name;
  this.age = age;
}
private String name;
private Integer age;
@Excel(title = "姓名")
public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
@Excel(title = "年龄")
public Integer getAge() {
  return age;
}
public void setAge(Integer age) {
  this.age = age;
}
}



现在相当于配置内容有了,只需写一个工具类,完成向excel数据格式的转换。
这有个简单实现:
public static void export(List list, OutputStream os) {
  List<String> titles = new ArrayList<String>();
  Hashtable<String, List> data = parseData(list, titles);
  try {
   builderExcel(data, titles, list.size(), os);
  } catch (Exception e) {
   e.printStackTrace();
  }
}
private static void builderExcel(Hashtable<String, List> data,
   List<String> titles, int len, OutputStream os) throws Exception {
  WritableWorkbook workbook = Workbook.createWorkbook(os);
  WritableSheet ws = workbook.createSheet("sheet1", 0);//
  for (int i = 0; i < titles.size(); i++) {
   Label labelC = new Label(i, 0, titles.get(i));
   ws.setColumnView(i, 20);
   ws.addCell(labelC);
   
  }
  for (int i = 0; i < len; i++) {
   for (int j = 0; j < titles.size(); j++) {
    List<Object> context = data.get(titles.get(j));
    Object o = context.get(i);
    WritableCell labelC = null;
    if (o instanceof String) {
     labelC = new Label(j, i + 1, o.toString());
    } 
    else if(o instanceof Double)
    {
     labelC = new Number(j, i + 1, (Double)o);
    }
    else if(o instanceof Date)
    {
     labelC = new DateTime(j, i + 1, (Date)o);
    }
    ws.addCell(labelC);
   }
  }
  workbook.write();
  workbook.close();
}
private static Hashtable parseData(List list, List titles) {
  Hashtable<String, List> data = new Hashtable<String, List>();
  for (Object obj : list) {
   Method[] methods = obj.getClass().getMethods();
   for (Method m : methods) {
    if (m.isAnnotationPresent(Excel.class)) {
     Excel excel = m.getAnnotation(Excel.class);
     String title = excel.title();
     List<Object> cols = data.get(title);
     if (cols == null) {
      titles.add(title);
      cols = new ArrayList<Object>();
     }
     try {
      cols.add(m.invoke(obj));
     } catch (IllegalArgumentException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } catch (IllegalAccessException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     } catch (InvocationTargetException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
     data.put(title, cols);
    }
   }
  }
  return data;
}
}


最后一步,扩展struts2的resulttype.
public class ExcelResult extends StrutsResultSupport { 
    private String dataList = "dataList"; 
    private String fileName = "fileName"; 
    protected void doExecute(String arg0, ActionInvocation actionInvocation) 
     throws Exception { 
ActionContext ctx = actionInvocation.getInvocationContext(); 
HttpServletRequest request = (HttpServletRequest) ctx 
  .get(org.apache.struts2.StrutsStatics.HTTP_REQUEST); 
HttpServletResponse response = (HttpServletResponse) ctx 
  .get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE); 
String excelfile = (String) request.getAttribute(fileName); 
setXlsHeader(response, excelfile); 
OutputStream os = response.getOutputStream(); 
List list = (List) request.getAttribute(dataList); 
ExcelExporter.export(list, os); 
os.close(); 
    } 
    public void setDataList(String dataList) { 
this.dataList = dataList; 
    } 
    public void setFileName(String fileName) { 
this.fileName = fileName; 
    } 
    private void setXlsHeader(HttpServletResponse rs, String fn) 
     throws UnsupportedEncodingException { 
rs.setContentType("application/vnd.ms-excel"); 
String fileName = new String(fn.getBytes("GBK"), "ISO-8859-1"); 
rs.setHeader("Content-disposition", "attachment; filename=" + fileName); 
    } 
} 

现在看看程序员需要做的事:
List<User> userList = userService.findAll();
request.setAttribute("dataList",userList);

在struts2的配置文件中加入
<result name="success" type="excel">
</result>
当然你得在需要导出的类中加入Excel的注解和定义一下excel的resulttype.
3
0
分享到:
评论
1 楼 yoyo837 2011-11-15  
如果一开始导出 加进度框,如何知道文件导出完成从而取消进度框呢

相关推荐

    Struts2 Excel导入导出数据

    本教程将深入探讨如何利用Struts2实现从Oracle数据库导出数据到Excel,以及如何将Excel文件中的数据导入到Oracle。 首先,我们需要了解Oracle数据库的基础知识。Oracle是世界上最广泛使用的商业关系型数据库管理...

    struts2 poi导出到excel

    Struts2和Apache POI是Java开发中处理Web应用程序数据导出到Excel的常用工具。Struts2是一个基于MVC设计模式的Java EE框架,它提供了强大的动作控制、拦截器和结果类型等功能,使得Web应用的开发更加简洁高效。而...

    Java Struts2+poi插件 实现导出Excel

    这个项目"Java Struts2+poi插件 实现导出Excel"就是结合这两个工具,为用户提供一个功能,能够将数据导出到Excel格式的文件中。 首先,让我们详细了解一下Struts2。Struts2的核心是Action,它负责接收请求、处理...

    struts2导出excel java 导出excel JXL

    struts2导出excel java 导出excel: JXL_excel: 可以直接在elipse下运行的例子 可以直接导出excel文件(包含所需的jar包) CSharpJExcel: 是JXL的官方下载的 包括详细的文档 和jar包

    Struts2文件流方式导出下载excel、Txt、image图片

    2. **配置struts.xml**:在Struts2的配置文件中,我们需要为这个Action添加相应的配置,指定返回的`StreamingResult`结果类型和对应的视图。 ```xml &lt;param name="contentType"&gt;application/octet-stream ...

    JSP Struts2 分页 导出Excel

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

    struts2实现excel导出

    以下将详细介绍如何利用Struts2和POI实现Excel导出。 首先,你需要在项目中引入Apache POI库。在上述描述中提到的版本是`poi-bin-3.2-FINAL-20081019.zip`,但请确保使用当前的稳定版本,因为随着时间的推移,POI会...

    struts2+poi实现导出Excel文件

    Struts2 和 Apache POI 的结合使用主要集中在创建 Web 应用程序中导出 Excel 文件的功能上。Apache POI 是一个 Java 库,允许开发者创建、修改和显示 Microsoft Office 格式的文件,其中包括 Excel。而 Struts2 是一...

    Struts2数据库数据导入导出

    运用struts2将数据库中的数据导入和导出,同时会用到poi的jar包

    struts2中利用poi导出excel

    本篇文章将深入探讨如何在Struts2框架中使用POI库来导出Excel文件。 首先,我们需要在项目中引入Apache POI库。可以通过Maven或Gradle将其添加到构建文件中。对于Maven,可以在pom.xml文件中添加以下依赖: ```xml...

    Struts2+poi 实现从数据库中导出excel表

    Struts2 poi 实现从数据库中导出excel表

    struts2+poi实现excel表格导出

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

    struts2导出excel笔记

    在Struts2中,导出Excel是常见的需求,通常用于数据报表或数据分析。这篇笔记将探讨如何在Struts2中实现Excel的导出功能。 首先,我们需要了解Excel的基本概念。Excel是由Microsoft开发的一款电子表格软件,广泛...

    将数据导成excel

    这里,我们关注的是如何利用Struts2框架将数据转化为Excel格式。Struts2是一个流行的Java web开发框架,它提供了丰富的功能来处理用户请求并返回响应,包括导出数据到Excel。 首先,我们来看`ImportEmployee.java`...

    整合struts2 ssh导出excel

    Struts2、SSH(Spring、Struts2、Hibernate)是Java Web开发中常见的三大框架,它们各自负责不同的职责,Spring管理应用的业务层,Struts2处理表现层,Hibernate则负责数据持久化。本篇文章将深入探讨如何在Struts2...

    struts2Ecxel导入导出

    在Struts2中实现Excel的导入和导出功能,可以帮助用户处理大量的数据,例如批量导入数据库,或者允许用户下载数据为Excel格式进行分析。下面我们将深入探讨Struts2中Excel导入导出的关键知识点。 一、Apache POI库 ...

    Struts2 poi动态导入导出Excel源码示例

    Struts2是一个流行的Java web开发框架,它提供了一种模型-视图-控制器(MVC)架构,使得开发者可以更方便地构建可维护、可扩展的Web应用。在本示例中,Struts2被用来处理HTTP请求和响应,协调前端视图与后端业务逻辑...

    struts2+poi 实现Excel导出

    在"Struts2+POI实现Excel导出"的场景中,开发者可以利用这两个工具为用户提供数据导出到Excel的功能。以下是一些关键知识点: 1. **Struts2框架**:Struts2是Action Servlet的一种实现,它是基于拦截器的MVC框架,...

    Struts2+Excel导出Demo,测试可用带JAR包

    在Web应用中,有时我们需要将数据库中的数据导出为Excel格式,方便用户进行进一步的操作或分析。这个"Struts2+Excel导出Demo"就是实现这一功能的一个实例。 首先,Struts2与Excel导出的结合主要涉及到以下几个关键...

    struts1.2+extjs+导出excel项目

    这个项目的重点在于整合Struts1.2(一个经典的MVC框架)与ExtJS(一个富客户端JavaScript库)来提供用户友好的界面,并利用功能来导出数据到Excel格式,这在数据分析、报表生成和数据共享方面非常常见。 Struts1.2...

Global site tag (gtag.js) - Google Analytics