自己封装的POI + Struts2 实现Excel导出工具包

本文介绍了一种使用Apache POI结合Struts2框架实现Excel文件导出的方法,包括自定义注解、接口和服务实现等关键组件的设计与实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己封装的POI + Struts2 实现Excel导出工具包
2011年09月02日
   1、注解
  package lml.excel.annotation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * @author MerryGrass * 自定义注解 */ @Retention(RetentionPolicy.RUNTIME) public @interface PropertyAnnotation { /** * 属性名称描述 (默认值为 "Unknown") * @return String */ String PropertyName() default "Unknown"; /** * 属性索引键 (默认值为 "-1") * @return int */ int PropertySortKey() default -1; }
  2、接口
  /** * */ package lml.excel.service; import java.util.List; public interface CreateExcel { /** * 创建一个sheet * @param sheetName * sheet名字 */ public void createSheet(String sheetName); /** * 创建一行 */ public void createRow(); /** * 创建一个单元格 * @param cellNum * 单元格所属位置 */ public void createCell(int cellNum); /** * 设置一个单元格内容 * @param data * 单元格内容 * @param cellNum * 单元格所属位置 */ public void setCell(String data, int cellNum); /** * 设置标题内容 * @param title * 标题 * @return CreateExcel */ public CreateExcel setTitle(String title); /** * 设置表头内容 * @return CreateExcel */ public CreateExcel setHead(); /** * 设置单元格内容 * @param datas * 单元格数据 * @return CreateExcel */ public CreateExcel setCellData(List datas) throws Exception; }
  /** * */ package lml.excel.service; import java.util.List; public interface ExcelInfo { /** * 获取表头数据 * @return String[] 表头数据所组成的数组 */ public List getHeaders(); /** * 获取有效属性所对应的值 * @param obj * 对象 * @param methodName * 方法名 * @return String */ public String getContent(Object obj, String methodName) throws Exception; }
  package lml.excel.service; import java.io.InputStream; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public interface ExcelService { /** * 获取Excel * @param clazz * 类名 * @param datas * 数据 * @param title * 标题 * @return */ public InputStream getExcelInputStream(String clazz, List datas, String title,List fieldsName) throws Exception; /** * 创建Excel * @param clazz * 类名 * @param datas * 数据 * @param title * 标题 * @return */ public HSSFWorkbook createExcel(String clazz, List datas, String title,List fieldsName) throws Exception; }
  3、实现类
  package lml.excel.service.impl; import java.util.List; import lml.excel.service.CreateExcel; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; 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.Region; public class CreateExcelImpl implements CreateExcel { private HSSFWorkbook wb = null; private HSSFSheet sheet = null; private HSSFRow row = null; private HSSFCell cell = null; private ExcelInfoImpl excelInfo = null; private int rowNum = 0; //当前需要创建的行数,初始化为0 /** * 初始化HSSFWorkbook,并默认创建一个sheet * @param className * 类的全路径 */ public CreateExcelImpl(String className,List fieldsName){ wb = new HSSFWorkbook(); createSheet("sheet1"); excelInfo = new ExcelInfoImpl(className,fieldsName); } /** * 创建一个单元格 * @param cellNum * 单元格所属位置 */ public void createCell(int cellNum) { cell = row.createCell((short)cellNum); } /** * 创建一行,并把当前行加1 */ public void createRow() { row = sheet.createRow(rowNum); rowNum++; } /** * 创建一个sheet * @param sheetName * sheet名字 */ public void createSheet(String sheetName) { sheet = wb.createSheet(sheetName); } /** * 设置一个单元格内容 * @param data * 单元格内容 * @param cellNum * 单元格所属位置 */ public void setCell(String data, int cellNum) { createCell(cellNum); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(data); } /** * 设置单元格内容 * @param datas * 单元格数据 * @return 当前对象 */ public CreateExcelImpl setCellData(List datas) throws Exception{ List list = excelInfo.getPropertys(); for(int j = 0; j datas = excelInfo.getPropertyNames(); if(datas.size() == 0){ datas = excelInfo.getHeaders(); } createRow(); for(int i = 0; i propertys = new ArrayList(); //有效属性信息数组 List propertyNames = new ArrayList(); // 需导出字段 List fieldsName = new ArrayList(); //有效属性排序键 // List sortKey = new ArrayList(); /** * 得到类实例 * @param className * 类的全路径 */ public ExcelInfoImpl(String className,List fieldsName){ this.fieldsName = fieldsName; try{ clazz = Class.forName(className); }catch(Exception e){ e.printStackTrace(); } } /** * 获取有效属性所对应的值 * @param methodName * 有效属性 * @return String */ @SuppressWarnings("unchecked") public String getContent(Object obj, String methodName) throws Exception { String realMethodName = "get" + methodName.substring(0,1).toUpperCase() + methodName.substring(1); Method method = clazz.getMethod(realMethodName, new Class[]{}); if(null == method.invoke(obj, new Object[]{}) || "".equals(method.invoke(obj, new Object[]{}))){ return ""; }else{ return method.invoke(obj, new Object[]{}).toString(); } } /** * 获取表头数据 * @return String[] 表头数据所组成的数组 */ @SuppressWarnings("unchecked") public List getHeaders() { //得到类实例的所有属性 Field[] fields = clazz.getDeclaredFields(); //属性信息 String propertyName = ""; int PropertySortKey = 0; Map mapPropertys = new HashMap(); Map mapPropertyNames = new HashMap(); boolean flag = false; //通过循环比较得到有效属性 if(0 != this.fieldsName.size()){ for(int i = 0;i getPropertys() { return propertys; } /** * 获取有效属性信息 * @return */ public List getPropertyNames() { return propertyNames; } /** * 获取有效属性个数 * @return */ public int getNum() { num = getPropertys().size(); if(num == 0){ getHeaders(); num = getPropertys().size(); } return num; } }
  package lml.excel.service.impl; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import lml.excel.service.ExcelService; /** * 创建并获取Excel的服务类 * */ public class ExcelServiceImpl implements ExcelService { /** * 创建Excel * @param clazz * 类名 * @param datas * 数据 * @param title * 标题 * @return */ public HSSFWorkbook createExcel(String clazz, List datas, String title,List fieldsName) throws Exception{ CreateExcelImpl createExcel = new CreateExcelImpl(clazz,fieldsName); //创建标题、表头、以及单元格数据 createExcel.setTitle(title).setHead().setCellData( datas); return createExcel.getWb(); } /** * 获取Excel * @param clazz * 类名 * @param datas * 数据 * @param title * 标题 * @return */ public InputStream getExcelInputStream(String clazz, List datas, String title,List fieldsName) throws Exception { ByteArrayOutputStream os = new ByteArrayOutputStream(); try { createExcel(clazz, datas, title,fieldsName).write(os); } catch (IOException e) { e.printStackTrace(); } byte[] content = os.toByteArray(); InputStream is = new ByteArrayInputStream(content); return is; } }
  4、Demo Action
  package lml.sf.pojo.action; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import lml.base.BaseDAO; import lml.excel.service.impl.ExcelServiceImpl; import lml.sf.pojo.V_SF_STUINFO; import com.opensymphony.xwork2.ActionSupport; public class STUINFOAction extends ActionSupport { private String filename; private String Tempstr; private List fieldsName = new ArrayList(); private InputStream downStream; public String getFilename() { try { filename = new String(filename.getBytes(),"ISO8859-1"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return filename + ".xls"; } public void setFilename(String filename) { this.filename = filename; } public List getFieldsName() { return fieldsName; } public void setFieldsName(List fieldsName) { this.fieldsName = fieldsName; } public InputStream getDownStream() throws Exception{ return downStream; } public void setDownStream(InputStream downStream) { this.downStream = downStream; } public String getTempstr() { return Tempstr; } public void setTempstr(String tempstr) { Tempstr = tempstr; } public String initExcel(){ return SUCCESS; } @Override public String execute() throws Exception { return "excelinit"; } public String doexport() throws Exception{ if(null != Tempstr && !"".equals(Tempstr)){ String[] strArray = Tempstr.split(","); for(int i=0;i datas = new ArrayList(); datas = DAO.getAll(V_SF_STUINFO.class); ExcelServiceImpl excel = new ExcelServiceImpl(); this.downStream = excel.getExcelInputStream("lml.sf.pojo.V_SF_STUINF O", datas, "收费学生信息导出Excel_Demo",fieldsName); return SUCCESS; } return ERROR; } public String ioexport() throws Exception{ this.filename = "收费学生信息"; BaseDAO DAO = new BaseDAO(); List datas = new ArrayList(); datas = DAO.getAll(V_SF_STUINFO.class); ExcelServiceImpl excel = new ExcelServiceImpl(); this.downStream = excel.getExcelInputStream("lml.sf.pojo.V_SF_STUINF O", datas, "收费学生信息导出Excel_Demo",new ArrayList()); return SUCCESS; } }
  5、struts.xml 配置
   /STUINFO.jsp application/vnd.ms-excel attachment;filename=${fil ename} downStream /STUINFO.jsp
  package lml.sf.pojo; import lml.excel.annotation.PropertyAnnotation; /** * @author 报到收费学生信息视图 * @hibernate.class table="V_SF_STUINFO" */ public class V_SF_STUINFO { /** * 学生ID * * @hibernate.id generator-class="assigned" */ @PropertyAnnotation(PropertyName="学生ID",PropertySortKey=1) private String STUID; /** * 学生姓名 * * @hibernate.property */ @PropertyAnnotation(PropertyName="学生姓名",PropertySortKey=2) private String XM; /** * 学生学号 * * @hibernate.property */ @PropertyAnnotation(PropertyName="学生学号",PropertySortKey=3) private String XH; /** * 学生性别 * * @hibernate.property */ @PropertyAnnotation(PropertyName="学生性别",PropertySortKey=4) private Integer XB; /** * 出生年月 * * @hibernate.property */ @PropertyAnnotation(PropertyName="出生年月",PropertySortKey=5) private String CSNY; /** * 籍贯 * * @hibernate.property */ @PropertyAnnotation(PropertyName="籍贯",PropertySortKey=6) private String JG; /** * 民族 * * @hibernate.property */ @PropertyAnnotation(PropertyName="民族",PropertySortKey=7) private String MZ; /** * 政治面貌 * * @hibernate.property */ @PropertyAnnotation(PropertyName="政治面貌",PropertySortKey=8) private String ZZMM; /** * 家庭住址 * * @hibernate.property */ @PropertyAnnotation(PropertyName="家庭住址",PropertySortKey=9) private String JTZZ; /** * 邮政编码 * * @hibernate.property */ @PropertyAnnotation(PropertyName="邮政编码",PropertySortKey=10) private String YZBM; /** * 个人电话 * * @hibernate.property */ @PropertyAnnotation(PropertyName="个人电话",PropertySortKey=11) private String GRDH; /** * 家庭电话 * * @hibernate.property */ @PropertyAnnotation(PropertyName="家庭电话",PropertySortKey=12) private String JTDH; /** * 是否走读 * * @hibernate.property */ @PropertyAnnotation(PropertyName="是否走读",PropertySortKey=13) private Integer ISZD = new Integer(0); /** * 年级代码 * * @hibernate.property */ @PropertyAnnotation(PropertyName="年级代码",PropertySortKey=14) private String NJDM; /** * 年级名称 * * @hibernate.property */ @PropertyAnnotation(PropertyName="年级名称",PropertySortKey=15) private String NJMC; /** * 所属班级ID * * @hibernate.property */ @PropertyAnnotation(PropertyName="所属班级ID",PropertySortKey=16) private String BJDM; /** * 所属班级名字 * * @hibernate.property */ @PropertyAnnotation(PropertyName="所属班级名称",PropertySortKey=17) private String BJMC; /** * 所属专业ID * * @hibernate.property */ @PropertyAnnotation(PropertyName="所属专业ID",PropertySortKey=18) private String ZYDM; /** * 所属专业名字 * * @hibernate.property */ @PropertyAnnotation(PropertyName="所属专业名字",PropertySortKey=19) private String ZYMC; public V_SF_STUINFO() { } public String getSTUID() { return STUID; } public void setSTUID(String stuid) { STUID = stuid; } public String getXM() { return XM; } public void setXM(String xm) { XM = xm; } public String getXH() { return XH; } public void setXH(String xh) { XH = xh; } public String getCSNY() { return CSNY; } public void setCSNY(String csny) { CSNY = csny; } public String getJG() { return JG; } public void setJG(String jg) { JG = jg; } public String getMZ() { return MZ; } public void setMZ(String mz) { MZ = mz; } public String getGRDH() { return GRDH; } public void setGRDH(String grdh) { GRDH = grdh; } public String getJTDH() { return JTDH; } public void setJTDH(String jtdh) { JTDH = jtdh; } public Integer getISZD() { if (ISZD == null) { return 0; } else { return ISZD; } } public void setISZD(Integer iszd) { ISZD = iszd; } public String getNJDM() { return NJDM; } public void setNJDM(String njdm) { NJDM = njdm; } public String getNJMC() { return NJMC; } public void setNJMC(String njmc) { NJMC = njmc; } public String getBJDM() { return BJDM; } public void setBJDM(String bjdm) { BJDM = bjdm; } public String getBJMC() { return BJMC; } public void setBJMC(String bjmc) { BJMC = bjmc; } public String getZYDM() { return ZYDM; } public void setZYDM(String zydm) { ZYDM = zydm; } public String getZYMC() { return ZYMC; } public void setZYMC(String zymc) { ZYMC = zymc; } public String getZZMM() { return ZZMM; } public void setZZMM(String zzmm) { ZZMM = zzmm; } public String getJTZZ() { return JTZZ; } public void setJTZZ(String jtzz) { JTZZ = jtzz; } public String getYZBM() { return YZBM; } public void setYZBM(String yzbm) { YZBM = yzbm; } public Integer getXB() { return XB; } public void setXB(Integer xb) { XB = xb; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值