相关知识链接:

  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表格的更多相关文章

  1. Java代码导入导出 Excel 表格最简单的方法

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStrea ...

  2. Java IO 导入导出Excel表格

    1.将excel导入到内存 1. 调用工作簿Workbook的静态方法getWorkbook(),获得工作簿Workbook对象 InputStream in = new FileInputStrea ...

  3. java基础篇 -- 导出excel表格数据

    本篇文章基于java把数据库中的数据以Excel的方式导出,欢迎各位大神吐槽: 1.基于maven jar包引入如下: <dependency> <groupId>net.so ...

  4. java使用jxls导出Excel

    jxls是基于POI的Excel模板导出导入框架.通过使用类似于jstl的标签,有效较少导出Excel的代码量. 1.pom <!-- https://mvnrepository.com/art ...

  5. java导出excel表格

    java导出excel表格: 1.导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifac ...

  6. java 实现用户自由选择字段实现导出EXCEL表格

    package com.thinkgem.jeesite.common.utils.excel; import java.io.File; import java.io.OutputStream; i ...

  7. java中使用jxl导出Excel表格详细通用步骤

    该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入s ...

  8. Spring Boot 导出Excel表格

    Spring Boot 导出Excel表格 添加支持 <!--添加导入/出表格依赖--> <dependency> <groupId>org.apache.poi& ...

  9. Java之POI导出Excel(一):单sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码  <!-- ...

随机推荐

  1. 增益 Gain 分贝 dB

    https://zh.wikipedia.org/wiki/%E5%88%86%E8%B2%9D 分贝(decibel)是量度两个相同单位之数量比例的单位,主要用于度量声音强度,常用dB表示. “分” ...

  2. Revit API创建房间

    start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] );             ...

  3. Android开发中遇到的问题(四)——Android中WARNING: Application does not specify an API level requirement!的解决方法

    今天在手机上调试运行Andorid项目时,发现Console打印出"WARNING: Application does not specify an API level requiremen ...

  4. iOS:百度长语音识别具体的封装:识别、播放、进度刷新

    一.介绍 以前做过讯飞语音识别,比较简单,识别率很不错,但是它的识别时间是有限制的,最多60秒.可是有的时候我们需要更长的识别时间,例如朗诵古诗等功能.当然讯飞语音也是可以通过曲线救国来实现,就是每达 ...

  5. MDX Step by Step 读书笔记(七) - Performing Aggregation 聚合函数之 Sum, Aggregate, Avg

    开篇介绍 SSAS 分析服务中记录了大量的聚合值,这些聚合值在 Cube 中实际上指的就是度量值.一个给定的度量值可能聚合了来自事实表中上千上万甚至百万条数据,因此在设计阶段我们所能看到的度量实际上就 ...

  6. Linux下在root权限下临时使用其它用户运行命令

    一.简述 当我们在使用Linux时,经常需要在root权限下执行某些命令,或者在/etc/rc.d/rc.local中写一些角本.而如果某些角本必须使用非root用户时,直接su是不行的,比如Elas ...

  7. ROS actionlib学习(一)

    actionlib是ROS中一个很重要的功能包集合,尽管在ROS中已经提供了srevice机制来满足请求—响应式的使用场景,但是假如某个请求执行时间很长,在此期间用户想查看执行的进度或者取消这个请求的 ...

  8. 基于Ubuntu 搭建 VNC 远程桌面服务

    系统要求:Ubuntu 16.04.1 LTS 64 位操作系统 安装.启动 VNC VNC 远程桌面原理 注:本小节内容旨在帮助您更好地了解 Xorg.X11.VNC 等概念和原理,如果你不想了解原 ...

  9. linux/unix命令参考

  10. oracle排序后的第一条记录

    该查寻语句没有经过任何的优化,因为oracle没有SQL的TOP关键字,但是有一个ROWNUM的列,因此,可以通过ROWNUM来进行查询.oracle的关于rownum的参考手册里面提到了    分析 ...