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 ...
随机推荐
- 【CF429E】 Points and Segments(欧拉回路)
传送门 CodeForces 洛谷 Solution 考虑欧拉回路有一个性质. 如果把点抽出来搞成一条直线,路径看成区间覆盖,那么一个点从左往右被覆盖的次数等于从右往左被覆盖的次数. 发现这个性质和本 ...
- KVM虚拟化概述与安装
虚拟化是构建云计算基础架构不可或缺的关键技术之一,云计算的云端系统,其实质上就是一个大型的KVM分布式系统,虚拟化通过在一个物理平台上虚拟出更多的虚拟平台,而其中的每一个虚拟平台则可以作为独立的终端加 ...
- 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结
本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言 MySQL作为开源技术的代表作之一,是 ...
- 1.ActionBar
ActionBar低版本和高版本用法不同 低版本:1. 引用v7-appcompat2. Activity继承ActionBarActivity3. android:theme="@styl ...
- 第三节:带你详解Java的操作符,控制流程以及数组
前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...
- 网管到CEO的10年逆袭之路
把我个人近一年来讲的技术人员如何成长的鸡汤课整理了出来,送给大家<网管到CEO的10年逆袭之路>
- Python - 使用Pylint检查分析代码
1-简介 Home Page : https://www.pylint.org/ 检查语法错误,是否遵守编码风格标准.潜在的问题等: 支持自定义配置:例如显示或隐藏特定的警告,并且可以通过编写插件来添 ...
- 【app】Appium日志文件分析
Appium在和客户端及手机端进行通讯的时候会输出很多日志,可以通过点击主面板的Get Raw Logs得到其原始日志: 现在我们另存到其他路径,并且以notepad工具打开进行查看 Appium日志 ...
- redis安装以及安全配置
redis安装以及安全配置 1. 安装 sudo apt-get install redis-server 使用which查询redis执行体安装路径: which redis-server #/us ...
- 好玩的原生js的简单拖拽
这个拖拽的图片不是唯一的,拿到代码自己添加一张照片就可以啦 <!DOCTYPE html><html> <head> <meta charset=" ...