`
dilantaya
  • 浏览: 102924 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

jxl导出excel数据工具类

 
阅读更多
package com.yihaodian.tms.framework.util;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.List;
import java.util.Map;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.write.DateFormats;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import scm.common.util.StringUtils;

import com.yihaodian.tms.master.model.SysEnumerate;


public class ExcelExportUtil<E> {

	public static final Log log = LogFactory.getLog(ExcelExportUtil.class);
	
	/* Exce文件后缀 */
	public static final String EXECL_FILE_SUFFIX = ".xls";
	
	/* 需要导出的list */
	protected List<E> list;
	
	/* 导出文件存放目录 */
	protected String dir;
	
	/* 文件名(不包含后缀) */
	protected String fileNamePrefix;
	
	/* 标题 */
	protected String title;
	
	/* 副标题(可选) */
	protected String subTitle;

	/* 需要导出的列  */
	protected Column[] columns;

	/* 标题样式 */
	protected WritableCellFormat titleFormat;
	
	/* 副标题样式 */
	protected WritableCellFormat subTitleFormat;

	/* 列数据样式 */
	protected WritableCellFormat[] columnFormat;
	
	/* 普通默认样式 */
	protected WritableCellFormat normalFormat;
	
	/* 标题样式 */
	protected WritableCellFormat headerFormat;

	/* 列宽 */
	protected Integer[] columnWidth;
	
	/* 分栏数目 */
	protected int subfieldNum = 1;
	
	/* 当前行号 */
	protected int currentRowNum = 0;

	/* 时间格式 */
	protected String dateFormat = "yyyy/MM/dd HH:mm:ss";
	
	protected Map dataDict = null;
	
	/**
	 * 
	 * @param list 需要导出的列表
	 * @param dir 导出文件的存放目录
	 * @param fileNamePrefix 文件名(不含后缀)
	 * @param title 标题
	 * @param columns 列
	 * @throws WriteException
	 */
	public ExcelExportUtil(List<E> list, String dir, String fileNamePrefix, String title, Column[] columns) throws WriteException {
		this.list = list;
		this.dir = dir;
		this.fileNamePrefix = fileNamePrefix;
		this.title = title;
		this.columns = columns;
		File dirFile = new File(this.dir);
		if (!dirFile.exists()) {
			dirFile.mkdirs();
		}
	}
	/**
	 * 
	 * @param list 需要导出的列表
	 * @param dir 导出文件的存放目录
	 * @param fileNamePrefix 文件名(不含后缀)
	 * @param title 标题
	 * @param columns 列
	 * @throws WriteException
	 */
	public ExcelExportUtil(List<E> list, String dir, String fileNamePrefix, String title, Column[] columns, Map dataDict) throws WriteException {
		this(list, dir,fileNamePrefix,title,columns);
		this.dataDict = dataDict;
	}
	
	/**
	 * 
	 * <pre>
	 * 导出excel并返回文件名(包含路径)
	 * </pre>
	 *
	 * @param withIndex 是否需要在每条记录前加上序号
	 * @return
	 * @throws IOException
	 * @throws WriteException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public String exportToExcel(boolean withIndex) throws IOException, WriteException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {

		// 初始化单元格样式
		initCellFormat();

		// 创建文件
		String fileName = dir + File.separatorChar + fileNamePrefix + EXECL_FILE_SUFFIX;
		File file = new File(fileName);
		WritableWorkbook book = null;
		try {
			book = Workbook.createWorkbook(file);
			WritableSheet sheet = book.createSheet("Sheet_1", 0);

			// 设置列宽
			if (columnWidth != null) {
				for (int i = 0; i < columnWidth.length * subfieldNum; i++) {
					sheet.setColumnView(i, columnWidth[i % columnWidth.length]);
				}
			}
			// 写入标题
			exportTitle(sheet, withIndex);
			// 写入表头
			exportTableHeader(sheet, withIndex);
			// 写入数据
			exportData(sheet, withIndex);
			book.write();
		} catch (IOException e) {
			log.error("创建文件出错:", e);
		} catch (WriteException e) {
			log.error("写文件出错:", e);
		} catch (RuntimeException e) {
			log.error("运行时错误", e);
        } catch (NoSuchFieldException e) {
        	log.error("无此属性", e);
        } finally {
			if (book != null) {
				book.close();
			}
		}

		return fileName;
	}
	
	/**
	 * <pre>
	 * 导出excel并返回字节数组
	 * </pre>
	 * @param withIndex
	 * @return
	 * @throws IOException
	 * @throws WriteException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public byte[] exportExcelToByteArray(boolean withIndex) throws IOException, WriteException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {

		// 初始化单元格样式
		initCellFormat();

		  // 创建工作薄
	    ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
		WritableWorkbook book = null;
		try {
			book = Workbook.createWorkbook(byteOut);
			WritableSheet sheet = book.createSheet("Sheet_1", 0);

			// 设置列宽
			if (columnWidth != null) {
				for (int i = 0; i < columnWidth.length * subfieldNum; i++) {
					sheet.setColumnView(i, columnWidth[i % columnWidth.length]);
				}
			}
			// 写入标题
			exportTitle(sheet, withIndex);
			// 写入表头
			exportTableHeader(sheet, withIndex);
			// 写入数据
			exportData(sheet, withIndex);
			book.write();
		} catch (IOException e) {
			log.error("创建文件出错:", e);
		} catch (WriteException e) {
			log.error("写文件出错:", e);
		} catch (RuntimeException e) {
			log.error("运行时错误", e);
        } catch (NoSuchFieldException e) {
        	log.error("无此属性", e);
        } finally {
			if (book != null) {
				book.close();
			}
		}

        return  byteOut.toByteArray();//将输出流转换成字节数组
	}
	
	/**
	 * 
	 * <pre>
	 * 写入标题
	 * </pre>
	 *
	 * @param sheet
	 * @param tableWidth 表格宽度
	 * @throws RowsExceededException
	 * @throws WriteException
	 */
	protected void exportTitle(WritableSheet sheet, boolean witdhIndex) throws RowsExceededException, WriteException {
		int tableWidth = 0;
		// 计算表格宽度
		if (witdhIndex) {
			tableWidth = (columns.length + 1) * subfieldNum;
		} else {
			tableWidth = columns.length * subfieldNum;
		}
		// 写入标题(如果有)
		if (this.title != null) {
		    sheet.mergeCells(0, currentRowNum, tableWidth - 1, currentRowNum);
		    Label titleLb = new Label(0, currentRowNum++, title, titleFormat);
		    sheet.addCell(titleLb);
        }
        
        // 写入副标题(如果有)
        if (this.subTitle != null) {
            sheet.mergeCells(0, currentRowNum, tableWidth - 1, currentRowNum);
            Label subTitleLb = new Label(0, currentRowNum++, subTitle, subTitleFormat);
            sheet.addCell(subTitleLb);
        }
	}

	/**
	 * 
	 * <pre>
	 * 写入表头
	 * </pre>
	 *
	 * @param sheet
	 * @throws RowsExceededException
	 * @throws WriteException
	 */
	protected void exportTableHeader(WritableSheet sheet, boolean withIndex)
			throws RowsExceededException, WriteException {
		for (int i = 0; i < subfieldNum; i++) {
			if (withIndex) {
				Label indexName = new Label((columns.length + 1) * i,
						currentRowNum, "序号", headerFormat);
				sheet.addCell(indexName);
				for (int j = (columns.length + 1) * i + 1; j < (columns.length + 1)
						* (i + 1); j++) {
					Label columnHead = new Label(j, currentRowNum,
							this.columns[j % (columns.length + 1) - 1]
									.getColName(), headerFormat);
					sheet.addCell(columnHead);
				}
			} else {
				for (int j = columns.length * i; j < columns.length * (i + 1); j++) {
					String content = this.columns[j % columns.length]
							.getColName();
					Label columnHead = new Label(j, currentRowNum, content,
							headerFormat);
					sheet.addCell(columnHead);
				}
			}

		}
	}
	
	/**
	 * 
	 * <pre>
	 * 写入数据
	 * </pre>
	 *
	 * @param sheet
	 * @param widthIndex 是否需要在每条记录前加上序号
	 * @throws NoSuchMethodException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws WriteException
	 * @throws NoSuchFieldException 
	 * @throws SecurityException 
	 */
	protected void exportData(WritableSheet sheet, boolean widthIndex) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, WriteException, SecurityException, NoSuchFieldException {
		// 写入数据
		if (list == null || list.isEmpty())
			return;
		// ----------------取得数据并添加到excel中------------------
		// 记录条数
		Integer count = 0;
		// 列号
		int columnNum = 0;

		for (E element : list) {
			if (count % subfieldNum == 0) {
				// 换行
				currentRowNum++;
				// 列号置0
				columnNum = 0;
			}
			count++;
			// 写入序号
			if (widthIndex) {
				Label index = new Label(columnNum++, currentRowNum,
						count.toString(), normalFormat);
				sheet.addCell(index);
			}
			for (int i = 0; i < columns.length; i++) {
				String colContent = "";
				Object obj =null;
				String field = columns[i].getColField();
				
				//递归获取对象多级关联的字段值   重构 by zhaowen
				obj = getObjectByField(field, element);
				if (obj != null) {
					if (obj instanceof Date) {
						Date date = (Date) obj;
						WritableCellFormat defaultDateFormat =  new WritableCellFormat(DateFormats.FORMAT9);
						defaultDateFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
						defaultDateFormat.setAlignment(Alignment.CENTRE);
						DateTime labelDT = new DateTime(columnNum++, currentRowNum, date, defaultDateFormat);
						sheet.addCell(labelDT);
						continue;
					} else {
						//做数据 值->名称 转换
						if(columns[i].getColType()!=null){
							colContent = convertValue2Name(obj,columns[i].getColType());
						}else{
							colContent = obj.toString();
						}
					}
				}
				Label columnData = new Label(columnNum++, currentRowNum,
						colContent, columnFormat[i]);
				sheet.addCell(columnData);
			}
		}
	}
	
	/**
	 * 递归获取对象多级关联的字段值
	 * by zhaowen
	 * @param field
	 * @param target
	 * @return
	 * @throws NoSuchMethodException 
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 * @throws SecurityException 
	 * @throws IllegalArgumentException 
	 * @throws Exception
	 */
	private Object getObjectByField(String field, Object target) throws IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
		if(StringUtils.isEmpty(field)||target==null){
			return null;
		}
		if(field.contains(".")){
			String subObjectName = null;
			int split=field.indexOf(".");
			subObjectName = field.substring(0,split);
			String getSubObjMethod="get" + StringUtils.upperCaseFirstCharacter(subObjectName);
            Object subObject=target.getClass().getMethod(getSubObjMethod, new Class[] {}).invoke(target);
            return getObjectByField(field.substring(split+1), subObject);
		}
		else{
			String getSubObjMethod="get" + StringUtils.upperCaseFirstCharacter(field);
            return target.getClass().getMethod(getSubObjMethod, new Class[] {}).invoke(target);
		}
	}
	
	
	/**
	 * 做数据 值->名称 转换
	 * @param obj
	 * @param dataType
	 * @return
	 */
	private String convertValue2Name(Object obj,String dataType){
		Map<Integer,SysEnumerate> typeMap = (Map<Integer,SysEnumerate>)this.dataDict.get(dataType);
		return typeMap.get(obj).getEnumValue();
	}

	/**
	 * 
	 * <pre>
	 * 列对象
	 * </pre>
	 *
	 * @author gujinrong
	 * @version $Id: ExcelExporter.java, v 0.1 2011-11-7 下午04:38:08 gujinrong Exp $
	 */
	public static class Column {

		private String colField;

		private String colName;
		
		private String colType;
		
		public Column(String colField, String colName) {
			this.colField = colField;
			this.colName = colName;
		}
		public Column(String colField, String colName, String colType) {
			this.colField = colField;
			this.colName = colName;
			this.colType = colType;
		}
		
		public String getColType() {
			return colType;
		}

		public void setColType(String colType) {
			this.colType = colType;
		}

		public String getColField() {
			return colField;
		}

		public void setColField(String colField) {
			this.colField = colField;
		}

		public String getColName() {
			return colName;
		}

		public void setColName(String colName) {
			this.colName = colName;
		}
	}
	
	/**
	 * 
	 * <pre>
	 * 单元格格式初始化
	 * </pre>
	 *
	 * @throws WriteException
	 */
	private void initCellFormat() throws WriteException {
		
		// 设置默认单元格格式
		if (normalFormat == null) {
			normalFormat = new WritableCellFormat();
			normalFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);
			normalFormat.setAlignment(Alignment.CENTRE);
		}
		
		// 设置默认标题格式
		if (titleFormat == null) {
			WritableFont font = new WritableFont(WritableFont.createFont("宋体"),
					15);
			titleFormat = new WritableCellFormat(font);
			titleFormat.setAlignment(Alignment.CENTRE);
			titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN,
					Colour.BLACK);
		}

		// 设置默认副标题格式
		if (subTitleFormat == null) {
			subTitleFormat = normalFormat;
		}

		// 设置默认副标题格式
		if (headerFormat == null) {
			headerFormat = normalFormat;
		}

		// 设置默认列数据格式
		if (columnFormat == null) {
			columnFormat = new WritableCellFormat[columns.length];
			for (int i = 0; i < columns.length; i++) {
				columnFormat[i] = normalFormat;
			}
		}
	}

	/**
	 * 
	 * <pre>
	 *  设置某一列数据的格式
	 * </pre>
	 *
	 * @param format
	 * @param index
	 */
	public void setColumnFormatWithIndex(WritableCellFormat format, int index) {
		if (columnFormat == null) {
			columnFormat = new WritableCellFormat[columns.length];
			for (int i = 0; i < columns.length; i++) {
				columnFormat[i] = normalFormat;
			}
		}
		columnFormat[index] = format;
	}
	
	
	// --------------------------get/set方法-------------------------
	public void setSubTitle(String subTitle) {
		this.subTitle = subTitle;
	}

	public void setTitleFormat(WritableCellFormat titleFormat) {
		this.titleFormat = titleFormat;
	}

	public void setSubTitleFormat(WritableCellFormat subTitleFormat) {
		this.subTitleFormat = subTitleFormat;
	}

	public void setColumnFormat(WritableCellFormat[] columnFormat) {
		this.columnFormat = columnFormat;
	}

	public void setNormalFormat(WritableCellFormat normalFormat) {
		this.normalFormat = normalFormat;
	}

	public void setColumnWidth(Integer[] columnWidth) {
		this.columnWidth = columnWidth;
	}

	public void setSubfieldNum(int subfieldNum) {
		this.subfieldNum = subfieldNum;
	}

	public void setHeaderFormat(WritableCellFormat headerFormat) {
		this.headerFormat = headerFormat;
	}

	public void setDateFormat(String dateFormat) {
		this.dateFormat = dateFormat;
	}

}



分享到:
评论

相关推荐

    jxl导出excel工具类

    总结起来,`jxl导出excel工具类`是一个强大的工具,它能够帮助开发者快速实现数据到Excel的导出功能,减少重复代码,提高开发效率。通过合理的封装和设计,可以使得这类工具类在不同的项目中重用,降低维护成本。...

    Excel导入导出 jxl及Poi 工具类

    导出时,从数据库获取数据,生成Excel文件。 为了更好地理解这两个库的用法,你可以查看提供的"Excel导入导出(jxl及Poi)工具类"压缩包中的示例代码。通过阅读和运行这些代码,你可以更深入地了解如何在实际项目中...

    jxl.jar,excel数据工具类导出jar

    总的来说,jxl.jar是Java开发环境下处理Excel数据的得力工具,无论是在数据分析、报表生成还是数据导入导出场景下,都能发挥重要作用。通过熟练掌握jxl.jar的使用,开发者可以大大提高工作效率,减少手动操作的繁琐...

    JXL操作EXCEL的各个类的解析.doc

    首先,JXL 提供了一个抽象类 Workbook,该类相当于是一个工具类,用于生成 Excel 文件。Workbook 类提供了多种方法来生成 Excel 文件,例如 createWorkbook(File file)、createWorkbook(File file, Workbook in)、...

    使用jxl导出Excel表的好例子

    在实际应用中,通常会将上述代码封装成一个服务或工具类,以便在需要导出Excel时调用。这样不仅可以复用代码,还能提高开发效率。 总结来说,`jxl`库为Java开发者提供了一个强大而灵活的工具,用于生成和处理Excel...

    POI和JXL读取EXCEL数据的工具类(POI支持2007)

    在IT行业中,处理Excel数据是常见的任务,尤其是在数据分析、报表生成和数据导入导出等场景。本主题将详细讲解如何使用Apache POI和JExcelApi(JXL)这两个Java库来读取Excel文件,以及提供的工具类`PoiUtil.java`和...

    jxl导出excel

    这个工具类在处理大量数据时特别有用,比如从数据库中提取数据并以易于阅读的Excel表格形式提供给用户。 描述中提到的“导出详细说明,及相关代码和jar”,意味着我们将在接下来的内容中探讨如何使用jxl进行Excel...

    jxl导出excel总结

    《jxl导出Excel的深度解析与应用》 在信息化高度发展的今天,Excel作为数据处理和分析的重要工具,被广泛应用于各个领域。Java作为一种强大的编程语言,如何与Excel进行交互,成为了许多开发者关注的焦点。jxl库...

    jxl方式生成excel表格.zip

    在IT行业中,生成Excel表格是常见的数据处理任务,特别是在数据导入导出、报表生成和数据分析等领域。本资源提供了一个利用jxl库实现Java程序中生成Excel表格的解决方案。jxl是一个广泛使用的开源Java库,它允许...

    jxl读写excel数据,输出图片

    在Java编程环境中,JXL库是一个非常流行的工具,用于读取和写入Microsoft Excel文件。JXL库提供了方便的API,使得开发者可以轻松地处理Excel数据,包括读取单元格内容、修改工作表、添加公式,以及本文重点讨论的...

    POI和JXL读取EXCEL数据的工具类(POI支持2007)

    本文将详细讲解如何使用这两个工具类来读取Excel数据,以及它们的特点和适用场景。 首先,让我们关注一下Apache POI。Apache POI是一个开源项目,它提供了对Microsoft Office格式文件的全面支持,包括Excel(.xlsx...

    java利用jxl生成excel文件

    Java使用JXL库生成Excel文件是一项常见的任务,特别是在数据处理、报表生成或导出时。JXL是一个开源的Java库,允许我们读取、写入和修改Excel文件。以下将详细讲解如何使用JXL库来生成Excel文件。 首先,我们需要在...

    jxl导入导出excel

    在Java编程环境中,JXL库是一个非常流行的工具,用于读取和写入Excel文件。它提供了简单易用的API,使得开发者能够方便地处理Excel数据,而无需依赖Microsoft Office套件。本文将深入探讨如何使用JXL进行Excel的导入...

    Java对Excel数据导入导出工具类(含Exel单元格样式设置)

    在Java编程领域,处理Excel数据是一项常见的任务,特别是在数据分析、报表生成或数据导入导出时。本资源提供了一个使用Java语言结合jxl库实现的工具类,它简化了Excel文件的读写操作,并且允许对单元格样式进行...

    基于JXL的Excel数据导入工具

    对于复杂的导入需求,如批量导入,我们可以创建一个`ExcelUtil`工具类,封装上述操作,提供便捷的接口供其他模块调用。例如,`importDataFromExcel(String filePath, ImportConfig config)`方法,其中`ImportConfig`...

    jxl 导出 excel

    在Java编程环境中,JXL库是一个非常流行...总之,使用JXL库在Java中导出Excel文件是一项常见的任务,尤其在数据分析和报表生成场景下。通过熟悉JXL的API,你可以轻松地定制化Excel文件的格式和内容,满足各种业务需求。

    jxl对excel添加水印(含有setWaterMarkImage方法).zip

    在Java编程环境中,处理Excel文件是一项常见的任务,特别是在数据导入导出、报表生成等领域。`jxl`库是一个广泛使用的开源库,它允许开发者用Java读取、写入和修改Excel文件。在这个特定的场景中,我们将探讨如何...

    jxl 读取Excel模板并写入数据通用工具类

    本文将详细讨论如何使用JXL库创建一个通用的工具类来读取Excel模板并填充数据。 首先,我们需要了解JXL库的基本用法。JXL库提供了多种API,可以用来操作Excel文件的各个部分,包括工作簿(Workbook)、工作表...

    jxl导出excel.zip

    "jxl导出excel.zip"是一个包含工具类的压缩包,用于帮助开发者便捷地将数据导出为Excel格式,主要利用了JXL库。JXL是Java Excel API的一个简称,它是一个开源的Java库,支持读取、写入以及修改Microsoft Excel文件。...

    JXL导出excel的示例及文档

    通过学习JXL API文档和示例,开发者可以轻松地在Java项目中处理Excel文件,无论是读取数据、分析报表还是生成自定义的Excel文件,JXL都提供了一个强大且易于使用的工具集。对于需要处理Excel的Java开发者来说,熟悉...

Global site tag (gtag.js) - Google Analytics