标签:
一、关键的通用类
public class PoiExportUtils {
private static HSSFWorkbook workBook;
public PoiExportUtils(){
workBook = new HSSFWorkbook();
}
/**
* 创建sheet
* @param sheetName
* @param workBook
* @return
*/
public static HSSFSheet createHSSFSheet(String sheetName,HSSFWorkbook workBook){
// 生成一个表格
HSSFSheet sheet = workBook.createSheet(sheetName);
sheet.setDefaultColumnWidth(20);
return sheet;
}
/**
* 根据头部名称产生表格标题行
* @param sheet
* @param headers
* @return
*/
public void createHSSFSheetHeader(HSSFSheet sheet,String[] headers){
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
setHeaderStyle(cell);
}
}
/**
* 根据实体产生表格标题行
* @param sheet
* @param headers
* @return
*/
public <T> void createHSSFSheetHeader(HSSFSheet sheet,Collection<T> dataset,String ... excludes){
Iterator<T> it = dataset.iterator();
if(it.hasNext()){
HSSFRow row = sheet.createRow(0);
Field[] fields = it.next().getClass().getDeclaredFields();
int cellIndex = 0;
A:for(int i=0;i<fields.length;i++) {
String fieldName = fields[i].getName();
if(excludes != null){
for(String exclude : excludes){
if(exclude.equals(fieldName)){
continue A;
}
}
}
if(!fields[i].isAnnotationPresent(PoiCell.class)){
continue;
}
PoiCell poiCell = fields[i].getAnnotation(PoiCell.class);
HSSFCell cell = row.createCell(cellIndex);
HSSFRichTextString text = new HSSFRichTextString(poiCell.headerName());
cell.setCellValue(text);
setHeaderStyle(cell);
cellIndex++;
}
}
}
/**
*
* @param sheetName,工作簿名称
* @param headers,可选,
* 如果有则以这个数组中的字符串为页眉,
* 如果没有则去扫描实体类上的注解@PoiCell,以有注解的属性value为页眉。
* @param dataset,需要导出的数据集合
* @param pattern,如果日期,那么需要设置日期类型格式,
* @param out,导出的流
* @param excludes,排除的列,对应实体类属性名。
*/
public <T> void exportExcel(String sheetName,String[] headers,Collection<T> dataset,String pattern, OutputStream out,String ... excludes) {
try {
HSSFSheet sheet = createHSSFSheet(sheetName, workBook);
if(headers==null){
createHSSFSheetHeader(sheet, dataset, excludes);
}else{
createHSSFSheetHeader(sheet, headers);
}
Iterator<T> it = dataset.iterator();
int index = 1;
while(it.hasNext()){
HSSFRow row = sheet.createRow(index);
T t = it.next();
Field[] fields = t.getClass().getDeclaredFields();
int cellIndex = 0;
A:for(int i=0;i<fields.length;i++){
String fieldName = fields[i].getName();
if(excludes != null){
for(String exclude : excludes){
if(exclude.equals(fieldName)){
continue A;
}
}
}
if(!fields[i].isAnnotationPresent(PoiCell.class)){
continue A;
}
HSSFCell cell = row.createCell(cellIndex);
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
Method getMethod = t.getClass().getMethod(getMethodName);
Object returnValue = getMethod.invoke(t);
String textValue = null;
if(returnValue instanceof Date){
Date date = (Date) returnValue;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
textValue = sdf.format(date);
} else if (returnValue instanceof byte[]) {
// 有图片时,设置行高为60px;
row.setHeightInPoints(60);
// 设置图片所在列宽度为80px,注意这里单位的一个换算
sheet.setColumnWidth(cellIndex, (short) (35.7 * 80));
// sheet.autoSizeColumn(i);
byte[] bsValue = (byte[]) returnValue;
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,
(short) cellIndex, index, (short) cellIndex, index);
anchor.setAnchorType(2);
HSSFPatriarch patri = sheet.createDrawingPatriarch();
patri.createPicture(anchor, workBook.addPicture(
bsValue, HSSFWorkbook.PICTURE_TYPE_PNG));
} else if(returnValue!=null){
// 其它数据类型都当作字符串简单处理
textValue = returnValue.toString();
}
// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (textValue != null) {
Pattern p = Pattern.compile("^//d+(//.//d+)?{1}");
Matcher matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
CellStyle style = workBook.createCellStyle();
style.setWrapText(true);//回绕文本
cell.setCellStyle(style);
cell.setCellValue(textValue);
}
}
cellIndex++;
}
index++;
}
workBook.write(out);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 给页眉添加样式
* @param cell
*/
private void setHeaderStyle(HSSFCell cell){
// 生成一个样式
HSSFCellStyle style = workBook.createCellStyle();
// 设置这些样式
style.setWrapText(true);//回绕文本
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);
cell.setCellStyle(style);
}
/**
* 如果需要导出图片,那么需要在实体类中定义属性byte[] img 来存放图片数据
* 这个方法,从url的路径获取图片字节数组
* @param strUrl
* @return
*/
// private byte[] getImgByURL(String strUrl){
// //"http://172.16.2.49/83/207/200/0db99469-d2b9-4b97-a1c2-497509c3f5f7.png"
// byte[] byteArray = null;
// try {
// URL url = new URL(strUrl);
//
// InputStream input = url.openStream();
//
// ByteArrayOutputStream output = new ByteArrayOutputStream();
// byte[] buffer = new byte[4096];
// int n = 0;
// while (-1 != (n = input.read(buffer))) {
// output.write(buffer, 0, n);
// }
// byteArray = output.toByteArray();
// } catch (MalformedURLException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
// return byteArray;
// }
}
二、自定义注解类
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PoiCell {
public String headerName() default "";
}
三、实体类
public class CarAlarmExportEntity{
@PoiCell(headerName="车牌号")
private String plateNo;
@PoiCell(headerName="接收时间")
private Date alarmTime;// 报警时间
@PoiCell(headerName="海拔")
private Double altitude;// 海拔
private String alarmFromStr;//报警来源
@PoiCell(headerName="图片路径")
private String imgPath;
@PoiCell(headerName="图片")
private byte[] img;
//get,set
}
四、测试
List<CarAlarmExportEntity> list = new ArrayList<CarAlarmExportEntity>();
PoiExportUtils poi = new PoiExportUtils();
// String[] str = {"a","b","c"};自定义页眉
poi.exportExcel("sheet01",null,list, "yyyy-MM-dd HH:mm:ss", new FileOutputStream("f:/poi.xls"), "alarmFromStr");
标签:
原文地址:http://www.cnblogs.com/zhuqh/p/4463997.html