最近,因为工作上的需要自己封装了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电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java电商源代码java...
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单机小游戏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是为解决应用系统对于...
Java2Pas是一个实用工具,主要用于将Java编程语言编写的源代码转换为Pascal语言的等效代码。这个工具对于那些需要在两种语言之间迁移代码或者理解不同编程语言语法的开发者来说非常有价值。Java和Pascal虽然都是面向...
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企业级应用开发,...