`

excel导出

 
阅读更多
/**
	 * 导出excel
	 * 导出的excel只有一个表格,支持复杂的表头
	 * 
	 * @param dataset 需要显示的数据集合 <br/>
	 *    在excel中的显示的数据样式,必须已转换成相应的格式,<br/>
	 *    如:一个date数据,想在excel中显示为2013-07-20,那么在组装List的时候,一定要求把date的格式转换成字符串的格式。<br/>
	 *    在这个方法中只是负责显示出来传递过来的数据,不进行数据格式的转换。<br/>
	 * @param mergeHeader excel表头合并的列集合:由行和列组成<br/>
	 *    其中的Map是由四个元素组成分别为first_row:合并起始行;last_row:合并结束行;first_column:合并起始列;last_column:合并结束列<br/>
	 *    表头合并时,是开始行表头的值覆盖结束行表头的值或者开始列表头的值覆盖结束列表头的值。<br/>
	 *    如:从第一行第一列(表头的值:第一行)到第三行第一列(表头的值:第三行)的表头进行合并,那么最后导出来的excel的表头的值为第一行
	 * @param headers 表格属性列名数组<br/>
	 *    是一个二维数组,这个数组一定要注意放入的顺序。因为excel表头的显示都是按照这个数组的顺序遍历生成的
	 * @param headerKey 对应数据库中的字段名称的数组<br/>
	 *    这个数组一定要与header这个二维数组的值要对应。<br/>
	 *    如:各个值与数据库中的字段相对应如下,组织名称--group_name,护士名称--name,如果header数组为{组织名称,护士名称},那么headerKey这个数组的顺序一定为{group_name,name}<br/>
	 *    如果不是这样的顺序的话,那么excel中显示的值,会与表头的值对应不上出现数据错误
	 * @param title 标题  excel表格的名称
	 * @param out 输出流   导出放入的位置
	 */
	public void exportExcel(List<Map> dataset,List<Map<String,Integer>> mergeHeader,String[][] headers,String[] headerKey,String title,OutputStream out){
		 // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet(title);
        // 设置表格默认列宽度为8个字节
        sheet.setDefaultColumnWidth((short) 8);
        HSSFCellStyle style = workbook.createCellStyle();
        //设置边框
        setBorder(style, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN);
        //设置excel表头居中显示,字体加粗
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        setFont(workbook, style, null, (short) 10, HSSFColor.GREY_80_PERCENT.index, true);
        
        //excel需要显示的单元格的样式
        HSSFCellStyle style1 = workbook.createCellStyle();
        setBorder(style1, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN);
        try {
        	//生成表头
        	createExcelHeader(sheet, style, mergeHeader, headers);
        	//excel赋值
        	int headerRow = headers.length;
        	setDataSet(sheet, style1, dataset, headerKey, headerRow);
            workbook.write(out);
        } catch (IOException e) {
            e.printStackTrace();
        }
	}
	
	/**
	 * 导出excel
	 * 导出的excel只有一个表格,支持复杂的表头
	 * 
	 * @param dataset需要显示的数据集合 <br/>
	 *    在excel中的显示的数据样式,必须已转换成相应的格式,<br/>
	 *    如:一个date数据,想在excel中显示为2013-07-20,那么在组装List的时候,一定要求把date的格式转换成字符串的格式。<br/>
	 *    在这个方法中只是负责显示出来传递过来的数据,不进行数据格式的转换。<br/>
	 * @param headerList excel表头对象的集合<br/>
     *        添加对象的时候,注意添加的顺序即先添加就显示在前面。因为excel表头的显示是直接遍历headerList<br/>
     *        注意headerList中的对象ExcelHeaderColumnPojo中headerLabel不能为空
	 * @param out 输出流   导出放入的位置
	 * @param title 标题  excel表格的名称
	 * @param headerTotalRow excel表头总共占的行数
	 * @param headerTotalColumn excel表头总共占的列数
	 */
	public void exportExcel(List<Map> dataset,List<ExcelHeaderColumnPojo> headerList,OutputStream out,String title,int headerTotalRow,int headerTotalColumn){
		 // 声明一个工作薄
       HSSFWorkbook workbook = new HSSFWorkbook();
       // 生成一个表格
       HSSFSheet sheet = workbook.createSheet(title);
       // 设置表格默认列宽度为8个字节
       sheet.setDefaultColumnWidth((short) 8);
       HSSFCellStyle style = workbook.createCellStyle();
       //设置边框
       setBorder(style, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN);
       //设置excel表头居中显示,字体加粗
       style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
       setFont(workbook, style, null, (short) 10, HSSFColor.GREY_80_PERCENT.index, true);
       
       //excel需要显示的单元格的样式
       HSSFCellStyle style1 = workbook.createCellStyle();
       setBorder(style1, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN, HSSFCellStyle.BORDER_THIN);
       List<Map<String,Integer>> mergeHeader = new ArrayList<Map<String,Integer>>();
       String[][] headers = new String[headerTotalRow][headerTotalColumn];
       String[] headerKeys = new String[headerTotalColumn];
       try {
	    	//根据excel表头对象组装表头集合
	    	getHeaderArray(headerList, mergeHeader, headers, headerKeys);
	       	//生成表头
	       	createExcelHeader(sheet, style, mergeHeader, headers);
	       	//excel赋值
	       	int headerRow = headers.length;
	       	setDataSet(sheet, style1, dataset, headerKeys, headerRow);
	        workbook.write(out);
       } catch (IOException e) {
           e.printStackTrace();
       } catch (Exception e) {
    	   e.printStackTrace();
       }
	}
	
    /**
     * 创建excel表头
     * 
     * @param sheet excel表单
     * @param style 单元格样式
     * @param mergeHeader 合并的列集合:由行和列组成
     * @param headers 表格属性列名数组
     */
    public void createExcelHeader(HSSFSheet sheet,HSSFCellStyle style,List<Map<String,Integer>> mergeHeader,String[][] headers){
        for (short i = 0; i < headers.length; i++) {
        	HSSFRow row = sheet.createRow(i);
        	for(short j=0; j<headers[i].length; j++){
	            HSSFCell cell = row.createCell(j);
	            if(style != null) cell.setCellStyle(style);
	            HSSFRichTextString text = new HSSFRichTextString(headers[i][j]);
	            cell.setCellValue(text);
        	}
        }
        //excel表头合并
        mergeHeader(sheet, mergeHeader);
    }
    
    /**
     * excel赋值
     * 
     * @param sheet excel表单
     * @param style 单元格样式
     * @param dataset 需要显示的数据集合
     * @param headerKey 对应数据库中的字段名称的数组
     * @param headerRow excel表头所占了多少行
     */
    public void setDataSet(HSSFSheet sheet,HSSFCellStyle style,List<Map> dataset,String[] headerKey,int headerRow){
    	for(int i = 0;i<dataset.size();i++){
    		Map map = dataset.get(i);
    		HSSFRow row = sheet.createRow(i+headerRow);
    		for(int j=0;j<headerKey.length;j++){
    			HSSFCell cell = row.createCell(j);
    			if(style != null) cell.setCellStyle(style);
    			String cellName = headerKey[j];
    			String cellValue = map.get(cellName)==null?"":map.get(cellName).toString();
    			if(!StringUtil.isEmpty(cellValue)) cell.setCellValue(cellValue);
    		}
    	}
    }
    
    /**
     * excel表头合并
     * 
     * @param sheet excel表单
     * @param mergeHeader 合并的列集合
     */
    public void mergeHeader(HSSFSheet sheet,List<Map<String,Integer>> mergeHeader){
    	if(mergeHeader==null || mergeHeader.size() == 0) return;
    	for(Map map:mergeHeader){
    		int firstRow = (Integer) map.get("first_row");
    		int lastRow = (Integer) map.get("last_row");
    		int firstColumn = (Integer) map.get("first_column");
    		int lastColumn = (Integer) map.get("last_column");
    		sheet.addMergedRegion(new CellRangeAddress(firstRow,lastRow,firstColumn,lastColumn));
    	}
    }
    
    /**
     * 设置单元格的边框
     * 
     * @param style 单元格样式
     * @param bottom 下边框
     * @param left 左边框
     * @param right 右边框
     * @param top 上边框
     */
    public void setBorder(HSSFCellStyle style,short bottom,short left,short right,short top){
        style.setBorderBottom(bottom);
        style.setBorderLeft(left);
        style.setBorderRight(right);
        style.setBorderTop(top);
    }
    
    /**
     * 设置单元格的背景颜色
     * 
     * @param style 单元格样式
     * @param backgroundColor 背景颜色
     */
    public void setBackGroudColor(HSSFCellStyle style,short backgroundColor){
        style.setFillForegroundColor(backgroundColor);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
    }
    
    /**
     * 设置单元格的字体
     * 
     * @param workbook excel 工作薄
     * @param style 单元格样式
     * @param fontName 字体样式
     * @param fontSize 字体大小
     * @param fontColor 字体颜色
     * @param fontWeight 是否加粗  true:是,false:正常
     */
    public void setFont(HSSFWorkbook workbook,HSSFCellStyle style,String fontName,short fontSize,short fontColor,boolean fontWeight){
    	HSSFFont font = workbook.createFont();
    	if(!StringUtil.isEmpty(fontName)) font.setFontName(fontName);
    	font.setFontHeightInPoints(fontSize);//设置字体大小
    	font.setColor(fontColor);//设置字体颜色
    	if(fontWeight) font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗
    	style.setFont(font);//选择需要用到的字体格式
    }
    
    /**
     * 组装excel表头合并的集合
     * 
     * @param mergeArray 需要合并的excel表头数组
     * 二维数组并且长度必须等于四。如int[1][4],int[5][4]
     * @return list
     */
    public List<Map<String,Integer>> addMergeList(int[][] mergeArray){
    	List<Map<String,Integer>> mergeHeader = new ArrayList<Map<String,Integer>>();
    	for(int i=0;i<mergeArray.length;i++){
    		Map<String,Integer> mergeMap = new HashMap<String, Integer>();
			mergeMap.put("first_row", mergeArray[i][0]);
			mergeMap.put("last_row", mergeArray[i][1]);
			mergeMap.put("first_column", mergeArray[i][2]);
			mergeMap.put("last_column", mergeArray[i][3]);
			mergeHeader.add(mergeMap);
    	}
		return mergeHeader;
    }
    
    /**
     * 根据excel表头对象组装表头集合
     * 
     * @param headerList excel表头对象的集合<br/>
     *        添加对象的时候,注意添加的顺序即先添加就显示在前面。因为excel表头的显示是直接遍历headerList<br/>
     *        注意headerList中的对象ExcelHeaderColumnPojo中headerLabel不能为空
     * @param mergeHeader excel表头合并的列集合  即创建一个空的集合
     * @param headers 表格属性列名数组 -- 创建一个空的二位数组
     * @param headerKeys 对应数据库中的字段名称的数组 -- 创建一个空的数组
     * @throws Exception 
     */
    public void getHeaderArray(List<ExcelHeaderColumnPojo> headerList,List<Map<String,Integer>> mergeHeader,String[][] headers,String[] headerKeys) throws Exception{
    	int curRowNum = -1,curIndex=0;
    	String mergerNum = "";
    	int headerSize = headerList.size();
    	int keysLength = headerKeys.length;
    	for(int i=0;i<headerSize;i++){
    		ExcelHeaderColumnPojo header = headerList.get(i);
    		String headerLabel = header.getHeaderLabel();
    		if(StringUtil.isEmpty(headerLabel)){
    			throw new Exception("excel中的表头单元格名称不能有空的字段");
    		}
    		String headerKey = header.getHeaderKey();
    		int rowNum = header.getRowNum();
    		//获取当前列的序列号
    		if(curRowNum == rowNum){
    			curIndex = curIndex+1;
    		}else{
    			curIndex = 0;
    			curRowNum = rowNum;
    		}
    		//判断当前单元格是否已合并
    		if(!StringUtil.isEmpty(mergerNum) && mergerNum.indexOf(rowNum+"-"+curIndex) != -1){
    			headers[rowNum][curIndex] = "";
    			for(int j=0;j<100000;j++){
    				curIndex = curIndex+1; 
    				if(curIndex == keysLength)
    					return;
    				if(mergerNum.indexOf(rowNum+"-"+curIndex) == -1){
    					break;
    				}
    				headers[rowNum][curIndex] = "";
    			}
    		}
    		headers[rowNum][curIndex] = headerLabel;
    		if(!StringUtil.isEmpty(headerKey)) headerKeys[curIndex] = headerKey;
    		//组装excel表头合并的集合
    		int occupyColumnNum = header.getOccupyColumnNum();
    		int occupyRowNum = header.getOccupyRowNum();
    		mergerNum = addMergeList(mergeHeader, mergerNum, occupyColumnNum, occupyRowNum, curRowNum, curIndex);
    	}
    }
    
    /***
     * 组装excel表头合并的集合
     * 
     * @param mergeHeader excel表头合并的集合
     * @param mergerNum  已合并的行和列的字符串
     * @param occupyColumnNum 当前单元格占用的列
     * @param occupyRowNum 当前单元格占用的行
     * @param curRowNum 当前单元格行序列号
     * @param curIndex 当前单元格列序列号
     * 
     * @return string
     */
    private String addMergeList(List<Map<String,Integer>> mergeHeader,String mergerNum,int occupyColumnNum,int occupyRowNum,int curRowNum,int curIndex){
    	if(occupyRowNum==1 && occupyColumnNum == 1) return mergerNum;
    	//组装excel表头合并的集合
    	Map<String,Integer> mergeMap = new HashMap<String, Integer>();
    	int lastRowNum = curRowNum+occupyRowNum-1;
    	int lastColumnNum = curIndex+occupyColumnNum-1;
    	mergeMap.put("first_row", curRowNum);
		mergeMap.put("last_row", lastRowNum);
		mergeMap.put("first_column", curIndex);
		mergeMap.put("last_column", lastColumnNum);
		mergeHeader.add(mergeMap);
		
		//获得合并的列和行
		for(int i=curRowNum;i<lastRowNum+1;i++){
			for(int j=curIndex;j<lastColumnNum+1;j++){
				if(curRowNum != i || curIndex != j)
					mergerNum = mergerNum + "," + i+"-"+j;
			}
		}
		return mergerNum;
    }


public class ExcelHeaderColumnPojo {
	
	//表头单元格名称
	private String headerLabel;
	
	//与表头单元格相对应的数据库字段名称
	private String headerKey;
	
	//表头单元格在excel中第几行
	private int rowNum;
	
	//当前单元格占用几行,默认一行
	private int occupyRowNum = 1;
	
	//当前单元格占用几列,默认一列
	private int occupyColumnNum = 1;
	
	public String getHeaderLabel() {
		return headerLabel;
	}
	
	/**
	 * 表头单元格名称
	 * @param headerLabel
	 */
	public void setHeaderLabel(String headerLabel) {
		this.headerLabel = headerLabel;
	}

	public String getHeaderKey() {
		return headerKey;
	}

	/**
	 * 与表头单元格相对应的数据库字段名称
	 * @param headerKey
	 */
	public void setHeaderKey(String headerKey) {
		this.headerKey = headerKey;
	}

	public int getRowNum() {
		return rowNum;
	}
	
	/**
	 * 表头单元格在excel中第几行
	 * @param rowNum
	 */
	public void setRowNum(int rowNum) {
		this.rowNum = rowNum;
	}

	public int getOccupyRowNum() {
		return occupyRowNum;
	}
	
	/**
	 * 当前单元格占用几行,默认一行
	 * @param occupyRowNum
	 */
	public void setOccupyRowNum(int occupyRowNum) {
		this.occupyRowNum = occupyRowNum;
	}

	public int getOccupyColumnNum() {
		return occupyColumnNum;
	}

	/**
	 * 当前单元格占用几列,默认一列
	 * 
	 * @param occupyColumnNum
	 */
	public void setOccupyColumnNum(int occupyColumnNum) {
		this.occupyColumnNum = occupyColumnNum;
	}
}
分享到:
评论

相关推荐

    excel导出支持前台和后台导出

    在IT行业中,Excel导出是一项常见的功能,尤其在企业级应用中,用于数据报表的生成与分享。"Excel导出支持前台和后台导出"这一技术主题涉及到如何在Web应用程序中实现用户请求的数据导出到Excel文件,既可以选择在...

    excel导出实现代码

    在IT行业中,Excel导出是一项常见的需求,尤其是在数据处理、报表生成和数据分析等领域。Apache POI是一个开源项目,专门用于读取和写入Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。以下是对"Excel导出...

    Excel导出数据(根据Excel模板定义)

    "Excel导出数据(根据Excel模板定义)"这个主题涉及到的核心技术是如何根据预设的Excel模板生成和导出数据,通常用于批量生成报表或者进行复杂的数据呈现。下面将详细解释这一过程及其相关知识点。 1. **Excel模板...

    新版excel导出控件.rar_donec1p_pb_pb excel_pb 导出_pb导出excel

    在这个场景中,"新版excel导出控件.rar_donec1p_pb_pb excel_pb 导出_pb导出excel" 的标题和描述提到了一个关键的开发需求:在PB应用中导出数据到Excel文件。 传统的PowerBuilder(PB)自身虽然提供了数据窗口...

    海量千万级Excel导出源码-自动分sheet

    然而,当面对千万级甚至更大规模的数据时,传统的Excel导出方式会面临诸多挑战,如文件大小限制、性能瓶颈等。针对这一问题,"海量千万级Excel导出源码-自动分sheet"提供了一种解决方案。 首先,我们要理解为什么...

    excel导出公共组件

    在IT行业中,Excel导出公共组件是一个非常实用的功能,它允许开发者通过编程方式将查询到的数据高效地导出为Excel格式的文件。这样的组件通常被广泛应用于数据分析、报表生成、数据备份等领域,使得用户可以方便地对...

    Excel导出时不要表头.txt

    ### Excel导出时不要表头知识点详解 #### 一、知识点概述 在处理大量数据时,Excel 是一种非常实用的数据管理工具。有时我们可能需要将数据从数据库或其他数据源导出到Excel文件中,但在这个过程中,我们并不希望...

    Excel导出百万级数据

    本话题将深入探讨如何使用C#编程语言来解决“Excel导出百万级数据”的问题。 首先,我们需要理解Excel的性能瓶颈。Excel本身对打开和操作大量数据有一定限制,特别是2003版本之前的XLS格式,最大行数为65536行,而...

    POI的EXCEL导出,自动换行

    ### POI的EXCEL导出,自动换行 在日常工作中,经常需要处理大量的数据导入导出任务,尤其是在企业级应用开发中,Excel文件的处理成为了一项必不可少的能力。Apache POI项目提供了一系列用于读写Microsoft Office...

    ExtJS实现Excel导出

    ### ExtJS实现Excel导出:深入解析与实践 在当今高度数字化的工作环境中,数据的管理和呈现方式至关重要。其中,Excel作为数据处理和分析的重要工具,其导出功能在各种应用场景中显得尤为关键。ExtJS,作为一种强大...

    java Excel导出导入

    java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入

    ASP excel导出/导入Access数据库(代码+实例下载)

    在"ASP excel导出/导入Access数据库(代码+实例下载)"这个主题中,我们将探讨如何使用ASP实现这两个功能。首先,我们来看Excel导出到Access数据库的过程。 1. **Excel数据导入Access**: - 首先,你需要使用ADO...

    php excel导出 导入

    "php excel导出 导入"这个主题涵盖了一系列的技术点,包括如何使用PHP与Excel文件进行交互。下面将详细讲解这个主题。 1. **PHPExcel库** PHPExcel是一个强大的PHP类库,它允许开发者创建、读取和修改Microsoft ...

    JAVA poi 做EXCEL导出(包含图片) 完整版

    本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel导出功能。 首先,你需要在项目中引入Apache POI依赖。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache....

    多个excel导出压缩成zip 文件 数据量大导出

    "多个Excel导出压缩成zip文件"的场景通常是为了解决数据量过大导致的文件管理不便、传输效率低以及存储空间占用过多等问题。下面我们将深入探讨这个话题,主要涵盖以下几个方面: 1. **大数据量导出**: - 当数据...

    C#导出Excel 导出PDF

    本主题聚焦于如何利用C#实现数据的导出功能,包括将查询结果或表格信息导出为Excel文件和PDF文档。这两种格式在数据共享、报告生成和打印等方面非常常见。 首先,我们来看C#导出Excel的实现。Excel文件通常以`.xlsx...

    Excel导出、自定义表头、锁定首行、合并、字体、边框

    首先,Excel导出是一个常用的功能,它允许我们将工作簿中的数据保存为多种格式,如CSV、PDF或XML等,便于数据交换和备份。在编程环境中,可以使用Python的pandas库或VBA宏来批量自动化这个过程。 其次,自定义表头...

    excel导出lua和xml工具

    Excel导出Lua和XML工具是一种实用的软件工具,它允许用户通过Excel表格来方便地管理和导出数据到Lua脚本语言或XML(可扩展标记语言)格式。在IT行业中,这两种格式都有各自的用途和优势。 Lua是一种轻量级的、...

    excel 自定义列导出, excel导出

    标题说的很清楚,利用asm-3.1.jar,cglib-2.2.jar,commons-io-1.3.2.jar,poi-3.9-20121203.jar 开发的一个工具包。 其中用到字节码编码,反射,excel操作。...主要功能1、自定义列导出excel Main()类为测试用例

    Excel导出两种方式

    在Excel导出中,我们可以定义一个javabean,每个属性对应Excel表格中的一列。以下是一个简单的步骤: 1. **创建javabean**: 假设我们有一个`Student`类,包含`name`, `age`, `imagePath`等属性。 2. **填充数据**: ...

Global site tag (gtag.js) - Google Analytics