`
sric08
  • 浏览: 64447 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

struts2 excel下载

阅读更多

配置文件

<action name="gatherSecretFillInData" class="sssManagerAction"
			method="gatherSecretFillInData">
			<!-- EXCEL 模板所在位置 -->
			<param name="templatePosition">
				/com/sss/cms/sssManager/excel/gatherSecretFillinTemplate.xls
			</param>
			<result type="stream" name="success">
				<!-- 下载文件的类型,假如下载的是其他的,但你又不知道是什么格式,可以去 tomcat\conf\web.xml下找 -->
				<param name="contentType">
					application/vnd.ms-excel
				</param>
				<!--  返回流 excelStream为action中的流变量名称 -->
				<param name="inputName">excelStream</param>
				<!-- attachment 这个位置的参数挺特殊的,可以设置成下载时,是否出现个下载提示框,或者直接下载之类的,怎么设置忘了,那个小本子找不到了
					fileName指定生成的文件名字(这种方式合适动态生成文件名,比如做报表时,一般都要说是几月的统计数据之类)为action中变量  -->
				<param name="contentDisposition">
					attachment;filename=${excelFileName}
				</param>
				<param name="bufferSize">1024</param>
			</result>
		</action>

 

整个配置文件中最重要的两个变量就是 excelStream、excelFileName,这两个变量一定要在action中有定义,否则会报错。差点忘了还有个变量templatePosition,这个是运用模板的路径,用模板的意思,是可以预先设置好各种单元格包括颜色,对齐方式,数据格式,这些东西在程序里也可以控制,但太累,还是用模板吧,代码量少,假如客户想换个颜色什么的也简单,改下模板就好。

 

 action

package com.sss.cms.sssManager.action;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.sss.cms.sssManager.service.SssManagerService;

public class SssManagerAction extends ActionSupport {

	private InputStream excelStream;  //输出流变量
	private String excelFileName; //下载文件名
	private String templatePosition;  //模板路径
	private SssManagerService sssManagerService; //service

	public String gatherSecretFillInData() throws Exception {
		HttpServletRequest request = (HttpServletRequest)ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);
		String contextPath=request.getRealPath("/");
		Map<String,Object> aa=sssManagerService.gatherSecretFillInData(contextPath+"WEB-INF/classes"+templatePosition);
		excelStream=(InputStream)aa.get("stream");
		this.excelFileName=(String)aa.get("excelName")+".xls";
		return SUCCESS;
	}

	/**
	 * 提供中文转换的功能
	 * @return
	 */
	public String getExcelFileName() {
		try {
			return new String(this.excelFileName.getBytes(), "ISO8859-1");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return "aaa.xls";
	}

	public InputStream getExcelStream() {
		return excelStream;
	}

	public void setExcelStream(InputStream excelStream) {
		this.excelStream = excelStream;
	}

	public String getTemplatePosition() {
		return templatePosition;
	}

	public void setTemplatePosition(String templatePosition) {
		this.templatePosition = templatePosition;
	}

	public SssManagerService getSssManagerService() {
		return sssManagerService;
	}

	public void setSssManagerService(SssManagerService sssManagerService) {
		this.sssManagerService = sssManagerService;
	}

	public void setExcelFileName(String excelFileName) {
		this.excelFileName = excelFileName;
	}
}

 

 service

public Map<String,Object> gatherSecretFillInData(String templatePosition) {
		Map<String,Object> returnMap=new HashMap<String, Object>();
		InputStream is;
		ByteArrayInputStream aas;
		try {
			is = new FileInputStream(templatePosition);
			HSSFWorkbook wb = new HSSFWorkbook(is);
			HSSFSheet sheet = wb.getSheetAt(0);
			
			/**
			 *.... 构建 sheet 代码 
			 */
		
			ByteArrayOutputStream os = new ByteArrayOutputStream();
			try {
				wb.write(os);
			} catch (IOException e) {
				e.printStackTrace();
			}
			byte[] content = os.toByteArray();
			aas = new ByteArrayInputStream(content);
			returnMap.put("stream", aas);
			returnMap.put("excelName", titlePreStr);
			
			return returnMap;
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		return null;
	}

 

 

service中返回的是个 Map,当中包括返回流跟 excel 名称两部分,因为我们的需求 excel 的标题就是文件名,所有这样写,挺好的,另外再附上一个我自己写的解析样式的方法,个人觉得挺好用

/**
	 * 样式读取方法
	 * 
	 * @param styleName
	 *            样式名数组
	 * @param styleRow
	 *            样式行
	 * @param startCol
	 *            开始列位置
	 * @param startCol
	 *            空白样式列位置 null:不进行空替换
	 * @return
	 */
	public static Map<String, HSSFCellStyle> readStyle(String[] styleName,
			HSSFRow styleRow, short startCol, Integer blankCol) {
		Map<String, HSSFCellStyle> returnMap = new HashMap<String, HSSFCellStyle>();
		HSSFCellStyle blankStyle = null;
		if (null != blankCol) {
			blankStyle = styleRow.getCell(blankCol.shortValue()).getCellStyle();
			styleRow.getCell(blankCol.shortValue()).setCellValue("");
		}

		for (String name : styleName) {
			HSSFCell cell = styleRow.getCell(startCol);
			HSSFCellStyle style = cell.getCellStyle();
			returnMap.put(name, style);
			cell.setCellValue("");
			if (null != blankStyle) {
				cell.setCellStyle(blankStyle);
			}
			startCol++;
		}
		return returnMap;
	}

 

把样式都放到一个Map里,方法间传递样式的时候只需要传这个样式Map就好,避免传一堆样式参数

 

 

 

 

 

 

 

 

0
0
分享到:
评论
1 楼 TX归心 2013-12-20  
你好 请问 这个titlePreStr是在哪里定义的?

相关推荐

Global site tag (gtag.js) - Google Analytics