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工具类`是一个强大的工具,它能够帮助开发者快速实现数据到Excel的导出功能,减少重复代码,提高开发效率。通过合理的封装和设计,可以使得这类工具类在不同的项目中重用,降低维护成本。...
导出时,从数据库获取数据,生成Excel文件。 为了更好地理解这两个库的用法,你可以查看提供的"Excel导入导出(jxl及Poi)工具类"压缩包中的示例代码。通过阅读和运行这些代码,你可以更深入地了解如何在实际项目中...
总的来说,jxl.jar是Java开发环境下处理Excel数据的得力工具,无论是在数据分析、报表生成还是数据导入导出场景下,都能发挥重要作用。通过熟练掌握jxl.jar的使用,开发者可以大大提高工作效率,减少手动操作的繁琐...
首先,JXL 提供了一个抽象类 Workbook,该类相当于是一个工具类,用于生成 Excel 文件。Workbook 类提供了多种方法来生成 Excel 文件,例如 createWorkbook(File file)、createWorkbook(File file, Workbook in)、...
在实际应用中,通常会将上述代码封装成一个服务或工具类,以便在需要导出Excel时调用。这样不仅可以复用代码,还能提高开发效率。 总结来说,`jxl`库为Java开发者提供了一个强大而灵活的工具,用于生成和处理Excel...
在IT行业中,处理Excel数据是常见的任务,尤其是在数据分析、报表生成和数据导入导出等场景。本主题将详细讲解如何使用Apache POI和JExcelApi(JXL)这两个Java库来读取Excel文件,以及提供的工具类`PoiUtil.java`和...
这个工具类在处理大量数据时特别有用,比如从数据库中提取数据并以易于阅读的Excel表格形式提供给用户。 描述中提到的“导出详细说明,及相关代码和jar”,意味着我们将在接下来的内容中探讨如何使用jxl进行Excel...
《jxl导出Excel的深度解析与应用》 在信息化高度发展的今天,Excel作为数据处理和分析的重要工具,被广泛应用于各个领域。Java作为一种强大的编程语言,如何与Excel进行交互,成为了许多开发者关注的焦点。jxl库...
在IT行业中,生成Excel表格是常见的数据处理任务,特别是在数据导入导出、报表生成和数据分析等领域。本资源提供了一个利用jxl库实现Java程序中生成Excel表格的解决方案。jxl是一个广泛使用的开源Java库,它允许...
在Java编程环境中,JXL库是一个非常流行的工具,用于读取和写入Microsoft Excel文件。JXL库提供了方便的API,使得开发者可以轻松地处理Excel数据,包括读取单元格内容、修改工作表、添加公式,以及本文重点讨论的...
本文将详细讲解如何使用这两个工具类来读取Excel数据,以及它们的特点和适用场景。 首先,让我们关注一下Apache POI。Apache POI是一个开源项目,它提供了对Microsoft Office格式文件的全面支持,包括Excel(.xlsx...
Java使用JXL库生成Excel文件是一项常见的任务,特别是在数据处理、报表生成或导出时。JXL是一个开源的Java库,允许我们读取、写入和修改Excel文件。以下将详细讲解如何使用JXL库来生成Excel文件。 首先,我们需要在...
在Java编程环境中,JXL库是一个非常流行的工具,用于读取和写入Excel文件。它提供了简单易用的API,使得开发者能够方便地处理Excel数据,而无需依赖Microsoft Office套件。本文将深入探讨如何使用JXL进行Excel的导入...
在Java编程领域,处理Excel数据是一项常见的任务,特别是在数据分析、报表生成或数据导入导出时。本资源提供了一个使用Java语言结合jxl库实现的工具类,它简化了Excel文件的读写操作,并且允许对单元格样式进行...
对于复杂的导入需求,如批量导入,我们可以创建一个`ExcelUtil`工具类,封装上述操作,提供便捷的接口供其他模块调用。例如,`importDataFromExcel(String filePath, ImportConfig config)`方法,其中`ImportConfig`...
在Java编程环境中,JXL库是一个非常流行...总之,使用JXL库在Java中导出Excel文件是一项常见的任务,尤其在数据分析和报表生成场景下。通过熟悉JXL的API,你可以轻松地定制化Excel文件的格式和内容,满足各种业务需求。
在Java编程环境中,处理Excel文件是一项常见的任务,特别是在数据导入导出、报表生成等领域。`jxl`库是一个广泛使用的开源库,它允许开发者用Java读取、写入和修改Excel文件。在这个特定的场景中,我们将探讨如何...
本文将详细讨论如何使用JXL库创建一个通用的工具类来读取Excel模板并填充数据。 首先,我们需要了解JXL库的基本用法。JXL库提供了多种API,可以用来操作Excel文件的各个部分,包括工作簿(Workbook)、工作表...
"jxl导出excel.zip"是一个包含工具类的压缩包,用于帮助开发者便捷地将数据导出为Excel格式,主要利用了JXL库。JXL是Java Excel API的一个简称,它是一个开源的Java库,支持读取、写入以及修改Microsoft Excel文件。...
通过学习JXL API文档和示例,开发者可以轻松地在Java项目中处理Excel文件,无论是读取数据、分析报表还是生成自定义的Excel文件,JXL都提供了一个强大且易于使用的工具集。对于需要处理Excel的Java开发者来说,熟悉...