根据excel模板导出excel

原创 2016年06月02日 10:20:53

1. 代码

package com.base.pf.common.util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

import com.base.pf.base.util.StringUtils;

/**
 * 通用导出EXCEL类
 * 
 * @author ZHEN.L
 * @date 2014.09.04
 * 
 */
public class ExcelUtils {

	/**
	 * EXCEL导出标记
	 */
	public static final String EXCEL_EXP_TAG = "Excel.exp";

	/**
	 * Excel导出标记值
	 */
	public static final String EXCEL_EXP_TAG_VALUE = "excel";

	/**
	 * 导出EXCLE名称
	 */
	public static final String EXCEL_FILE_NAME = "Excel.fileName";
	/**
	 * 导出excle模板名称
	 */
	public static final String EXCEL_TEMPLATE_NAME = "Excel.templateName";
	/**
	 * 导出字段:有顺序,以逗号隔开(注:字段名称要和dto属性名称或者map中的key值相同)
	 */
	public static final String EXCEL_FIELD = "Excel.field";
	/**
	 * 在EXCEL中,开始写记录的行号;从0开始计数
	 */
	public static final String EXCEL_START_ROW_NAME = "Excel.startRow";

	// 导出excel模板的相对路径
	protected static final String EXCEL_TEMPLATE_PATH = "\\page\\project\\template_excel\\";

	/**
	 * 导出EXCEL
	 * 
	 * @param response
	 * @param request
	 * @param list
	 *            需要导出的集合:集合中可以为map,也可以为Dto
	 * @return
	 */
	public static String exp(HttpServletResponse response,
			HttpServletRequest request, List<Object> list) {
		String templatePath = request.getServletContext().getRealPath("/")
				+ EXCEL_TEMPLATE_PATH;
		String fileName = request.getParameter(EXCEL_FILE_NAME);
		String templateName = request.getParameter(EXCEL_TEMPLATE_NAME);
		String field = request.getParameter(EXCEL_FIELD);
		String startRowStr = request.getParameter(EXCEL_START_ROW_NAME);
		int startRow = 2; // 开始写入excel的开始行号
		if(StringUtils.isNumeric(startRowStr)){
			startRow = Integer.parseInt(startRowStr);
		}
		if ("".equals(StringUtils.withSpaceReplaceNull(templateName)))
			throw new NullPointerException("模板路径不能为空!");
		if ("".equals(StringUtils.withSpaceReplaceNull(field)))
			throw new NullPointerException("导出字段不能为空!");
		String path = templatePath + templateName;
		String[] fields = field.split(",");
		fileName = StringUtils.withSpaceReplaceNull(fileName);
		String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
		fileName += "_" + date;
		OutputStream os = null;
		InputStream is = null;
		try {
			is = new FileInputStream(path);
			Workbook work = new HSSFWorkbook(is);
			// 得到excel的第0张表
			Sheet sheet = work.getSheetAt(0);
			// 得到第1行的第一个单元格的样式
			CellStyle cellStyle = createBorderedStyle(work);
			Row row = null;
			Cell cell = null;
			Object rDto = null;
			Map map = null;
			// 得到行,并填充数据和表格样式
			for (int i = 0; i < list.size(); i++) {
				rDto = list.get(i);
				if (rDto instanceof Map)
					map = (Map) rDto;
				else
					map = BeanToMapUtils.convertBean(rDto);
				row = sheet.createRow(startRow++);
				row.setHeight((short)350);
				for (int j = 0; j < fields.length + 1; j++) {
					cell = row.createCell(j);
					if (j == 0)
						cell.setCellValue(i + 1);
					else
						cell.setCellValue(StringUtils.withSpaceReplaceNull(map
								.get(fields[j - 1])));
					cell.setCellStyle(cellStyle);// 填充样式
				}
			}
			// 输出工作簿: 这里使用的是 response 的输出流,如果将该输出流换为普通的文件输出流则可以将生成的文档写入磁盘等
			os = response.getOutputStream();
			response.setContentType("application/ms-excel,charset=gbk");
			response.setHeader("Content-disposition", "attachment;filename="
					+ URLEncoder.encode(fileName + ".xls", "utf-8"));
			work.write(os); // 将工作簿进行输出
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			close(is, os);
		}
		return null;
	}

	// 单元格样式
	protected static CellStyle createBorderedStyle(Workbook wb) {
		CellStyle style = wb.createCellStyle();
		style.setBorderRight(CellStyle.BORDER_THIN);
		style.setRightBorderColor(IndexedColors.BLACK.getIndex());
		style.setBorderBottom(CellStyle.BORDER_THIN);
		style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
		style.setBorderLeft(CellStyle.BORDER_THIN);
		style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
		style.setBorderTop(CellStyle.BORDER_THIN);
		style.setTopBorderColor(IndexedColors.BLACK.getIndex());
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		return style;
	}

	// 单元格样式:获取的第二行的第一个单元格的样式
	protected static CellStyle createGetCellStyle(Workbook work) {
		Sheet sheet = work.getSheetAt(0);
		Row rowCellStyle = sheet.getRow(1);
		CellStyle cellStyle = rowCellStyle.getCell(0).getCellStyle();
		return cellStyle;
	}

	// 关闭IO
	protected static void close(InputStream is, OutputStream os) {
		if (is != null) {
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if (os != null) {
			try {
				os.flush();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}


2. 在查询列表方法中加入代码

	if (ExcelUtils.EXCEL_EXP_TAG_VALUE.equalsIgnoreCase(request
					.getParameter(ExcelUtils.EXCEL_EXP_TAG))) {
				ExcelUtils.exp(response, request, rows);
				return null;
			}

3. 导出页面中加入

<!-- 导出EXCEL -->
<div><form id="ExcelForm" name="ExcelForm" method="post" action="queryList.do"> <!-- 查询路径 -->
	<input type="text" name="excelProjectName" id="excelProjectName"/>
	<input type="text" name="excelYear" id="excelYear"/>
	<input type="text" name="execelProjectType" id="execelProjectType"/>
	<input type="text" name="excelOrgId" id="excelOrgId"/>
	<input type="hidden" name="<%=com.base.pf.common.util.ExcelUtils.EXCEL_EXP_TAG %>" value="<%=com.base.pf.common.util.ExcelUtils.EXCEL_EXP_TAG_VALUE %>"/><!-- 用于判断是否为导出功能,无需修改 -->
	<input type="hidden" name="<%=com.base.pf.common.util.ExcelUtils.EXCEL_FIELD %>" value="projectName,contractName,period,replyDateCn,valuationAmount,invoiceCode,invoiceAmount,invoiceDateCn,deductPaymentAmount,deductBondAmount,deductOtherBondAmount,deductRewardAmount,deductFineAmount,deductOtherAmount,receivableAmount,unpaidAmount,toDateCn,toAmount"/> <!-- 要导出的字段 -->
	<input type="hidden" name="<%=com.base.pf.common.util.ExcelUtils.EXCEL_TEMPLATE_NAME %>" value="valuationReport.xls"/> <!-- 模板名称:模板放在page/project/excel_template下 -->
	<input type="hidden" name="<%=com.base.pf.common.util.ExcelUtils.EXCEL_FILE_NAME %>" value="项目计价收款情况表"/> <!-- 导出的EXCLE名称(注:系统会自动为名称后加上当前日期) -->
	<input type="hidden" name="<%=com.base.pf.common.util.ExcelUtils.EXCEL_START_ROW_NAME %>" value="4"/> <!-- 导出的EXCLE中开始记录的行号:从0开始计算-->
</form></div>			
<script type="text/javascript"/>
ValuationReportManage.excelForm = $('#ExcelForm');
ValuationReportManage.expExcel = function(){
	var projectName = $("#projectName").val();
	if(projectName){
		$("#excelProjectName").val(projectName);
	}	
	var year = $("#year").val();
	if(year){
		$("#excelYear").val(year);
	}	
	var projectType = $("#projectType").val();
	if(projectType){
		$("#execelProjectType").val(projectType);
	}	
	var orgSelectText = $("#orgSelectText").val();
	if(orgSelectText){
		$("#excelOrgId").val(orgSelectText);
	}	
	$('#ExcelForm').submit();
};
</script>




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

基于Excel模板导出——ExcelTemplate

ExcelTemplate项目是一个基于Excel模板,依靠配置文件描述导出过程的Excel导出工具。 它提供了大量适用于各种场景的常用配置(导出规则),同时提供一些供外部使用的扩展接口,以满足一些...

Excel模板导出(针对复杂报表的一种解决方式)

比如需导出如下形式的报表: 里面数据字段分类很多,又含公式统计等情况。 解决方案:利用NPOI组件,制作导出模板,对单元格精确控制,通过读取单元格里的模板字段,进行数据匹配替换;模板形式如...

初探:使用NPOI导出Excel(已有Excel模板)

最近在写个功能,要导出Excel到本地,第一次使用的方法是用office COM组件Microsoft.Office.Intertrop.Excel.dll,在我的机器上功能好用,但放到一个同事的机器...
  • gjban
  • gjban
  • 2014年09月03日 17:56
  • 3489

java通过模板导出excel的一个实例

写之前,大家请先下好poi的相关jar包,网上遍地do

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Excel模板导出

//下面是实体类package com.test.model; import java.util.Date; //模板数据实体public class UserTmpl { private int ...

POI导入导出Excel模板···

HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx 以XSSFWorkbook...
  • yangydq
  • yangydq
  • 2015年04月20日 16:35
  • 2098

根据excel模版导出数据到excel

根据excel模版生成excel

POI设置Excel表格的单元格格式及处理大数的科学计数问题

一、POI设置Excel表格的单元格格式(在导出Excel表时设置各个单元格格式) 1、Excel的单元格格式  图中的数据有数值、货币、时间、日期、文本等格式。这些数据格式在POI中的H...

POI操作excel中的日期格式处理

转载:http://blog.csdn.net/fuxiaohui/article/details/6239925 7.3.3 POI中Excel文件Cell的类型 在读取每一个Cell的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:根据excel模板导出excel
举报原因:
原因补充:

(最多只允许输入30个字)