`
SonofGod
  • 浏览: 20813 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用poi导出Excel通用方法

    博客分类:
  • poi
阅读更多

说明:公共方法中可以在任何场景下进行Excel导出,使用的参数通用使用 List<Bean> 的格式,另外还执行在一个Excel中导出多个sheet (解决大数据导出的问题),需要注意的是如果使用03的方式导出一个sheet 最大只能有65535条记录,不然就会报错,使用07导出不存在这种限制!请根据实际情况进行选择。

 

具体如何调用请看最下面的调用实例。

 

一:公共方法函数

/**

 * 

 * @param <T>

 *            应用泛型,代表任意一个符合javabean风格的类

 */

public class ExportExcelUtil<T>

{

private Logger logger = Logger.getLogger(this.getClass());

 

/**

* excel 03 导出excel调用方法

*/

public void exportExcel(HSSFWorkbook workbook, int sheetNum,

String fileName, String[] headers, Collection<T> dataset,

OutputStream out)

{

 

exportExcel(workbook, sheetNum, fileName, headers, dataset, out,

"yyyy-MM-dd");

}

 

/**

* excel 07 导出excel调用方法

*/

public void exportExcel07(XSSFWorkbook workbook, int sheetNum,

String fileName, String[] headers, Collection<T> dataset,

OutputStream out)

{

 

exportExcel07(workbook, sheetNum, fileName, headers, dataset, out,

"yyyy-MM-dd");

}

 

/**

* @param pattern

*            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"

*/

private void exportExcel07(XSSFWorkbook workbook, int sheetNum, String title,

String[] headers, Collection<T> dataset, OutputStream out,String pattern)

{

try

{

// 生成一个表格

XSSFSheet sheet = workbook.createSheet();

workbook.setSheetName(sheetNum, title);

// 设置表格默认列宽度为15个字节

sheet.setDefaultColumnWidth((short) 25);

// 生成一个样式

XSSFCellStyle style = workbook.createCellStyle();

// 设置这些样式

style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);

style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

style.setBorderBottom(HSSFCellStyle.BORDER_THIN);

style.setBorderLeft(HSSFCellStyle.BORDER_THIN);

style.setBorderRight(HSSFCellStyle.BORDER_THIN);

style.setBorderTop(HSSFCellStyle.BORDER_THIN);

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

// 生成一个字体

XSSFFont font = workbook.createFont();

font.setColor(HSSFColor.VIOLET.index);

font.setFontHeightInPoints((short) 12);

font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

// 把字体应用到当前的样式

style.setFont(font);

 

// 产生表格标题行

XSSFRow row = sheet.createRow(0);

for (short i = 0; i < headers.length; i++)

{

XSSFCell cell = row.createCell(i);

cell.setCellStyle(style);

XSSFRichTextString text = new XSSFRichTextString(headers[i]);

cell.setCellValue(text);

}

 

// 遍历集合数据,产生数据行

Iterator<T> it = dataset.iterator();

int index = 0;

while (it.hasNext())

{

index++;

row = sheet.createRow(index);

T t = (T) it.next();

// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值

Field[] fields = t.getClass().getDeclaredFields();

for (short i = 0; i < fields.length; i++)

{

XSSFCell cell = row.createCell(i);

Field field = fields[i];

String fieldName = field.getName();

String getMethodName = "get"

+ fieldName.substring(0, 1).toUpperCase()

+ fieldName.substring(1);

Class<? extends Object> tCls = t.getClass();

Method getMethod = tCls.getMethod(getMethodName,

new Class[] {});

Object value = getMethod.invoke(t, new Object[] {});

// 判断值的类型后进行强制类型转换

String textValue = null;

if (null == value)

{

textValue = null;

} else

{

if (value instanceof Date)

{

Date date = (Date) value;

SimpleDateFormat sdf = new SimpleDateFormat(pattern);

textValue = sdf.format(date);

} else

{

textValue = value.toString();

}

}

if (textValue != null)

{

cell.setCellValue(textValue);

}

}

}

} catch (IllegalAccessException e)

{

logger.error("导出:" + title + "报表出错!", e);

} catch (InvocationTargetException e)

{

logger.error("导出:" + title + "报表出错!", e);

} catch (SecurityException e)

{

logger.error("导出:" + title + "报表出错!", e);

} catch (NoSuchMethodException e)

{

logger.error("导出:" + title + "报表出错!", e);

}

}

 

/**

* @param pattern

*            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"

*/

@SuppressWarnings("deprecation")

private void exportExcel(HSSFWorkbook workbook, int sheetNum, String title,

String[] headers, Collection<T> dataset, OutputStream out,

String pattern)

{

try

{

// 生成一个表格

HSSFSheet sheet = workbook.createSheet();

workbook.setSheetName(sheetNum, title);

// 设置表格默认列宽度为15个字节

sheet.setDefaultColumnWidth((short) 25);

// 生成一个样式

HSSFCellStyle style = workbook.createCellStyle();

// 设置这些样式

style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);

style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

style.setBorderBottom(HSSFCellStyle.BORDER_THIN);

style.setBorderLeft(HSSFCellStyle.BORDER_THIN);

style.setBorderRight(HSSFCellStyle.BORDER_THIN);

style.setBorderTop(HSSFCellStyle.BORDER_THIN);

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

// 生成一个字体

HSSFFont font = workbook.createFont();

font.setColor(HSSFColor.VIOLET.index);

font.setFontHeightInPoints((short) 12);

font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

// 把字体应用到当前的样式

style.setFont(font);

 

// 产生表格标题行

HSSFRow row = sheet.createRow(0);

for (short i = 0; i < headers.length; i++)

{

HSSFCell cell = row.createCell(i);

cell.setCellStyle(style);

HSSFRichTextString text = new HSSFRichTextString(headers[i]);

cell.setCellValue(text);

}

 

// 遍历集合数据,产生数据行

Iterator<T> it = dataset.iterator();

int index = 0;

while (it.hasNext())

{

index++;

row = sheet.createRow(index);

T t = (T) it.next();

// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值

Field[] fields = t.getClass().getDeclaredFields();

for (short i = 0; i < fields.length; i++)

{

HSSFCell cell = row.createCell(i);

Field field = fields[i];

String fieldName = field.getName();

String getMethodName = "get"

+ fieldName.substring(0, 1).toUpperCase()

+ fieldName.substring(1);

Class<? extends Object> tCls = t.getClass();

Method getMethod = tCls.getMethod(getMethodName,

new Class[] {});

Object value = getMethod.invoke(t, new Object[] {});

// 判断值的类型后进行强制类型转换

String textValue = null;

if (null == value)

{

textValue = null;

} else

{

if (value instanceof Date)

{

Date date = (Date) value;

SimpleDateFormat sdf = new SimpleDateFormat(pattern);

textValue = sdf.format(date);

} else

{

textValue = value.toString();

}

}

if (textValue != null)

{

cell.setCellValue(textValue);

}

}

}

} catch (IllegalAccessException e)

{

logger.error("导出:" + title + "报表出错!", e);

} catch (InvocationTargetException e)

{

logger.error("导出:" + title + "报表出错!", e);

} catch (SecurityException e)

{

logger.error("导出:" + title + "报表出错!", e);

} catch (NoSuchMethodException e)

{

logger.error("导出:" + title + "报表出错!", e);

}

}

}

二:调用函数:

我下面的例子是一个Excel中包含多个sheet(按照统计日期来分割),具体写法需要根据具体的业务。原理是一样的。

 

如:

        String title = "在线明细报表";

        String[] headers = { "NUBE号 ", "统计日期 " };

 

         String fileName = java.net.URLEncoder.encode(title, "utf-8") + "(" + startDay

+ " - " + endDay + ")";

response.reset();

response.setCharacterEncoding("gb2312");

response.setContentType("application/vnd.ms-excel");

response.addHeader("Content-Disposition", "attachment;filename="

+ fileName + ".xls");

// 声明一个工作薄

OutputStream outputStream = response.getOutputStream();

 

HSSFWorkbook workbook = new HSSFWorkbook();

 

ExportExcelUtil<DayInlineDetailBean> exportExcel = new ExportExcelUtil<DayInlineDetailBean>();

int i = 0;

for (Map.Entry<String, List<DayInlineDetailBean>> entry : returnMap

.entrySet())

{

exportExcel.exportExcel(workbook, i, entry.getKey(),

headers, entry.getValue(), outputStream);

i++;

}

 

try

{

workbook.write(outputStream);

outputStream.flush();

outputStream.close();

} catch (Exception e)

{

logger.error("导出:" + title + "报表出错!", e);

}

 

 

2
0
分享到:
评论
4 楼 SonofGod 2014-04-04  
wgy07 写道
excel2003格式最大只能65535行,换成excel2007格式吧,XSSFWorkbook

不是安装的excel版本的问题。是在代码中执行的时候就报错了。
3 楼 SonofGod 2014-04-04  
mfkvfn 写道
你怎么能保证你那headers的顺序和 t.getClass().getDeclaredFields()中field顺序的一致性?你确信结果是
NUBE号     统计日期
NUBE号1    日期1
NUBE号2    日期2



而不会出现
NUBE号     统计日期
日期1      NUBE号1
日期2      NUBE号2

这种情况。

你怎么能保证header的数目跟field的数目是一样的。如果一个多一个少呢?



这个需要我们自己约定:
String[] headers = { "NUBE号 ", "统计日期 " };
必须和传人参数的bean里的属性顺序一致。 意思就是说bean里面的属性是按照什么顺序写的这个headers 里面就按照bean相对应写。
2 楼 mfkvfn 2014-04-02  
你怎么能保证你那headers的顺序和 t.getClass().getDeclaredFields()中field顺序的一致性?你确信结果是
NUBE号     统计日期
NUBE号1    日期1
NUBE号2    日期2



而不会出现
NUBE号     统计日期
日期1      NUBE号1
日期2      NUBE号2

这种情况。

你怎么能保证header的数目跟field的数目是一样的。如果一个多一个少呢?
1 楼 wgy07 2014-04-02  
excel2003格式最大只能65535行,换成excel2007格式吧,XSSFWorkbook

相关推荐

    java使用POI导出 Excel工具类

    java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。

    poi导出excel通用类

    标题“poi导出excel通用类”指的是使用Apache POI库创建一个可以用于导出Excel文件的Java类。Apache POI是开源项目,提供了一组API,使得开发者可以在Java应用程序中读写Microsoft Office格式的文件,包括Excel。在...

    poi导出excel参考方法

    在上面的代码中,我们可以看到使用POI导出Excel文档的方法。首先,我们需要创建一个Workbook对象,然后使用Workbook对象创建一个Sheet对象。接着,我们可以使用Sheet对象将数据写入Excel文档中。最后,我们可以使用...

    poi导出根据模板导出excel和简单列表导出excel源码

    在本案例中,我们关注的是如何使用 Apache POI 库来导出 Excel 文件,特别是根据模板导出和简单列表导出。下面将详细介绍这个过程。 1. **Apache POI 概述** Apache POI 提供了 Java API 来读写 Microsoft Office ...

    poi方式导出excel需要的3个jar包

    以下是一个简单的使用Apache POI导出Excel的工作流程示例: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java....

    Java poi 导出Excel

    通用类的Java导出Excel方法,导出内容是使用json传递,字段描述使用ArrayList数组传递,

    SpringBoot整合POI导出通用Excel的方法示例

    SpringBoot 整合 POI 导出通用 Excel 的方法示例 本文主要介绍了 SpringBoot 整合 POI 导出通用 Excel 的方法示例,该方法可以帮助开发者快速实现 Excel 的导出功能。该示例代码详细地介绍了 SpringBoot 整合 POI ...

    poi导入导出Excel通用工具类 兼容xls,xlsx

    总结,"poi导入导出Excel通用工具类 兼容xls,xlsx"这个工具实现了利用Apache POI库处理Excel文件的功能,涵盖了从旧版的.xls到新版的.xlsx格式,提供了方便的导入和导出接口,使得在Java开发中处理Excel数据变得...

    POI导出Excel表格通用工具类

    利用POI实现Java导出Excel表格,为了实现以后通用,做成了一个利用Java的反射机制做成的万金油式工具类,只需要给工具类传入固定的几个参数(映射字段的map集合,数据集合,实体类的Claas等),就可以实现导出Excel,该...

    SpringBoot整合poi实现Excel文件的导入和导出.pdf

    同样,导出Excel功能可以通过创建一个新的工作簿,填充数据,然后设置样式和写入输出流来实现。以下是一个简单的导出示例: ```java @GetMapping("exportList") public void exportList(HttpServletResponse ...

    poi的控制,poi导出excel详细介绍,有代码

    ### POI 控制 Excel 导出详解 #### 一、引言 Apache POI 是一个用于读写 Microsoft Office 格式文件(如 .xls、.xlsx、.doc、.ppt 等)的 Java API。其中,HSSF 和 XSSF 分别对应处理 .xls 和 .xlsx 文件。本篇...

    Java使用POI实现Excel报表的导入和导出

    ExportExcel类为导出Excel报表通用类。 1.将源代码导入eclipse中 2.部署项目,启动tomcat服务器 3.web页面具体路径:http://localhost:80/poi 4.点击Read excel 2003 or 2007,可以读取2003或2007版Excel 5.点击...

    通用excel导入/导出 (poi)

    在导出Excel时,你需要创建一个工作簿(Workbook)对象,然后添加工作表(Sheet),并在工作表中创建行(Row)和单元格(Cell)。数据可以从数据库、集合或其他数据源填充到这些单元格中。以下是一个简单的例子: `...

    poi导入导出Excel源码

    标题“poi导入导出Excel源码”和描述涉及到的核心知识点是利用Apache POI进行Excel文件的导入与导出操作。 首先,让我们详细了解Apache POI库。Apache POI是Apache软件基金会的一个开源项目,其主要目标是创建Java ...

    Java POI 生成Excel时显示货币格式

    本文将深入探讨如何使用Java POI生成带有货币格式的Excel文件,这在财务报告和其他需要精确货币显示的应用场景中尤为关键。 ### 一、Java POI简介 Java POI是一个开源的API,用于读写Microsoft Office格式的文件,...

    POI导出EXCEL经典实现

    在这个"POI 导出 EXCEL 经典实现"的话题中,我们将探讨如何使用 Apache POI 来创建一个简单的 Excel 文件导出功能。 首先,你需要从 Apache POI 的官方网站(http://poi.apache.org/)下载对应的 JAR 包。在示例中...

    poi导出cvs文件

    标题中的“poi导出csv文件”指的是使用Apache POI库来生成CSV(逗号分隔值)文件。Apache POI是Java中一个流行的库,它主要用于处理Microsoft Office格式的文件,如Excel。在这个场景中,我们将探讨如何使用POI来...

    Java Struts2+poi插件 实现导出Excel

    这个项目"Java Struts2+poi插件 实现导出Excel"就是结合这两个工具,为用户提供一个功能,能够将数据导出到Excel格式的文件中。 首先,让我们详细了解一下Struts2。Struts2的核心是Action,它负责接收请求、处理...

    poi导出excel并下载工具类(含有demo)

    标题 "poi导出excel并下载工具类(含有demo)" 提供了我们即将讨论的核心内容:使用Apache POI库来创建Excel文件,并提供一个下载功能。Apache POI是Java领域中广泛使用的库,用于处理Microsoft Office格式的文件,...

    Java poi 实现excel导入导出

    **导出Excel数据:** 1. **创建Workbook对象**:使用`WorkbookFactory.create()`或`new XSSFWorkbook()`(对于.xlsx)创建一个新的Excel文件。 2. **添加Sheet对象**:调用Workbook的`createSheet()`方法创建新的...

Global site tag (gtag.js) - Google Analytics