Java Annotation 应用 -- 导出Excel表格

1.声明注解

package com.ciic.component.excel;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelAnnotation {
    // excel导出时标题显示的名字,如果没有设置Annotation属性,将不会被导出和导入
    public String exportName();
}

2.应用注解

package com.ciic.history.entity;

import com.ciic.component.excel.ExcelAnnotation;
import com.ciic.history.common.ExportBase;

//客户一揽子表
public class EsinnerLimeCustomerPreviewIndex extends ExportBase {
    @ExcelAnnotation(exportName = "客户名称")
    private String imscustomername;
    @ExcelAnnotation(exportName = "客户编号")
    private String imscustomercode;
    @ExcelAnnotation(exportName = "合同方式")
    private long imscontracttypea;
    @ExcelAnnotation(exportName = "月服务费")
    private String serviceimstotalfee;
    @ExcelAnnotation(exportName = "雇员人数")
    private long employeecount;
    @ExcelAnnotation(exportName = "应收金额")
    private String imstotalfee;
    @ExcelAnnotation(exportName = "实收金额")
    private String doneimstotalfee;
    @ExcelAnnotation(exportName = "应付金额")
    private String imssocialinsurancetfee;
    @ExcelAnnotation(exportName = "实付金额")
    private String dtlimssocialinsurancetfee;
    @ExcelAnnotation(exportName = "最后修改日期")
    private String modifieddate;
    @ExcelAnnotation(exportName = "客户简称")
    private String imscustomershort;
    @ExcelAnnotation(exportName = "合作方式")
    private long imscontracttypeb;
    @ExcelAnnotation(exportName = "客户经理")
    private String imscustomerclerk;
    @ExcelAnnotation(exportName = "未付款日期")
    private String unimspaynoticemonth;
    @ExcelAnnotation(exportName = "已交付日期")
    private String doneimspaynoticemonth;

    getter()
    setter()
}

3.解析注解

  3.1 获取数据

public  void exportCustomerPreview(EsinnerLimeCustomerPreviewIndex customerPreview, HttpServletResponse response)throws  Exception{

        JsonEntity entity =XAServiceL.customerPreviewSearch(customerPreview,customerPreview.getPage(),customerPreview.getRows());

        ExcelExport excelExport=  new ExcelExport();
        response.reset();
        String fileName="";
        if(StringUtils.isBlank(customerPreview.getExcelName())){
            fileName="客户一揽子表/第"+customerPreview.getPage()+"页.xls";
        }else{
            fileName=customerPreview.getExcelName()+"/第"+customerPreview.getPage()+"页.xls";
        }

        response.setContentType("application/form-data;charset=UTF-8");
        response.addHeader("Content-Disposition", "attachment;filename=\""
                + new String(fileName.getBytes("UTF-8"),
                "UTF-8") + "\"");
        System.out.println(Arrays.toString(entity.getRows().toArray()));
        List<EsinnerLimeCustomerPreviewIndex> outExcel=new ArrayList<EsinnerLimeCustomerPreviewIndex>();
        for(int i=0;i<entity.getRows().size();i++){
            outExcel.add(MapBeanConvert.toBean(EsinnerLimeCustomerPreviewIndex.class,(Map) entity.getRows().get(i)));
        }
        excelExport.exportExcel(customerPreview.getExcelName(),outExcel,response.getOutputStream());
    }

  3.2 解析注解

/**
     * 将一个 Map 对象转化为一个 JavaBean
     *
     * @param clazz 要转化的类型
     * @param map   包含属性值的 map
     * @return 转化出来的 JavaBean 对象
     * @throws IntrospectionException    如果分析类属性失败
     * @throws IllegalAccessException    如果实例化 JavaBean 失败
     * @throws InstantiationException    如果实例化 JavaBean 失败
     * @throws InvocationTargetException 如果调用属性的 setter 方法失败
     */
    @SuppressWarnings("rawtypes")
    public static <T> T toBean(Class<T> clazz, Map map) {
        T obj = null;
        String name = "";
        try {
            BeanInfo beanInfo = Introspector.getBeanInfo(clazz);
            obj = clazz.newInstance(); // 创建 JavaBean 对象

            // 给 JavaBean 对象的属性赋值
            PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
            for (int i = 0; i < propertyDescriptors.length; i++) {
                PropertyDescriptor descriptor = propertyDescriptors[i];
                String propertyName = descriptor.getName();
                name = propertyName;
                if (map.containsKey(propertyName)) {
                    // 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。
                    Object value = map.get(propertyName);
                    if ("".equals(value)) {
                        value = null;
                    }
                    Object[] args = new Object[1];
                    args[0] = value;
                    try {
                        descriptor.getWriteMethod().invoke(obj, args);
                    } catch (InvocationTargetException e) {
                        System.out.println("字段映射失败");
                    }
                }
            }
        } catch (IllegalAccessException e) {
            System.out.println("实例化 JavaBean 失败");
        } catch (IntrospectionException e) {
            System.out.println("分析类属性失败");
        } catch (IllegalArgumentException e) {
//            e.printStackTrace();
            System.err.println(name);
            System.out.println("映射错误");
        } catch (InstantiationException e) {
            System.out.println("实例化 JavaBean 失败");
        }
        return (T) obj;
    }

  3.3 导出Excel

package com.ciic.component.excel;

import org.apache.poi.hssf.usermodel.*;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 *
 */
public class ExcelExport<T> {
    /**
     * @param title   标题
     * @param dataset 集合
     * @param out     输出流
     */
    public void exportExcel(String title, Collection<T> dataset,
                            OutputStream out) {
        // 声明一个工作薄
        try {
            //首先检查数据看是否是正确的
            Iterator<T> its = dataset.iterator();
            if (dataset == null || !its.hasNext() || title == null || out == null) {
                throw new Exception("传入的数据不对!");
            }

            T ts = (T) its.next();

            HSSFWorkbook workbook = new HSSFWorkbook();
            // 生成一个表格
            HSSFSheet sheet = workbook.createSheet(title);
            // 设置表格默认列宽度为15个字节
            sheet.setDefaultColumnWidth(15);
            // 生成一个样式
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置标题样式
//            style = ExcelStyle.setHeadStyle(workbook, style);
//            // 生成并设置主体样式
//            HSSFCellStyle style2 = workbook.createCellStyle();
//            style2 = ExcelStyle.setbodyStyle(workbook, style2);
            // 得到所有字段

            Field filed[] = ts.getClass().getDeclaredFields();
            // 标题
            List<String> exportfieldtile = new ArrayList<String>();
            // 导出的字段
            List<String> fiedName = new ArrayList<String>();
            // 遍历整个filed
            for (int i = 0; i < filed.length; i++) {
                Field f = filed[i];
                ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);
                // 如果设置了annottion
                if (exa != null) {
                    String exprot = exa.exportName();
                    // 添加到标题
                    exportfieldtile.add(exprot);
                    // 添加到需要导出的字段
                    fiedName.add(f.getName());
                }
            }
            // 产生表格标题行
            HSSFRow row = sheet.createRow(0);
            for (int i = 0; i < exportfieldtile.size(); i++) {
                HSSFCell cell = row.createCell(i);
                cell.setCellStyle(style);
                HSSFRichTextString text = new HSSFRichTextString(
                        exportfieldtile.get(i));
                cell.setCellValue(text);
            }

            Iterator<T> it = dataset.iterator();
            int index = 0;
            // 循环整个集合
            while (it.hasNext()) {
                index++;
                row = sheet.createRow(index);
                T t = (T) it.next();
                for (int k = 0; k < fiedName.size(); k++) {
                    HSSFCell cell = row.createCell(k);
                    String fieldname = fiedName.get(k);
                    String getMethodName = "get"
                            + fieldname.substring(0, 1).toUpperCase()
                            + fieldname.substring(1);
                    Class tCls = t.getClass();
                    Method getMethod = tCls.getMethod(getMethodName,
                            new Class[]{});
                    Object value = getMethod.invoke(t, new Object[]{});

                    String textValue = getValue(value);

                    HSSFRichTextString richString = new HSSFRichTextString(
                            textValue);
                    cell.setCellValue(richString);
                }

            }
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * @param title   标题
     * @param dataset 集合
     */
    public File exportExcel(String title, Collection<T> dataset) {
        OutputStream out = null;
        File file = null;
        // 声明一个工作薄
        try {
            //首先检查数据看是否是正确的
            Iterator<T> its = dataset.iterator();
            if (dataset == null || !its.hasNext() || title == null) {
                throw new Exception("传入的数据不对!");
            }

            T ts = (T) its.next();

            HSSFWorkbook workbook = new HSSFWorkbook();
            // 生成一个表格
            HSSFSheet sheet = workbook.createSheet(title);
            // 设置表格默认列宽度为15个字节
            sheet.setDefaultColumnWidth(15);
            // 生成一个样式
            HSSFCellStyle style = workbook.createCellStyle();
            // 设置标题样式
//            style = ExcelStyle.setHeadStyle(workbook, style);
//            // 生成并设置主体样式
//            HSSFCellStyle style2 = workbook.createCellStyle();
//            style2 = ExcelStyle.setbodyStyle(workbook, style2);
            // 得到所有字段

            Field filed[] = ts.getClass().getDeclaredFields();
            // 标题
            List<String> exportfieldtile = new ArrayList<String>();
            // 导出的字段
            List<String> fiedName = new ArrayList<String>();
            // 遍历整个filed
            for (int i = 0; i < filed.length; i++) {
                Field f = filed[i];
                ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);
                // 如果设置了annottion
                if (exa != null) {
                    String exprot = exa.exportName();
                    // 添加到标题
                    exportfieldtile.add(exprot);
                    // 添加到需要导出的字段
                    fiedName.add(f.getName());
                }
            }
            // 产生表格标题行
            HSSFRow row = sheet.createRow(0);
            for (int i = 0; i < exportfieldtile.size(); i++) {
                HSSFCell cell = row.createCell(i);
                cell.setCellStyle(style);
                HSSFRichTextString text = new HSSFRichTextString(
                        exportfieldtile.get(i));
                cell.setCellValue(text);
            }

            Iterator<T> it = dataset.iterator();
            int index = 0;
            // 循环整个集合
            while (it.hasNext()) {
                index++;
                row = sheet.createRow(index);
                T t = (T) it.next();
                for (int k = 0; k < fiedName.size(); k++) {
                    HSSFCell cell = row.createCell(k);
                    String fieldname = fiedName.get(k);
                    String getMethodName = "get"
                            + fieldname.substring(0, 1).toUpperCase()
                            + fieldname.substring(1);
                    Class tCls = t.getClass();
                    Method getMethod = tCls.getMethod(getMethodName,
                            new Class[]{});
                    Object value = getMethod.invoke(t, new Object[]{});

                    String textValue = getValue(value);

                    HSSFRichTextString richString = new HSSFRichTextString(
                            textValue);
                    cell.setCellValue(richString);
                }

            }
            file = new File("/tmp/testOne.xls");
            out = new FileOutputStream(file);
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return file;
    }

    private String getValue(Object value) {
        String textValue = "";
        if (value == null)
            return textValue;

        if (value instanceof Boolean) {
            boolean bValue = (Boolean) value;
            textValue = "是";
            if (!bValue) {
                textValue = "否";
            }
        } else if (value instanceof Date) {
            Date date = (Date) value;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            textValue = sdf.format(date);
        } else
            textValue = value.toString();

        return textValue;
    }

}

啦啦啦

啦啦啦

时间: 2024-10-14 06:27:15

Java Annotation 应用 -- 导出Excel表格的相关文章

java代码实现导出Excel表格、工具ssm框架、maven、idea

第一步.导入依赖 <!--生成excel文件--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId&g

java中使用jxl导出Excel表格详细通用步骤

该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入session中备份一份,在调用导出方法时,从session中获取即可, 如果为后台直接导出,直接查询数据库后将结果传入即可,当然也可以在导出Excel方法中查询. 查询方法: // 获取查询结果存入session中        Object resultList = request.getAttr

Java中导入导出Excel -- POI技术

一.介绍: 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中,很多时候需要实现导入.导出Excel的应用. 目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel 下面我就分别讲解一下如何使用这两个技术实现导入.导出Excel 二.使用Jakarta POI导入.导出Excel Jakarta PO

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ?Copyright 蕃薯耀 2017年9月13日 http://www.cnblogs.com/fanshuyao/ 直接上代码: import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.ref

摘抄:java查询数据导出excel并返回给浏览器下载

maven地址为: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> 好了,废话不多少,上代码 jsp前端代码(根据自己的业务来) <span style="font-size:18px;">

java五行代码导出Excel

目录 先看代码 再看效果 EasyExcel 附: Java按模板导出Excel---基于Aspose实现 Java无模板导出Excel,Apache-POI插件实现 已经写过两种Excel导出插件了.今天再安利一个极简的导出Excel的框架,导出无特殊格式要求的Excel,只需五行代码: 先看代码 再看效果 EasyExcel 本案例用到的框架是阿里推出的EasyExcel,EasyExcel从第一次提交代码(2018年2月)到现在,在GitHub上已经获得6590个Star 以下是官方介绍

Java实现导入导出Excel文件的方法

目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel 直接上代码: 一,POI POI是apache的项目,可对微软的Word,Excel,Ppt进行操作,包括office2003和2007,Excl2003和2007.poi现在一直有更新.所以现在主流使用POI. xls: pom: org.apache.poi poi-ooxml 3.9 commons-io commons-io 2.2 导出: public class PoiCreat

原生JavaScript 导出excel表格(兼容ie和其他主流浏览器)

因同事的需求是想前端导出excel表格,网上找了一些demo,自己修改了一下,可能以后会用到,记录下来吧,兼容ie和一些主流浏览器,ie可能会报错,原因参考 这里,edge 浏览器还没有办法导出,正在尝试... <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>table 导出excel表格</title>

PHP导入导出excel表格图片(转)

写excel的时候,我用过pear的库,也用过pack压包的头,同样那些利用smarty等作的简单替换xml的也用过,csv的就更不用谈了.呵呵.(COM方式不讲了,这种可读的太多了,我也写过利用wps等进行word等的生成之类的文章 )但是在读的时候,只用过一种,具体是什么忘了,要回去翻代码了.基本上导出的文件分为两种:1:类Excel格式,这个其实不是传统意义上的Excel文件,只是因为Excel的兼容能力强,能够正确打开而已.修改这种文件后再保存,通常会提示你是否要转换成Excel文件.优