最近,因为工作上的需要自己封装了poi处理excel接口,根据实体上的注解生成excel文件.
如果觉得写得不错,记得点赞.
本人原创
poi.jar下载地址:http://poi.apache.org/download.html
报表常量类
package com.zcj.poi; public class ConstantsReport { public static final int FORMAT_NO = 0; public static final int FORMAT_CURRENCY = 1; public static final int FORMAT_PERCENT = 2; }
注解类
package com.zcj.poi; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * excel报表注解 * @author MrZhou * */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD,ElementType.METHOD}) public @interface ReportAnnotation { /** * 列名 * @return */ public String name(); /** * 排序 * @return */ public int order() default 0; /** * 格式化 * @return */ public int format() default ConstantsReport.FORMAT_NO; /** * 代理商等级 * @return */ public int agent_level() default ConstantsReport.AGENT_LEVEL_NO; }
工作表参数类
package com.zcj.poi; import java.util.ArrayList; import java.util.List; /** * 工作表 * @author MrZhou * */ public class SheetArgs { /**工作表*/ public String sheet_name; /**标题名*/ public String title_name; /**class类型*/ public Class clazz; /**数据源*/ public List source; /**统计数据*/ public List<String> statistical_datas = new ArrayList<>(); /** * 加入统计数据 * @param statistical_data */ public void addStatistical_data(String statistical_data){ if(statistical_datas==null){ statistical_datas = new ArrayList<>(); } statistical_datas.add(statistical_data); } }
工作簿参数类
package com.zcj.poi; import java.io.File; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; /** * excel参数 * @author MrZhou * */ public class ExcelArgs { /** 工作表 */ public List<SheetArgs> sheets = new ArrayList<>(); /** 文件名 */ private String excel_name; /**父级目录*/ private String parent_path; /**文件绝对路径*/ private String file_name; public Integer agent_level = ConstantsReport.AGENT_LEVEL_NO; public void addSheet(SheetArgs sheet){ if(sheets==null){ sheets = new ArrayList<>(); } sheets.add(sheet); } public List<SheetArgs> getSheets() { return sheets; } public void setSheets(List<SheetArgs> sheets) { this.sheets = sheets; } public String getExcel_name() { return excel_name; } public void setExcel_name(String excel_name) { this.excel_name = excel_name; } public String getParent_path() { return parent_path; } public void setParent_path(String parent_path) { this.parent_path = parent_path; } public String getFile_name() { return file_name; } public Integer getAgent_level() { return agent_level; } public void setAgent_level(Integer agent_level) { this.agent_level = agent_level; } public ExcelArgs(String excel_name) { super(); this.excel_name = excel_name; } public ExcelArgs(String excel_name, String parent_path) { super(); this.excel_name = excel_name; this.parent_path = parent_path; } /** * 初始化excel文件的路径 */ public void init() { if (!(excel_name != null && !excel_name.trim().equals(""))) { throw new RuntimeException("excel 文件名不能为空"); } excel_name = excel_name.trim(); if (!(excel_name.endsWith(".xls") || excel_name.endsWith(".xlsx"))) { excel_name = excel_name + ".xls"; } DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); excel_name = format.format(new Date()) + "-" + excel_name; if (!(parent_path != null && !parent_path.trim().equals(""))) { parent_path = "C:\\excel";//文件目录 } if (!(parent_path.endsWith(File.separator))) { parent_path += File.separator; } File parentDir = new File(parent_path); if (!parentDir.exists()) { parentDir.mkdirs(); } file_name = parent_path + UUID.randomUUID() + "_" + excel_name; } }
工具参数类
package com.zcj.poi; /** * excel报表参数 * @author MrZhou * */ public class ReportArgs { /**方法名*/ public String method; /**属性名*/ public String field; /**列名*/ public String name; /**顺序*/ public int order; /**格式化*/ public int format; public ReportArgs(String field, String name, int order, int format, int agent_level) { super(); this.field = field; this.name = name; this.order = order; this.format = format; } }
excel工具类
package com.zcj.poi; import java.io.FileOutputStream; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Locale; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.WorkbookUtil; /** * 根据类上的属性和方法上的注解生成excel文件工具 * * @author MrZhou * */ public class ExeclAnnotationUtils { /** * 生成excel文件 * * @param excel * @throws Exception */ public static void createExcel(ExcelArgs excel) throws Exception { excel.init(); System.err.println(excel.getFile_name()); Workbook wb = new HSSFWorkbook();// 创建excel文件 List<SheetArgs> sheets = excel.getSheets(); if (sheets != null && !sheets.isEmpty()) { for (SheetArgs sheet : sheets) { createSheet(wb, sheet); } } FileOutputStream execl = new FileOutputStream(excel.getFile_name());// 创建一个文件流 wb.write(execl);// 把内容写入流 execl.close(); } /** * 创建工作簿 * * @param workbook * 工作簿 * @param mySheet * 工资表参数 * @param agent_level * 代理商等级 * @throws Exception */ private static void createSheet(Workbook workbook, SheetArgs mySheet) throws Exception { Field[] fields = mySheet.clazz.getDeclaredFields();// 获取所有的属性 List<ReportArgs> Reports = new ArrayList<>(); for (Field field : fields) { Annotation annotation = field.getAnnotation(ReportAnnotation.class); if (annotation instanceof ReportAnnotation) { ReportAnnotation myAnnotation = (ReportAnnotation) annotation; ReportArgs report = new ReportArgs(field.getName(), myAnnotation.name(), myAnnotation.order(), myAnnotation.format(), myAnnotation.agent_level()); Reports.add(report); } } Method[] methods = mySheet.clazz.getDeclaredMethods();// 获取所有的方法 for (Method field : methods) { Annotation annotation = field.getAnnotation(ReportAnnotation.class); if (annotation instanceof ReportAnnotation) { ReportAnnotation myAnnotation = (ReportAnnotation) annotation; ReportArgs report = new ReportArgs(null, myAnnotation.name(), myAnnotation.order(), myAnnotation.format(), myAnnotation.agent_level()); report.method = field.getName(); Reports.add(report); } } Collections.sort(Reports, new Comparator<ReportArgs>() {// 列排序 @Override public int compare(ReportArgs o1, ReportArgs o2) { return o1.order - o2.order; } }); // 设置数据样式 CellStyle cellStyle = workbook.createCellStyle(); cellStyle.setAlignment(CellStyle.ALIGN_CENTER);// 水平居中 cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 垂直居中 // 设置标题样式 CellStyle titleStyle = workbook.createCellStyle(); titleStyle.setAlignment(CellStyle.ALIGN_CENTER); titleStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); titleStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); titleStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); Font font = workbook.createFont();// 设置字体 font.setFontHeightInPoints((short) 24);// 字体大小 titleStyle.setFont(font); // 设置统计样式 CellStyle statisticalSecondStyle = workbook.createCellStyle(); statisticalSecondStyle.setAlignment(CellStyle.ALIGN_LEFT); statisticalSecondStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); Font statisticalFont = workbook.createFont();// 设置字体 statisticalFont.setFontHeightInPoints((short) 16);// 字体大小 statisticalSecondStyle.setFont(statisticalFont); // 获取列数 int columnlength = Reports.size(); String safeName = WorkbookUtil.createSafeSheetName(mySheet.sheet_name);// 创建安全的工作表名 Sheet sheet = workbook.createSheet(safeName);// 创建工作表 sheet.setDefaultColumnWidth(25);// 设置列的宽度 Row row = null; Cell cell = null; Integer rowNumber = -1; if (mySheet.title_name != null && !mySheet.title_name.equals("")) { // 设置总标题 row = sheet.createRow(++rowNumber); row.setHeightInPoints(40); cell = row.createCell(0); cell.setCellValue(mySheet.title_name); cell.setCellStyle(titleStyle); sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 6));// 合并单元格 } // 设置列标题 row = sheet.createRow(++rowNumber); row.setHeightInPoints(30); for (int i = 0; i < columnlength; i++) {// 权限控制 ReportArgs report = Reports.get(i); cell = row.createCell(i); cell.setCellValue(report.name);// 设置列名 } List datas = mySheet.source;// 获取数据 if (datas != null && !datas.isEmpty()) {// 数据遍历 for (Object object : datas) { row = sheet.createRow(++rowNumber); for (int i = 0; i < columnlength; i++) { ReportArgs report = Reports.get(i); cell = row.createCell(i); String data = "\t"; String field = report.field; Object show = null; if (field != null && !"".equals(field)) { Field myField = mySheet.clazz.getDeclaredField(report.field);// 从属性获取数据 myField.setAccessible(true); show = myField.get(object); } else { Method method = mySheet.clazz.getDeclaredMethod(report.method);// 从方法获取数据 method.setAccessible(true); show = method.invoke(object); } if (show == null) { continue; } else if (Reports.get(i).format == ConstantsReport.FORMAT_CURRENCY) {// 对金额格式化 NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.CHINA); data += currency.format(show); } else if (Reports.get(i).format == ConstantsReport.FORMAT_PERCENT) {// 数字百分比格式化 NumberFormat percent = NumberFormat.getPercentInstance(Locale.CHINA); percent.setMinimumFractionDigits(4);// 保留百分比小数点后4位 data += percent.format(show); } else { data += show.toString(); } cell.setCellValue(data); cell.setCellStyle(cellStyle); } } } // 设置统计数据 if (mySheet.statistical_datas != null && !mySheet.statistical_datas.isEmpty()) { for (String statistical_data : mySheet.statistical_datas) { ++rowNumber;// 跳过一行 // 统计数据 row = sheet.createRow(++rowNumber); row.setHeightInPoints(30); cell = row.createCell(1); cell.setCellValue(statistical_data); cell.setCellStyle(statisticalSecondStyle); sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 1, 7));// 合并单元格 } } } }
测试类
package com.zcj.poi; public class Student { @ReportAnnotation(name = "姓名", order = 10) private String name; @ReportAnnotation(name = "年龄", order = 20) private Integer age; @ReportAnnotation(name = "地址", order = 30) private String address; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public Student(String name, Integer age, String address) { this.name = name; this.age = age; this.address = address; } public Student() { } }
package com.zcj.poi; import java.util.ArrayList; import java.util.List; public class TestExcel { public static void main(String[] args) throws Exception { //数据 Student student1 = new Student("唐三藏",30,"大唐长安"); Student student2 = new Student("孙悟空",20,"花果山"); List<Student> students = new ArrayList<>(); students.add(student1); students.add(student2); //工作表 SheetArgs sheet = new SheetArgs(); sheet.sheet_name = "学生信息报表统计"; sheet.title_name = "学生信息"; sheet.clazz = Student.class; sheet.source = students; //excel ExcelArgs excel = new ExcelArgs("学生信息报表统计"); excel.addSheet(sheet); //生成excel文件 ExeclAnnotationUtils.createExcel(excel); } }
相关推荐
java.lang.management 提供管理接口,用于监视和管理 Java 虚拟机以及 Java 虚拟机在其上运行的操作系统。 java.lang.ref 提供了引用对象类,支持在某种程度上与垃圾回收器之间的交互。 java.lang.reflect 提供类...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...
这是一本以面试题为入口讲解 Java 核心内容的技术书籍,书中内容极力的向你证实代码是对数学逻辑的具体实现。当你仔细阅读书籍时,会发现Java中有大量的数学知识,包括:扰动函数、负载因子、拉链寻址、开放寻址、...
Java OCR(Optical Character Recognition,光学字符识别)技术是一种计算机视觉领域的应用,它能将图像中的文字转换成可编辑的文本格式。这项技术在各种场景下都有广泛应用,比如文档扫描、车牌识别、发票处理等。...
Java API文档是Java开发者的重要参考资料,它包含了Java开发工具包(JDK)中的所有类、接口、方法和常量的详细说明。这份中文网页版的Java API文档为中国的开发者提供了便利,无需通过英文版本来学习和查找API信息,...
java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011 java 人脸识别完整源代码java_011...
Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行...
java源码包实例源码JAVA开发源码50个合集: Ajax框架 ZK.rar Java图书馆管理系统源程序.rar Java图片倒影效果实例源码.rar Java图片翻折,将图像压扁.rar Java坦克大战网络对战版源代码.rar Java声音播放程序源代码....
JAVA开发人员最新版本7.0 api文档!本文档是 Java Platform Standard Edition 7 的 API !Java 1.7 API的中文帮助文档。 深圳电信培训中心 徐海蛟博士教学用api 7.0中文文档。支持全文检索,在线即时查询。 里面列...
### Java基础知识概述 #### 1. 前言 Java是一种广泛使用的面向对象的编程语言,因其跨平台性、安全性和强大的功能而受到欢迎。Java的设计理念是“一次编写,到处运行”,这意味着编写的Java程序可以在任何安装了...
java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点导航系统java景点...
java单机小游戏java单机小游戏java单机小游戏java单机小游戏 java单机小游戏java单机小游戏java单机小游戏java单机小游戏 java单机小游戏java单机小游戏java单机小游戏java单机小游戏 java单机小游戏java单机小游戏...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
最新全套Java学习资料打包 最新全套Java学习资料打包 最新全套Java学习资料打包 最新全套Java学习资料打包 最新全套Java学习资料打包 最新全套Java学习资料打包 最新全套Java学习资料打包 最新全套Java...
日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载Applet的网页文件 第2章 示例描述:本章介绍开发Java的基础语法知识。 ...
### Java 错误处理:java.lang.OutOfMemoryError: Java heap space 在Java应用程序开发过程中,经常遇到的一个问题就是内存溢出错误,特别是在处理大量数据或长时间运行的应用时。其中,“java.lang....
这份名为“从Java菜鸟到专家的资料”的压缩包文件包含了丰富的学习资源,旨在帮助初学者逐步成长为Java领域的专家。以下是对各个文件的详细解读: 1. **J2EE研究文集.chm**:这个文件专注于Java企业级应用开发,...