使用poi导出excel总结

news/2024/7/21 6:59:16 标签: excel, poi, java

1.需要导包
2.工具类

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;

public class ExportExcel<T> {
public HSSFWorkbook exportExcel(String title,Collection<T> dataset) {
return exportExcel("orderForm",title, null, dataset, "yyyy-MM-dd HH:mm:ss");
}
public HSSFWorkbook exportExcel(String title,String[] headers, Collection<T> dataset) {
return exportExcel("orderForm",title, headers, dataset, "yyyy-MM-dd HH:mm:ss");
}
public HSSFWorkbook exportExcel(String title,String[] headers, Collection<T> dataset,
String pattern) {
return exportExcel("orderForm",title, headers, dataset, pattern);
}

public HSSFWorkbook exportExcel(String title,String titleStr , String[] headers,
Collection<T> dataset, String pattern) {
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 15);

//标题样式
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中   
HSSFFont font = workbook.createFont();    
font.setFontName("宋体");    
font.setFontHeightInPoints((short) 14);//设置字体大小 
cellStyle.setFont(font);

//设置标题
HSSFRow firstHeaderRow=sheet.createRow(0);// 第一行
sheet.addMergedRegion(new CellRangeAddress(0,0,0,headers.length-1)); 
HSSFCell yearCell=firstHeaderRow.createCell(0);
yearCell.setCellValue(title);
yearCell.setCellStyle(cellStyle);

// 产生表格标题行
HSSFRow row = sheet.createRow(1);
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 = 1;
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);
// cell.setCellStyle(style2);
Field field = fields[i];
String fieldName = field.getName();
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName,
new Class[] {});
Object value = getMethod.invoke(t, new Object[] {});

// 判断值的类型后进行强制类型转换
String textValue = null;

if (value instanceof Date) {
Date date = (Date) value;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
textValue = sdf.format(date);
cell.setCellValue(textValue);
} else {
if (value != null && value != "") {
textValue = value.toString();
cell.setCellValue(textValue);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 清理资源
}
}
}
return workbook;
}
}
3.调用示例
ExportExcel<OrderFormForExcel> ex = new ExportExcel<OrderFormForExcel>();
//标题栏数组
String[] headers = { "编号","订单id", …标题数组… };
HSSFWorkbook wb = ex.exportExcel("标题",headers,listForExcels);
// 文件名
String str = "导出文件标题";
String fileName = str + ".xls";

response.setContentType("application/octet-stream");
// response.setHeader("Content-Type","video/x-msvideo");
response.setHeader("Content-disposition", "attachment;filename="+ fileName);
response.flushBuffer();
// wb:HSSFWorkbook
OutputStream os = response.getOutputStream();
wb.write(os);

4.注意
与PrintWriter同时使用会出问题.
解决办法:
在末尾加上如下代码:
out.clear();
out = pageContext.pushBody();
以上内容整理自网络


http://www.niftyadmin.cn/n/621310.html

相关文章

std中稳定排序算法_JAVA中常见的排序算法有哪些?-冒泡排序

排序相关的的基本概念排序&#xff1a; 将一组杂乱无章的数据按一定的规律顺次排列起来。数据表( data list): 它是待排序数据对象的有限集合。排序码(key):通常数据对象有多个属性域&#xff0c;即多个数据成员组成,其中有一个属性域可用来区分对象,作为排序依据。该域即为排序…

Android图形库Skia(四)-生成PDF

Android图形库Skia(四)&#xff0d;生成PDF本文主要记录使用skia库生成pdf文件的过程&#xff0c;其实skia并不仅仅能在Android系统中使用&#xff0c;在一般的嵌入式Linux系统上也可以使用的。标题就以以前的写法写了。本文基于Android图形库Skia(一)&#xff0d;基本测试生成…

java 泛型 比较_Java比较泛型类型

在Java中,我编写了一个二进制搜索树类,它使用递归添加节点.现在我想使用泛型来概括它,以便我可以更多地了解它们.public class GBinNode {T item;GBinNode left;GBinNode right;public GBinNode(T newItem) {item newItem;left null;right null;}public GBinNode(T it, GBin…

Uart-WiFi模块ESP8266把玩记

Uart-WiFi模块ESP8266把玩记 由于只是一个模块&#xff0c;并不是完整的开发板&#xff0c;所以需要自己连接外围电路。试用的过程中遇到了很多麻烦&#xff0c;这里统统记录。 1.确认硬件版本 由于ESP8266版本一直在更新&#xff0c;所以需要自己确认一下PCB版本。 特征&am…

使用redis缓存数据

1.运行redis 1.1下载成功后将下载文件放到每个目录下&#xff0c;用cmd访问到该目录&#xff0c;运行命令 redis-server.exe如果无误&#xff0c;结果如图一 1.2重新打开一个cmd窗口&#xff0c;运行命令redis-cli.exe -h 127.0.0.1 -p 6379 &#xff08;注&#xff1a;这里运…

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo 我是在Android source tree中编译App遇到的问题&#xff0c;eclipse中没有问题&#xff0c;最后确定是Android.mk的问题。其实从运行mmm命令输出的信息中也可以发现错误的Android.mk和正确的Android…

java分层窗格_java_拆分窗格_JSplitPane_图形界面

* 拆分窗格,JSplitPane,容器类组件* 练习* 金山词霸界面*/package com.test1;//package com.GUI;import java.awt.*;import javax.swing.*;public class Demo8_9 extends JFrame//继承JFrame{JSplitPane jsp;//拆分窗格JList jList;//列表JLabel jl1;//标签public static void …

js解析json数据

1.本文使用jquery实现json数据解析,导入jquery插件 2.js代码如下: function loadInfo() { var url "js/chengyu/chengyucidian.json";//json文件路径$.getJSON(url, function(data) {$("#chengyuForm").html("");//清空info内容$.each(data, …