Excel通用类工具(二)
前言
上一篇中写到了用反射来处理类中的不用的属性,但是Excel的列名还得手动输入,这样还是比较麻烦的,今天这篇就利用自定义注解来解决手动传入列名的问题;其实很简单的,只需要在上一篇的基础上加一个类就可以了;
本篇所涉及的项目是在上一篇 Excel通用类工具(一) 的项目代码上进行的二次添加;
正文
- 新添加一个类
新添加一个注解类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,该属性的值就是列名;
- 改造实体类 pojoA 和 pojoB ,这一只改造一个类:
pojoA
public class PojoA {
@ExcelName(name = "名称")
private String name;
@ExcelName(name = "数量")
private int num;
@ExcelName(name = "价格")
private double price;
//省略set/get
}
只需要在每个属性上添加上边的注解就可以了;
- 对核心代码进行改造
改造的代码不多,主要是将类中属性上的注解的值读取出来,放入列名中:
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;
}
}
较上一篇笔记来说,主要添加的就是第三部的那一部分代码,而原来那部分就是注释了的那一部分,可以看一下有什么区别;还有就是最后添加了第五步的那一部分代码,需要提醒的是这部分代码需要在数据填充完了之后再调用;
- 测试类
测试还是用上一篇的测试类,这里就不贴出来了;
总结
这篇笔记主要是在上一篇的基础上添加了自定义注解,对注解的了解也进一步加深,但还是有许多的不足之处;
Excel通用类工具(二)的更多相关文章
- Excel通用类工具(一)
前言 最近项目中遇到要将MySQL数据库中的某些数据导出为Excel格式保存,在以前也写过这样的功能,这次就准备用以前的代码,但是看了一下,这次却不一样,因为在以前用到的都是导出一种或几种数据,种类不 ...
- MVC NPOI Linq导出Excel通用类
之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- 转:TestLink1.9.3测试用例:Excel转换XML工具<二>实现代码
TestLink1.9.3测试用例:Excel转换XML工具<二>实现代码 http://blog.csdn.net/candle806/article/details/7490599 以 ...
- C#:导入Excel通用类(CSV格式)
一.引用插件LumenWorks.Framework.IO.dll(CsvReader) 插件下载地址:https://pan.baidu.com/s/1c3kTKli 提取密码 dz7j 二.定义 ...
- C#:导入Excel通用类(Xls格式)
PS:在CSV格式和XLSX格式中有写到通用调用的接口和引用的插件,所以在这个xls格式里面并没有那么详细,只是配上xls通用类. 一.引用插件NPOI.dll.NPOI.OOXML.dll.NPOI ...
- C#:导入Excel通用类(Xlsx格式)
一.引用插件EPPlus.dll 插件下载地址:https://pan.baidu.com/s/1jEl7iu1H_C7-j9Wq37xIRQ 提取密码:pdy6 二.定义通用类XlsxExce ...
- poi导出excel通用类
一.关键的通用类public class PoiExportUtils { private static HSSFWorkbook workBook; public PoiExportUtils ...
- NPOI MVC 模型导出Excel通用类
通用类: public enum DataTypeEnum { Int = , Float = , Double = , String = , DateTime = , Date = } public ...
随机推荐
- docker发布netcore网站-零散记录
安装docker 安装Linux,使用云服务器或者虚拟机 参考:http://www.cnblogs.com/wangjieguang/p/hyper-v-ubuntu.html 系统更新 sudo ...
- 在linux系统上文件传输的小技巧
各位做运维的小伙伴,你是不是常常在为文件传到linux服务器上感到头疼呢,我们知道常用的文件传输工具有好多,比如xftp,winscp等,但是有没有比这更简单的呢?当然是有的呢,下面给大家介绍下: y ...
- 机器学习入门10 - 正则化:简单性(Regularization for Simplicity)
原文链接:https://developers.google.com/machine-learning/crash-course/regularization-for-simplicity 正则化指的 ...
- 排除Transformation Errors
当运行session时,会产生大量的Transformation Errors,这些Error会导致性能变慢 1 Transformation Errors导致性能降低的原因 当有大量记录有Trans ...
- ModelState 错误信息输出
在MVC的项目中,我们通常情况下,为了方便(偷懒),会直接使用 !ModelState.IsValid 来判断实体的验证是否正确,但是这样对于用户的体验是不好的,当填写的内容比较多的时候,用户需要自己 ...
- [原创]K8uac bypassUAC(Win7/Wi8/Win10) 过46款杀软影响所有Windows版本
[原创]K8uac bypassUAC(Win7/Wi8/Win10) 过46款杀软影响所有Windows版本 工具: k8uac编译: VC++ 作者:K8哥哥发布: 2018/11/25 1:30 ...
- 【jQuery】(3)---Jquery操作Dom
1 内部插入节点 <body> <ul id="city"> <li id="bj" name=&qu ...
- 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装OpenCV(离线方式和在线方式)(图文详解)
不多说,直接上干货! 说明: Anaconda2-5.0.0-Windows-x86_64.exe安装下来,默认的Python2.7 Anaconda3-4.2.0-Windows-x86_64.ex ...
- Eclipse报错:!!MESSAGE Job found still running.......
!ENTRY org.eclipse.core.jobs 2 2 2014-01-08 09:28:06.387 !MESSAGE Job found still running after plat ...
- 【Apache Kafka】Kafka学习笔记
0x00 基本信息 1.Kafka架构图 2.环境信息 服务器IP:xx.xx.xx.xx 操作系统:CentOS7.2_x64 Kafka版本:kafka_2.12-1.1.0 Zookeeper版 ...