关于使用struts2控制excel文件下载在这里只是介绍其中的一种方法
一、关于jsp页面
expGridToExcel : function(condition) {
/**
* 导出数据到excel
*/
var cm = this.contentPanel.getColumnModel();
var colHeaderStr = "";
var colDataIndexStr = "";
for (var i = 1; i < cm.getColumnCount(); i++) {
if (!cm.isHidden(i)) {
if (cm.getDataIndex(i)) {
colHeaderStr = colHeaderStr + cm.getColumnHeader(i) + ",";
colDataIndexStr = colDataIndexStr + cm.getDataIndex(i)
+ ",";
}
}
}
condition['colHeaderStr'] = colHeaderStr;
condition['colDataIndexStr'] = colDataIndexStr;
/*if (!Ext.fly('test')) {
var frm = document.createElement('form');
frm.id = 'test';
frm.name = id;
frm.style.display = 'none';
document.body.appendChild(frm);
}
Ext.Ajax.request({
url : '../map/busReportAction!expOldAdv',
form : Ext.fly('test'),
method : 'POST',
isUpload : true,
params : condition
});*/
window.open('../map/busReportAction!expOldAdv?'+encodeURI(encodeURI($.param(condition))));
},
说明:colDataIndexStr
:指的是对应属性名字,比如:
tent,begintime,endtime,telephone
colHeaderStr
:指的是表头名字,比如:
广告
ID,
广告商
,
广告内容等。
二、关于action层
public String expOldAdv() throws UnsupportedEncodingException {
try {
List<BusOldadvertisementinfo> list = null;
BusOldadvertisementinfo oldAd = new BusOldadvertisementinfo();
oldAd.setCompanyname(getDecodeData(companyName));
String beginTimeDecode = this.getDecodeData(beginTime);
String endTimeDecode = this.getDecodeData(endTime);
if (beginTimeDecode != null && beginTimeDecode.length() == 10) {
oldAd.setBegintime(DateUtil.parseYYYYMMDDDate(beginTimeDecode));
}
if (endTimeDecode != null && endTimeDecode.length() == 10) {
oldAd.setEndtime(DateUtil.parseYYYYMMDDDate(endTimeDecode));
}
// 给出查询的条件,以及页,根据条件得到要导出的数据组成的集合
list = busOldadvertisementinfoService.export(oldAd, start, limit);
String[] colHeader = URLDecoder.decode(
URLDecoder.decode(colHeaderStr, "UTF-8"), "UTF-8").split(
",");
String[] colDataIndex = URLDecoder.decode(
URLDecoder.decode(colDataIndexStr, "UTF-8"), "UTF-8")
.split(",");
// 读取模板Excel
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
workbook.setSheetName(0, Constance.OLDADVSHEETNAME);
// 设置字体颜色
HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 设置报表中单元格的样式
HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setFont(font);
int colCount = colHeader.length;
CellRangeAddress cellas = new CellRangeAddress(0, 0, 0,
colCount - 1);
sheet.addMergedRegion(cellas);
HSSFRow headerRow = sheet.createRow(0);
HSSFCell headerCell = headerRow.createCell(0);
headerCell.setCellStyle(style);
headerCell.setCellValue(Constance.OLDADVCELLVALUE);
int size = 0;
if (list != null) {
size = list.size();
}
for (int rownum = 1; rownum < size + 2; rownum++) {
HSSFRow r = sheet.createRow(rownum);
for (int cellnum = 0; cellnum < colHeader.length; cellnum++) {
if (rownum == 1) {
HSSFCell cell = r.createCell(cellnum);
cell.setCellValue(new HSSFRichTextString(
colHeader[cellnum]));
cell.setCellStyle(style);
} else {
//为每一行的创建单元格
HSSFCell cell = r.createCell(cellnum);
//为每个单元格赋值
cell.setCellValue(new HSSFRichTextString(this.getDataDynamic
(list.get(rownum - 2),colDataIndex[cellnum])));
//为每个单元格设置样式
cell.setCellStyle(style);
}
}
}
//确定要导出的文件的名字
fileName = new SimpleDateFormat("yyyy-MM-dd").format(new Date())
+ Constance.OLDADVCELLVALUE + ".xls";
//根据路径名和文件名创建一个FILE实例
File file = new File(ServletActionContext.getServletContext()
.getRealPath(inputPath), fileName);
//将excel模板连同数据,写到指定的file中
workbook.write(new FileOutputStream(file));
} catch (Exception e) {
log.error("GetBusDataAction queryAdv() failed", e);
} finally {
}
return SUCCESS;
}
/**
* 根据属性名称动态取出对应的值(反射读取某个对象中的某个get方兴得到对应属性的值)
*
* @param obj 集合中的某一个对象
* @param property 对象中的某个属性
* @return
*/
public String getDataDynamic(Object obj, String property) {
Class c = obj.getClass();
try {
//根据属性名称取出field
Field field = c.getDeclaredField(property);
Method method;
if (field.getType().equals(Boolean.TYPE)) {
String methodName = "is"
+ property.substring(0, 1).toUpperCase()
+ property.substring(1);
method = c.getDeclaredMethod(methodName);
} else {
String methodName = "get"
+ property.substring(0, 1).toUpperCase()
+ property.substring(1);
method = c.getDeclaredMethod(methodName);
}
//反射读取obj类中的method方法
Object o = method.invoke(obj);
if (o != null) {
if (o instanceof Date) {
return DateUtils.format((Date) o, Constance.DATEFORMATE);
} else {
if (property.equals("isaudit")) {
if ((Long) o == 1) {
return "通过审计";
} else if ((Long) o == 0) {
return "未通过审核";
} else {
return "未做处理";
}
}
return o.toString();
}
}
} catch (SecurityException e) {
log.debug(e.getMessage());
return "";
} catch (NoSuchFieldException e) {
log.debug(e.getMessage());
return "";
} catch (NoSuchMethodException e) {
log.debug(e.getMessage());
return "";
} catch (IllegalArgumentException e) {
log.debug(e.getMessage());
return "";
} catch (IllegalAccessException e) {
log.debug(e.getMessage());
return "";
} catch (InvocationTargetException e) {
log.debug(e.getMessage());
return "";
}
return "";
}
public InputStream getInputStream
() throws Exception {
String url = inputPath + "/" + fileName;
int size = url.length() - 1;
for (int i = 0; i < size; i++) {
url = url.replace("\\", "/");
}
System.out.println("url="+url);
//返回读取指定的文件流
return ServletActionContext.getServletContext()
.getResourceAsStream(url);
}
三、关于配置文件说明
<action name="busReportAction" class="busReportAction">
<param name="inputPath">/reportManage/reportFile/qiantai</param>
<result name="success" type="stream
">
<param name="contentType">application/vnd.ms-excel;charset=ISO8859-1</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">inline;filename="${fileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>
说明:
contentType:指定被下载文件的类型
inputName:指定被下载文件的入口输入流(它的参数的值就是方法去掉get前缀,首字母小定的字符串)
contentDisposition:指定下载的文件名
bufferSize:指定下载文件时的缓冲大小
总结:总之下载文件就是先通过一定的方法,将要导出的文件流写到服务器上也就是某个位置,然后通过struts2的
配置文件去读这个文件,就是这样一个简单的过程,至于中间如何将正确的数据写到文件中,方法有很多,我这里只是
介绍了其中的一种,通过反射的机制读取数据。
将此方法和大家分享一下,如果有更好的方法还请留言,大家共同分享~~~
分享到:
相关推荐
通过上述步骤,我们就可以在Struts2框架下实现文件流方式的下载功能,无论是Excel、TXT还是图片,都能有效地直接返回给浏览器,让客户端进行下载。这种方式既节省了服务器资源,也提高了用户体验。在实际项目中,...
Struts2是一个强大的MVC(模型-视图-控制器)框架,被广泛应用于Java Web开发中,它提供了灵活的控制层结构,使得开发者能够构建可维护性和可扩展性极强的Web应用程序。Excel则是一种流行的电子表格软件,常用于数据...
在Struts2中实现Excel导入功能,可以让用户上传Excel文件,然后在服务器端进行数据处理,例如存储到数据库或者进行数据分析。 在描述中提到的“完整美运行有JAR包”,意味着这个压缩包可能包含了所有必要的库文件,...
Struts2 和 Apache POI 的结合使用主要集中在创建 Web 应用程序中导出 Excel 文件的功能上。Apache POI 是一个 Java 库,允许开发者创建、修改和显示 Microsoft Office 格式的文件,其中包括 Excel。而 Struts2 是一...
3. **返回结果**:当Action执行完成,Struts2框架会根据配置的result类型(这里为stream)将excelStream内容写入HTTP响应,用户即可下载Excel文件。 这个过程中,开发者需要注意一些关键点,比如异常处理、内存管理...
Struts2是一个基于MVC设计模式的Java EE框架,它提供了强大的动作控制、拦截器和结果类型等功能,使得Web应用的开发更加简洁高效。而Apache POI是一个开源库,专门用于读写Microsoft Office格式的文件,包括Excel。 ...
Struts2是一个流行的Java web开发框架,它提供了一种模型-视图-控制器(MVC)架构,使得开发者可以更方便地构建可维护、可扩展的Web应用。在本示例中,Struts2被用来处理HTTP请求和响应,协调前端视图与后端业务逻辑...
例如,可以使用Apache POI库来生成Excel文件,或者使用OpenCSV库来生成CSV文件。生成文件后,可以调用上面提到的下载方法来提供下载。 总的来说,"struts2文件上传下载"涵盖了Web开发中的基础功能,对于任何需要...
- 当用户选择导出Excel时,Action创建Excel文件,设置响应头并返回。 - 用户在浏览器中触发文件下载,保存到本地。 通过以上步骤,我们可以构建一个功能完整的Web应用,实现从查询、分页到导出Excel的流程。在...
同时,合理控制Excel文件的大小,防止内存溢出。 通过这种方式,你可以结合Struts2的控制层和JXL的Excel操作,轻松实现web应用的Excel导出功能。不过,需要注意的是,随着技术的发展,现在有更多现代化的库(如...
Struts2和Apache POI是Java开发中两个重要的工具,它们在处理Web应用程序中的数据导出,特别是Excel表格导出方面发挥着重要作用。Struts2是一个基于MVC设计模式的Web应用框架,它极大地简化了Java Web开发。而Apache...
Struts2是一个流行的Java web开发框架,它提供了一种优雅的方式来构建MVC(模型-视图-控制器)架构的应用程序。在Struts2中实现Excel导出是一项常见的需求,这通常涉及到将数据库或其他数据源中的数据转换为Excel...
6. 最后,在 Action 方法返回 "success",Struts2 将使用配置的 `stream` 结果来处理这个字节流,从而完成 Excel 文件的导出。 这个过程不仅限于简单的数据导出,你还可以根据需求实现更复杂的功能,如合并单元格、...
可以提供下载链接让用户下载生成的Excel文件。 5. **安全考虑**:在导出过程中,要注意避免潜在的安全问题,如内存溢出(大量数据时)、Excel公式注入等。 **Hibernate集成** 1. **实体类**:创建员工和部门的...
在Struts2中,我们可以利用Action类和Result类型来处理请求和响应,结合POI库,可以实现在服务器端生成Excel文件并返回给客户端下载。 以下是实现Excel导出的基本步骤: 1. **引入依赖**:首先,你需要在项目的pom...
通过以上步骤,我们可以实现一个在Struts2框架下,利用Ext3创建前端交互界面,后端使用Apache POI处理Excel文件,TrueZip打包文件,提供批量下载服务的功能。这不仅可以提高用户的下载效率,还简化了后台处理大量...
总结起来,本主题涵盖的核心知识点包括Struts2的Action、Spring的依赖注入和事务管理、Hibernate的数据库操作、Apache POI库的使用以及文件上传和下载的处理。通过理解这些内容,开发者能够构建起一个完整的、支持...
最后,将工作簿写入到HttpServletResponse的输出流中,这样浏览器就能接收到Excel文件并下载。为了确保导出过程的性能,通常会使用流式处理,避免一次性加载所有数据到内存。 在实际的代码实现中,可能包含以下几个...
在本项目中,“Struts2+POI3.7做excel导入”意味着我们将利用Struts2的文件上传功能结合POI库,实现用户从网页上选择Excel文件并将其数据导入到系统中的功能。 首先,我们需要在Struts2的配置文件(struts.xml)中...
通过创建HSSFWorkbook对象,设置工作表、单元格内容,然后将其写入到Servlet的OutputStream,客户端就可以接收到一个可供下载的Excel文件。 在项目实施过程中,开发者需要注意以下几点: 1. **集成配置**:确保...