码迷,mamicode.com
首页 > Web开发 > 详细

使用Apache POI写的一个生成Excel的工具类

时间:2015-08-04 16:06:22      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

话不多说,直接上代码,就一个类,注释也写得比较清楚了。

/**
 * 
 */
package com.common.office;

import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.Calendar;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
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.HSSFRichTextString;
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.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;

/**
 * Excel工具类
 * @author ll
 */
public class PoiExcelUtils {

	/** 日志 */
	private static final Logger LOGGER = Logger.getLogger(PoiExcelUtils.class);
	/** 列默认宽度 */
	private static final int DEFAUL_COLUMN_WIDTH = 4000;

	/**
	 * 1.创建 workbook
	 * 
	 * @return {@link HSSFWorkbook}
	 */
	private HSSFWorkbook getHSSFWorkbook() {
		LOGGER.info("【创建 workbook】");
		return new HSSFWorkbook();
	}

	/**
	 * 2.创建 sheet
	 * 
	 * @param hssfWorkbook {@link HSSFWorkbook}
	 * @param sheetName sheet 名称
	 * @return {@link HSSFSheet}
	 */
	private HSSFSheet getHSSFSheet(HSSFWorkbook hssfWorkbook, String sheetName) {
		LOGGER.info("【创建 sheet】sheetName : " + sheetName);
		return hssfWorkbook.createSheet(sheetName);
	}

	/**
	 * 3.写入表头信息
	 * 
	 * @param hssfWorkbook {@link HSSFWorkbook}
	 * @param hssfSheet {@link HSSFSheet}
	 * @param headers 列标题,数组形式,
	 * 				   如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
	 * 				   其中参数@columnWidth可选,columnWidth为整型数值
	 * @param title 标题
	 */
	private void writeHeader(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet, String[] headers,
			String title) {
		LOGGER.info("【写入表头信息】");
		// 初始化标题和表头单元格样式
		HSSFCellStyle titleCellStyle = createTitleCellStyle(hssfWorkbook);
		// 标题栏
		HSSFRow titleRow = hssfSheet.createRow(0);
		titleRow.setHeight((short) 500);
		HSSFCell titleCell = titleRow.createCell(0);
		// 设置标题文本
		titleCell.setCellValue(new HSSFRichTextString(title));
		// 设置单元格样式
		titleCell.setCellStyle(titleCellStyle);

		// 处理单元格合并,四个参数分别是:起始行,终止行,起始行,终止列
		hssfSheet.addMergedRegion(new CellRangeAddress(0, 0, (short) 0,
				(short) (headers.length - 1)));

		// 设置合并后的单元格的样式
		titleRow.createCell(headers.length - 1).setCellStyle(titleCellStyle);

		// 表头
		HSSFRow headRow = hssfSheet.createRow(1);
		headRow.setHeight((short) 500);
		HSSFCell headCell = null;
		String[] headInfo = null;
		// 处理excel表头
		for (int i = 0, len = headers.length; i < len; i++) {
			headInfo = headers[i].split("@");
			headCell = headRow.createCell(i);
			headCell.setCellValue(headInfo[0]);
			headCell.setCellStyle(titleCellStyle);
			// 设置列宽度
			setColumnWidth(i, headInfo, hssfSheet);
		}
	}

	/**
	 * 4.写入内容部分
	 * 
	 * @param hssfWorkbook {@link HSSFWorkbook}
	 * @param hssfSheet {@link HSSFSheet}
	 * @param headers 列标题,数组形式,
	 * 				   如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
	 * 				   其中参数@columnWidth可选,columnWidth为整型数值
	 * @param dataList 要导出的数据集合
	 * @throws Exception 
	 */
	private void writeContent(HSSFWorkbook hssfWorkbook, HSSFSheet hssfSheet, String[] headers,
			List<?> dataList) throws Exception {
		LOGGER.info("【写入Excel内容部分】");

		HSSFRow row = null;
		HSSFCell cell = null;
		// 单元格的值
		Object cellValue = null;
		// 数据写入行索引
		int rownum = 2;
		// 单元格样式
		HSSFCellStyle cellStyle = createContentCellStyle(hssfWorkbook);
		// 遍历集合,处理数据
		for (int j = 0, size = dataList.size(); j < size; j++) {
			row = hssfSheet.createRow(rownum);
			for (int i = 0, len = headers.length; i < len; i++) {
				cell = row.createCell(i);
				cellValue = getCellValue(dataList.get(j), headers[i].split("@")[1]);
				cellValueHandler(cell, cellValue);
				cell.setCellStyle(cellStyle);
			}
			rownum++;
		}
	}

	/**
	 * 设置列宽度
	 * @param i 列的索引号
	 * @param headInfo 表头信息,其中包含了用户需要设置的列宽
	 */
	private void setColumnWidth(int i, String[] headInfo, HSSFSheet hssfSheet) {
		if (headInfo.length < 3) {
			// 用户没有设置列宽,使用默认宽度
			hssfSheet.setColumnWidth(i, DEFAUL_COLUMN_WIDTH);
			return;
		}
		if (StringUtils.isBlank(headInfo[2])) {
			// 使用默认宽度
			hssfSheet.setColumnWidth(i, DEFAUL_COLUMN_WIDTH);
			return;
		}
		// 使用用户设置的列宽进行设置
		hssfSheet.setColumnWidth(i, Integer.parseInt(headInfo[2]));
	}

	/**
	 * 单元格写值处理器
	 * @param {{@link HSSFCell}
	 * @param cellValue 单元格值
	 */
	private void cellValueHandler(HSSFCell cell, Object cellValue) {
		if (cellValue instanceof String) {
			cell.setCellValue((String) cellValue);
		} else if (cellValue instanceof Boolean) {
			cell.setCellValue((Boolean) cellValue);
		} else if (cellValue instanceof Calendar) {
			cell.setCellValue((Calendar) cellValue);
		} else if (cellValue instanceof Double) {
			cell.setCellValue((Double) cellValue);
		} else if (cellValue instanceof Integer || cellValue instanceof Long
				|| cellValue instanceof Short || cellValue instanceof Float) {
			cell.setCellValue((Double.parseDouble(cellValue.toString())));
		} else if (cellValue instanceof HSSFRichTextString) {
			cell.setCellValue((HSSFRichTextString) cellValue);
		}
		cell.setCellValue(cellValue.toString());
	}

	/**
	 * 根据字段名取得属性值
	 * @param object 要读取值的对象
	 * @param fieldName 字段名
	 * @param classType 对象的class类型
	 * @return 属性值
	 * @throws Exception 
	 */
	private Object getCellValue(Object object, String fieldName) throws Exception {
		Field[] fields = object.getClass().getDeclaredFields();
		Object value = null;
		for (Field field : fields) {
			field.setAccessible(true);
			if (field.getName().equals(fieldName)) {
				value = field.get(object);
				break;
			}
		}
		return value;
	}

	/**
	 * 创建标题和表头单元格样式
	 * @param hssfWorkbook {@link HSSFWorkbook}
	 * @return {@link HSSFCellStyle}
	 */
	private HSSFCellStyle createTitleCellStyle(HSSFWorkbook hssfWorkbook) {
		LOGGER.info("【创建标题和表头单元格样式】");
		// 单元格的样式
		HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
		// 设置字体样式,改为不变粗
		HSSFFont font = hssfWorkbook.createFont();
		font.setFontHeightInPoints((short) 13);
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);
		cellStyle.setFont(font);
		// 设置通用的单元格属性
		setCommonCellStyle(cellStyle);
		return cellStyle;
	}

	/**
	 * 创建内容单元格样式
	 * @param hssfWorkbook {@link HSSFWorkbook}
	 * @return {@link HSSFCellStyle}
	 */
	private HSSFCellStyle createContentCellStyle(HSSFWorkbook hssfWorkbook) {
		LOGGER.info("【创建内容单元格样式】");
		// 单元格的样式
		HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();
		// 设置字体样式,改为不变粗
		HSSFFont font = hssfWorkbook.createFont();
		font.setFontHeightInPoints((short) 11);
		cellStyle.setFont(font);
		// 设置通用的单元格属性
		setCommonCellStyle(cellStyle);
		return cellStyle;
	}

	/**
	 * 设置通用的单元格属性
	 * @param cellStyle 要设置属性的单元格
	 */
	private void setCommonCellStyle(HSSFCellStyle cellStyle) {
		// 居中
		cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
		// 设置边框
		cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
	}

	/**
	 * 将生成的Excel输出到指定目录
	 * @param hssfWorkbook {@link HSSFWorkbook}
	 * @param filePath 文件输出目录,包括文件名(.xls)
	 */
	private void write2FilePath(HSSFWorkbook hssfWorkbook, String filePath) {
		LOGGER.info("【将生成的Excel输出到指定目录】filePath :" + filePath);
		FileOutputStream fileOut = null;
		try {
			fileOut = new FileOutputStream(filePath);
			hssfWorkbook.write(fileOut);
		} catch (Exception e) {
			LOGGER.error("【将生成的Excel输出到指定目录失败】", e);
			throw new RuntimeException("将生成的Excel输出到指定目录失败");
		} finally {
			IOUtils.closeQuietly(fileOut);
		}
	}

	/**
	 * 生成Excel,存放到指定目录
	 * @param sheetName sheet名称
	 * @param title 标题
	 * @param filePath 要导出的Excel存放的文件路径
	 * @param headers 列标题,数组形式,
	 * 				   如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
	 * 				   其中参数@columnWidth可选,columnWidth为整型数值
	 * @param dataList 要导出数据的集合
	 * @throws Exception
	 */
	public static void createExcel2FilePath(String sheetName, String title, String filePath,
			String[] headers, List<?> dataList) throws Exception {
		LOGGER.info("【生成Excel,并存放到指定文件夹目录下】sheetName : " + sheetName + " , title : " + title
				+ " , filePath : " + filePath + " , headers : " + headers.toString());
		if (ArrayUtils.isEmpty(headers)) {
			LOGGER.warn("【表头为空】");
			throw new RuntimeException("表头不能为空");
		}
		if (CollectionUtils.isEmpty(dataList)) {
			LOGGER.warn("【要导出的数据为空】");
			throw new RuntimeException("要导出的数据为空");
		}

		PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
		// 1.创建 Workbook
		HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
		// 2.创建 Sheet
		HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
		// 3.写入 head
		poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
		// 4.写入内容
		poiExcelUtil.writeContent(hssfWorkbook, hssfSheet, headers, dataList);
		// 5.保存文件到filePath中
		poiExcelUtil.write2FilePath(hssfWorkbook, filePath);
	}

	/**
	 * 生成Excel的WorkBook,用于导出Excel
	 * @param sheetName sheet名称
	 * @param title 标题
	 * @param headers 列标题,数组形式,
	 * 				   如{"列标题1@beanFieldName1@columnWidth","列标题2@beanFieldName2@columnWidth","列标题3@beanFieldName3@columnWidth"}
	 * 				   其中参数@columnWidth可选,columnWidth为整型数值
	 * @param dataList 要导出数据的集合
	 * @throws Exception
	 */
	public static HSSFWorkbook createExcel2Export(String sheetName, String title, String[] headers,
			List<?> dataList) throws Exception {

		LOGGER.info("【生成Excel的WorkBook,用于导出Excel】sheetName : " + sheetName + " , title : " + title
				+ "  , headers : " + headers.toString());
		if (ArrayUtils.isEmpty(headers)) {
			LOGGER.warn("【表头为空】");
			throw new RuntimeException("表头不能为空");
		}
		if (CollectionUtils.isEmpty(dataList)) {
			LOGGER.warn("【要导出的数据为空】");
			throw new RuntimeException("要导出的数据为空");
		}
		PoiExcelUtils poiExcelUtil = new PoiExcelUtils();
		// 1.创建 Workbook
		HSSFWorkbook hssfWorkbook = poiExcelUtil.getHSSFWorkbook();
		// 2.创建 Sheet
		HSSFSheet hssfSheet = poiExcelUtil.getHSSFSheet(hssfWorkbook, sheetName);
		// 3.写入 head
		poiExcelUtil.writeHeader(hssfWorkbook, hssfSheet, headers, title);
		// 4.写入内容
		poiExcelUtil.writeContent(hssfWorkbook, hssfSheet, headers, dataList);

		return hssfWorkbook;
	}

}



使用Apache POI写的一个生成Excel的工具类

标签:

原文地址:http://my.oschina.net/simpleton/blog/487510

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!