zoukankan      html  css  js  c++  java
  • 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中使用示例


     结果:
            
     

  • 相关阅读:
    游览器保存密码和自动填充密码的困惑 (browser save password and auto fill password )
    SQL basic
    ui router digest 10 time
    HttpCookie
    web api 2 学习笔记 (OData Batch request)
    $provide.decorator
    Entity Framewor 学习笔记 (碎碎的东西)
    生活类App原型制作分享-AnyList
    2019年网页设计趋势前瞻,先睹为快!
    Mockplus3.5.0.1新增标注功能
  • 原文地址:https://www.cnblogs.com/zeng1994/p/7397627.html
Copyright © 2011-2022 走看看