前言

上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题;其实很简单的,只需要在上一篇的基础上加一个类就可以了;

本篇所涉及的项目是在上一篇 Excel通用类工具(一) 的项目代码上进行的二次添加;

正文

  1. 新添加一个类

    新添加一个注解类 ExcelName ,完整代码如下:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelName {
String name() default "";
}

这个类主要就是一个注解,对java的注解还不了解的可以点击这里 传送门,因为只需要知道每个属性得列名,所以只定义了一个属性name,该属性的值就是列名;

  1. 改造实体类 pojoA 和 pojoB ,这一只改造一个类:

    pojoA

public class PojoA {
@ExcelName(name = "名称")
private String name;
@ExcelName(name = "数量")
private int num;
@ExcelName(name = "价格")
private double price;
//省略set/get
}

只需要在每个属性上添加上边的注解就可以了;

  1. 对核心代码进行改造

    改造的代码不多,主要是将类中属性上的注解的值读取出来,放入列名中:

public class ExcelUtil<T> {
public HSSFWorkbook setExcel(String title, List<T> tList) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, IOException {
Field[] declaredFields = tList.get(0).getClass().getDeclaredFields();
// 1.创建Excel工作薄对象
HSSFWorkbook workbook=new HSSFWorkbook();
// 2.创建Excel工作表对象
HSSFSheet sheet=workbook.createSheet(title);
HSSFRow row=null;
// 3.创建Excel工作表的第一行,并填充列名
row=sheet.createRow(0);
for (int i=0;i<declaredFields.length;i++){
ExcelName excelName = declaredFields[i].getAnnotation(ExcelName.class);
if(excelName!=null){
if(excelName.name()!=null){
row.createCell(i).setCellValue(excelName.name());
}
}else {
row.createCell(i).setCellValue("");
}
}
/* for(int i=0;i<columnNames.length;i++){
row.createCell(i).setCellValue(columnNames[i]);
}*/
// 4.将数据填充至表格中
for(int j=1;j<=tList.size();j++){
T t= tList.get(j-1);
row=sheet.createRow(j);
for(int i=0;i<declaredFields.length;i++){
// 通过反射获取属性值
String fieldName = declaredFields[i].getName();
String getMethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
Method declaredMethod = t.getClass().getDeclaredMethod(getMethodName);
//执行方法
Object fieldValue = declaredMethod.invoke(t);
//判断是否为空
if(fieldValue!=null && !"".equals(fieldValue)){
//判断属性值类型
if(fieldValue instanceof Integer){
row.createCell(i).setCellValue(Integer.valueOf(fieldValue.toString()));
}else if(fieldValue instanceof Double){
row.createCell(i).setCellValue(Double.valueOf(fieldValue.toString()));
}else if(fieldValue instanceof Date){
row.createCell(i).setCellValue(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(fieldValue));
}else {
row.createCell(i).setCellValue(fieldValue.toString());
}
}else {
row.createCell(i).setCellValue("");
}
}
}
// 5 .自动设置列宽
for (int i = 0; i < declaredFields.length; i++) {
sheet.autoSizeColumn(i);
sheet.setColumnWidth(i,sheet.getColumnWidth(i)*17/10);
}
return workbook;
}
}

较上一篇笔记来说,主要添加的就是第三部的那一部分代码,而原来那部分就是注释了的那一部分,可以看一下有什么区别;还有就是最后添加了第五步的那一部分代码,需要提醒的是这部分代码需要在数据填充完了之后再调用;

  1. 测试类

    测试还是用上一篇的测试类,这里就不贴出来了;

总结

这篇笔记主要是在上一篇的基础上添加了自定义注解,对注解的了解也进一步加深,但还是有许多的不足之处;

Excel通用类工具(二)的更多相关文章

  1. Excel通用类工具(一)

    前言 最近项目中遇到要将MySQL数据库中的某些数据导出为Excel格式保存,在以前也写过这样的功能,这次就准备用以前的代码,但是看了一下,这次却不一样,因为在以前用到的都是导出一种或几种数据,种类不 ...

  2. MVC NPOI Linq导出Excel通用类

    之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...

  3. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  4. 转:TestLink1.9.3测试用例:Excel转换XML工具<二>实现代码

    TestLink1.9.3测试用例:Excel转换XML工具<二>实现代码 http://blog.csdn.net/candle806/article/details/7490599 以 ...

  5. C#:导入Excel通用类(CSV格式)

    一.引用插件LumenWorks.Framework.IO.dll(CsvReader) 插件下载地址:https://pan.baidu.com/s/1c3kTKli  提取密码 dz7j 二.定义 ...

  6. C#:导入Excel通用类(Xls格式)

    PS:在CSV格式和XLSX格式中有写到通用调用的接口和引用的插件,所以在这个xls格式里面并没有那么详细,只是配上xls通用类. 一.引用插件NPOI.dll.NPOI.OOXML.dll.NPOI ...

  7. C#:导入Excel通用类(Xlsx格式)

    一.引用插件EPPlus.dll   插件下载地址:https://pan.baidu.com/s/1jEl7iu1H_C7-j9Wq37xIRQ  提取密码:pdy6 二.定义通用类XlsxExce ...

  8. poi导出excel通用类

    一.关键的通用类public class PoiExportUtils {    private static HSSFWorkbook workBook; public PoiExportUtils ...

  9. NPOI MVC 模型导出Excel通用类

    通用类: public enum DataTypeEnum { Int = , Float = , Double = , String = , DateTime = , Date = } public ...

随机推荐

  1. Web browse的发展演变

    Web browse 译为中文是网络浏览器或网页浏览器. Web浏览器如今可谓遍地开花,无论你最终选择了什么浏览器,你可能都会举得他们的功能性想当然的,但是你们可能不知道这些Web浏览器是20年发展的 ...

  2. 一把梭系列 之 颜值不够VsCode来凑

    如果您的孩子不适应编译型语言怎么办? 如果您的孩子贪玩不想花多时间在编程上怎么办? 如果您还没有孩子怎么办? 如果您夜晚兼职觉不够睡又怎么办? 不妨试试 “ 拍 簧 片 ”. 妈了巴子的有点麻烦,但别 ...

  3. 自学自用 = 网易云课堂(细说Linux-从入门到精通视频教程)

    视频地址 https://study.163.com/course/courseMain.htm?courseId=983014 介绍 本篇博客,旨在记录视频学习的要点,所以格式随意,且没有文字描述, ...

  4. 应用篇 = Docker下的Redis

    一.工具介绍 1.1 什么是Docker? Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目.使用 Google 公司推出的 Go 语言 ...

  5. Java学习图

  6. Centos 基本命令不能用恢复方法

    遇到命令都不能用,直接执行下面的语句就可以: export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/roo ...

  7. 【jdbc】连接数据库从浅入深

    一.回想 还记得以前自学的时候,刚接触到数据库,讲解的连接数据库的最基本的理论知识和方法,现在温习一下基础知识并总结如下! 1.JDBC连接数据库的基本流程 加载JDBC驱动程序 —> 提供JD ...

  8. 在Mac上安装MongoDB,配置全局路径

    1.访问MongoDB官方下载地址 http://www.mongodb.org/downloads 2.点击“DOWNLOAD(tgz)”按钮: 3.将下载的文件压缩包解压后剪切到你的Mac中某个位 ...

  9. 利用vi编辑器创建和编辑正文文件(二)

    末行模式下的命令 1.       w:写文件,将编辑的内容保存到文件系统. 2.       w!:如果只读文件,强制写入系统. 3.       q!:退出vi,但文件内容修改的话,系统要提示是否 ...

  10. 如何走上更高平台分享传递干货知识:(开通个人Github面向开源及私有软件项目的托管平台:https://github.com/zlslch/)(图文详解)(博主推荐)

    不多说,直接上干货! https://github.com/ 欢迎大家,加入我的微信公众号:大数据躺过的坑        人工智能躺过的坑       同时,大家可以关注我的个人博客:    http ...