Excel导出

             Excel导出是比较常见的场景,以前都是直接用用公司的工具类,这次自己封装了一个。导出的文件的格式是xlsx的,
需要office2007才能打开。小编的上一篇解决下载中文名文件乱码的问题就是来自这个工具类。下面直接上代码

一、代码

        (1)maven依赖
	<!-- poi的jar包  -->
	<dependency> 
		<groupId>org.apache.poi</groupId>
		<artifactId>poi</artifactId>
		<version>3.15</version>
	</dependency>
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>3.15</version>
	</dependency>
        (2)工具类代码
package com.tax.core.util;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * Excel工具类
 * @author   ZENG.XIAO.YAN
 * @date 	 2017年7月27日 下午3:02:22
 * @version  v1.0
 */
public class ExcelUtils {
	
	/**
	 * 导出数据到Excel
	 * @param fileName	     		文件名,不包含后缀
	 * @param sheetName   			sheet名
	 * @param title		     		标题 
	 * @param cellTitles  			每一列的标题	
	 * @param autoSizeColumnNum    	需要自动调整列宽的列的编号(从0开始)的数组,该参数可以为null
	 * @param data		   			数据: 一行数据封装成一个ArrayList,最后将所有ArrayList封装到一个List
	 * @param response	  			HttpServletResponse对象
	 * @throws Exception 
	 */
	public static void exportExcel(String fileName, String sheetName, String title, String[] cellTitles,
			int[] autoSizeColumnNum, List<ArrayList<Object>> data, HttpServletResponse response) throws Exception {
		
		/** 创建空的工作簿 */
		XSSFWorkbook workbook = new XSSFWorkbook();
		/** 创建工作表 */
		XSSFSheet sheet = workbook.createSheet(sheetName);
		
		/** 第一行标题处理  */
		// 合并单元格
		sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cellTitles.length-1)); 
		XSSFRow row01 = sheet.createRow(0);
		XSSFCell cell01 = row01.createCell(0);
		// 设置单元格内容
		cell01.setCellValue(title);
		// 创建单元格样式
		XSSFCellStyle cellStyle01 = createCellStyle(workbook,"Courier New",(short)18,true);
		// 设置单元格样式
		cell01.setCellStyle(cellStyle01);
		
		/** 第二行列标题的处理  */
		// 创建单元格样式
		XSSFCellStyle cellStyle02 = createCellStyle(workbook,"Courier New",(short)13,true);
		XSSFRow row02 = sheet.createRow(1);
		// for循环创建单元格并赋值和设置样式
		for (int i = 0; i < cellTitles.length; i++) {
			XSSFCell titleCell = row02.createCell(i);
			titleCell.setCellValue(cellTitles[i]);
			titleCell.setCellStyle(cellStyle02);
		}
		
		/** 中间行的处理  */
		// 创建单元格样式
		XSSFCellStyle cellStyle03 = createCellStyle(workbook,null,(short)12,false);
		// for循环处理
		for (int i = 0; i < data.size(); i++) {
			XSSFRow row = sheet.createRow(i + 2);
			for(int j = 0; j < data.get(i).size(); j++) {
				XSSFCell cell = row.createCell(j);
				Object value = data.get(i).get(j);
				cell.setCellValue(value == null ? "" : value.toString());
				cell.setCellStyle(cellStyle03);
			}
		}
		
		/** 设置自动调整列宽  */
		// 某些情况下,有的列内容太长需要自动调整列宽
		for (int i = 0; i < autoSizeColumnNum.length; i++) {
			sheet.autoSizeColumn(autoSizeColumnNum[i]);
		}
		/** 下载时文件名为中文:乱码解决 */
		// 响应的过程:
		// 服务器: utf-8|gbk --> iso8859-1    浏览器: iso8859-1 --> utf-8|gbk (firefox、chrome)
		// 服务器: gbk --> iso8859-1    浏览器: iso8859-1 --> gbk (msie)
		fileName = new String(fileName.getBytes("gbk"), "iso8859-1");
		/** 设置下载的文件名 */
		response.setHeader("content-disposition", "attachment;filename=" + fileName + ".xlsx");
        /** 向浏览器输出Excel文件 */
		workbook.write(response.getOutputStream());
		/** 关闭工作簿 */
		workbook.close();
	}

	
	/**
	 * 创建单元格样式方法
	 * @param workbook  工作簿
	 * @param fontName  字体名字
	 * @param fontSize	字体大小
	 * @param isBlod    是否加粗
	 * @return  单元格样式XSSFCellStyle
	 */
	private static XSSFCellStyle createCellStyle(XSSFWorkbook workbook, String fontName, short fontSize,
			boolean isBlod) {
		// 通过工作簿创建样式
		XSSFCellStyle cellStyle = workbook.createCellStyle();
		// 设置水平和垂直居中
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
		// 通过工作簿创建字体
		XSSFFont font = workbook.createFont();
		// 设置字体
		if (null != fontName && !"".equals(fontName)) {
			font.setFontName(fontName);
		}
		// 设置字体大小
		font.setFontHeightInPoints(fontSize);
		// 设置字体是否加粗
		font.setBold(isBlod);
		// 把字体set到样式中
		cellStyle.setFont(font);

		return cellStyle;
	}
}

二、工具类在struts2中使用示例


 结果:
        
 

posted @ 2017-08-19 19:05  zeng1994  阅读(485)  评论(0编辑  收藏  举报