Java Annotation 应用 -- 导出Excel表格

java

相关知识链接:

  Introspector(内省)

  POI

  

1.声明注解

package com.ciic.component.excel;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

/**

*

*/

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

public @interface ExcelAnnotation {

// excel导出时标题显示的名字,如果没有设置Annotation属性,将不会被导出和导入

public String exportName();

}

2.应用注解

package com.ciic.history.entity;

import com.ciic.component.excel.ExcelAnnotation;

import com.ciic.history.common.ExportBase;

//客户一揽子表

public class EsinnerLimeCustomerPreviewIndex extends ExportBase {

@ExcelAnnotation(exportName = "客户名称")

private String imscustomername;

@ExcelAnnotation(exportName = "客户编号")

private String imscustomercode;

@ExcelAnnotation(exportName = "合同方式")

private long imscontracttypea;

@ExcelAnnotation(exportName = "月服务费")

private String serviceimstotalfee;

@ExcelAnnotation(exportName = "雇员人数")

private long employeecount;

@ExcelAnnotation(exportName = "应收金额")

private String imstotalfee;

@ExcelAnnotation(exportName = "实收金额")

private String doneimstotalfee;

@ExcelAnnotation(exportName = "应付金额")

private String imssocialinsurancetfee;

@ExcelAnnotation(exportName = "实付金额")

private String dtlimssocialinsurancetfee;

@ExcelAnnotation(exportName = "最后修改日期")

private String modifieddate;

@ExcelAnnotation(exportName = "客户简称")

private String imscustomershort;

@ExcelAnnotation(exportName = "合作方式")

private long imscontracttypeb;

@ExcelAnnotation(exportName = "客户经理")

private String imscustomerclerk;

@ExcelAnnotation(exportName = "未付款日期")

private String unimspaynoticemonth;

@ExcelAnnotation(exportName = "已交付日期")

private String doneimspaynoticemonth;

getter()

setter()

}

3.解析注解

  3.1 获取数据

public  void exportCustomerPreview(EsinnerLimeCustomerPreviewIndex customerPreview, HttpServletResponse response)throws  Exception{

JsonEntity entity =XAServiceL.customerPreviewSearch(customerPreview,customerPreview.getPage(),customerPreview.getRows());

ExcelExport excelExport= new ExcelExport();

response.reset();

String fileName="";

if(StringUtils.isBlank(customerPreview.getExcelName())){

fileName="客户一揽子表/第"+customerPreview.getPage()+"页.xls";

}else{

fileName=customerPreview.getExcelName()+"/第"+customerPreview.getPage()+"页.xls";

}

response.setContentType("application/form-data;charset=UTF-8");

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

+ new String(fileName.getBytes("UTF-8"),

"UTF-8") + "\"");

System.out.println(Arrays.toString(entity.getRows().toArray()));

List<EsinnerLimeCustomerPreviewIndex> outExcel=new ArrayList<EsinnerLimeCustomerPreviewIndex>();

for(int i=0;i<entity.getRows().size();i++){

outExcel.add(MapBeanConvert.toBean(EsinnerLimeCustomerPreviewIndex.class,(Map) entity.getRows().get(i)));

}

excelExport.exportExcel(customerPreview.getExcelName(),outExcel,response.getOutputStream());

}

  3.2 解析注解

/**

* 将一个 Map 对象转化为一个 JavaBean

*

* @param clazz 要转化的类型

* @param map 包含属性值的 map

* @return 转化出来的 JavaBean 对象

* @throws IntrospectionException 如果分析类属性失败

* @throws IllegalAccessException 如果实例化 JavaBean 失败

* @throws InstantiationException 如果实例化 JavaBean 失败

* @throws InvocationTargetException 如果调用属性的 setter 方法失败

*/

@SuppressWarnings("rawtypes")

public static <T> T toBean(Class<T> clazz, Map map) {

T obj = null;

String name = "";

try {

BeanInfo beanInfo = Introspector.getBeanInfo(clazz);

obj = clazz.newInstance(); // 创建 JavaBean 对象

// 给 JavaBean 对象的属性赋值

PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

for (int i = 0; i < propertyDescriptors.length; i++) {

PropertyDescriptor descriptor = propertyDescriptors[i];

String propertyName = descriptor.getName();

name = propertyName;

if (map.containsKey(propertyName)) {

// 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。

Object value = map.get(propertyName);

if ("".equals(value)) {

value = null;

}

Object[] args = new Object[1];

args[0] = value;

try {

descriptor.getWriteMethod().invoke(obj, args);

} catch (InvocationTargetException e) {

System.out.println("字段映射失败");

}

}

}

} catch (IllegalAccessException e) {

System.out.println("实例化 JavaBean 失败");

} catch (IntrospectionException e) {

System.out.println("分析类属性失败");

} catch (IllegalArgumentException e) {

// e.printStackTrace();

System.err.println(name);

System.out.println("映射错误");

} catch (InstantiationException e) {

System.out.println("实例化 JavaBean 失败");

}

return (T) obj;

}

  3.3 导出Excel

package com.ciic.component.excel;

import org.apache.poi.hssf.usermodel.*;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.text.SimpleDateFormat;

import java.util.*;

/**

*

*/

public class ExcelExport<T> {

/**

* @param title 标题

* @param dataset 集合

* @param out 输出流

*/

public void exportExcel(String title, Collection<T> dataset,

OutputStream out) {

// 声明一个工作薄

try {

//首先检查数据看是否是正确的

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

if (dataset == null || !its.hasNext() || title == null || out == null) {

throw new Exception("传入的数据不对!");

}

T ts = (T) its.next();

HSSFWorkbook workbook = new HSSFWorkbook();

// 生成一个表格

HSSFSheet sheet = workbook.createSheet(title);

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

sheet.setDefaultColumnWidth(15);

// 生成一个样式

HSSFCellStyle style = workbook.createCellStyle();

// 设置标题样式

// style = ExcelStyle.setHeadStyle(workbook, style);

// // 生成并设置主体样式

// HSSFCellStyle style2 = workbook.createCellStyle();

// style2 = ExcelStyle.setbodyStyle(workbook, style2);

// 得到所有字段

Field filed[] = ts.getClass().getDeclaredFields();

// 标题

List<String> exportfieldtile = new ArrayList<String>();

// 导出的字段

List<String> fiedName = new ArrayList<String>();

// 遍历整个filed

for (int i = 0; i < filed.length; i++) {

Field f = filed[i];

ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);

// 如果设置了annottion

if (exa != null) {

String exprot = exa.exportName();

// 添加到标题

exportfieldtile.add(exprot);

// 添加到需要导出的字段

fiedName.add(f.getName());

}

}

// 产生表格标题行

HSSFRow row = sheet.createRow(0);

for (int i = 0; i < exportfieldtile.size(); i++) {

HSSFCell cell = row.createCell(i);

cell.setCellStyle(style);

HSSFRichTextString text = new HSSFRichTextString(

exportfieldtile.get(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();

for (int k = 0; k < fiedName.size(); k++) {

HSSFCell cell = row.createCell(k);

String fieldname = fiedName.get(k);

String getMethodName = "get"

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

+ fieldname.substring(1);

Class tCls = t.getClass();

Method getMethod = tCls.getMethod(getMethodName,

new Class[]{});

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

String textValue = getValue(value);

HSSFRichTextString richString = new HSSFRichTextString(

textValue);

cell.setCellValue(richString);

}

}

workbook.write(out);

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* @param title 标题

* @param dataset 集合

*/

public File exportExcel(String title, Collection<T> dataset) {

OutputStream out = null;

File file = null;

// 声明一个工作薄

try {

//首先检查数据看是否是正确的

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

if (dataset == null || !its.hasNext() || title == null) {

throw new Exception("传入的数据不对!");

}

T ts = (T) its.next();

HSSFWorkbook workbook = new HSSFWorkbook();

// 生成一个表格

HSSFSheet sheet = workbook.createSheet(title);

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

sheet.setDefaultColumnWidth(15);

// 生成一个样式

HSSFCellStyle style = workbook.createCellStyle();

// 设置标题样式

// style = ExcelStyle.setHeadStyle(workbook, style);

// // 生成并设置主体样式

// HSSFCellStyle style2 = workbook.createCellStyle();

// style2 = ExcelStyle.setbodyStyle(workbook, style2);

// 得到所有字段

Field filed[] = ts.getClass().getDeclaredFields();

// 标题

List<String> exportfieldtile = new ArrayList<String>();

// 导出的字段

List<String> fiedName = new ArrayList<String>();

// 遍历整个filed

for (int i = 0; i < filed.length; i++) {

Field f = filed[i];

ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);

// 如果设置了annottion

if (exa != null) {

String exprot = exa.exportName();

// 添加到标题

exportfieldtile.add(exprot);

// 添加到需要导出的字段

fiedName.add(f.getName());

}

}

// 产生表格标题行

HSSFRow row = sheet.createRow(0);

for (int i = 0; i < exportfieldtile.size(); i++) {

HSSFCell cell = row.createCell(i);

cell.setCellStyle(style);

HSSFRichTextString text = new HSSFRichTextString(

exportfieldtile.get(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();

for (int k = 0; k < fiedName.size(); k++) {

HSSFCell cell = row.createCell(k);

String fieldname = fiedName.get(k);

String getMethodName = "get"

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

+ fieldname.substring(1);

Class tCls = t.getClass();

Method getMethod = tCls.getMethod(getMethodName,

new Class[]{});

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

String textValue = getValue(value);

HSSFRichTextString richString = new HSSFRichTextString(

textValue);

cell.setCellValue(richString);

}

}

file = new File("/tmp/testOne.xls");

out = new FileOutputStream(file);

workbook.write(out);

} catch (Exception e) {

e.printStackTrace();

} finally {

try {

if (out != null) {

out.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

return file;

}

private String getValue(Object value) {

String textValue = "";

if (value == null)

return textValue;

if (value instanceof Boolean) {

boolean bValue = (Boolean) value;

textValue = "是";

if (!bValue) {

textValue = "否";

}

} else if (value instanceof Date) {

Date date = (Date) value;

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

textValue = sdf.format(date);

} else

textValue = value.toString();

return textValue;

}

}

啦啦啦

啦啦啦

以上是 Java Annotation 应用 -- 导出Excel表格 的全部内容, 来源链接: utcz.com/z/391411.html

回到顶部