`
haifengwuch
  • 浏览: 5214 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

excel处理工具类

 
阅读更多
package common;

import me.alad.common.AladdinLogger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.*;
import java.lang.reflect.Field;
import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * User: user
 * Date: 14-7-18
 * Time: 上午9:33
 * To change this template use File | Settings | File Templates.
 */


/**
 * 处理实体生成excel工具类
 *  使用规范
 *  1.如果headMap,不指定行高,列宽都默认值,实体每个属性都输出
 *  2,如果指定了列的排序比如("name$sort",0),那么headMap中的其他实体的属性需要全部自定排序,并且不能序号重复,不然可能造成空列的情况
 *
 */

public class ExcelUtil {
    private static final AladdinLogger log = AladdinLogger.getLogger(ExcelUtil.class);

    /**
     * 转换集合成excel文件
     *
     * @param fileName 转换成excel的文件名
     * @param list 需要转换的类的集合
     * @param headMap 表头map,表头字段map,key对应list的实体的属性,value对应excel中显示的列名,传入为null 表示实体属性全部输出
     *  headMap.put("excel_column$Width",20); //默认列宽
     *  headMap.put("excel_row$Height",20*20); 默认行高
     * 显示:headMap.put("name","名字")excel中显示名字这列
     * 排序:headMap.put("name$Sort",0); 0 排第一列  如果不指定,按照属性默认排序
     * 某列的宽度 headMap.put("name$Width",20*256);  默认20字符
     *
     */
    public static void exportExcelFromList(String fileName, List list, Map headMap,HttpServletResponse response) {

        try {
            //数据为空提示
            if (list == null || list.size() == 0) {
                response.setHeader("Content-type", "text/html;charset=UTF-8");
                response.setCharacterEncoding("UTF-8");
                OutputStream os = response.getOutputStream();
                OutputStreamWriter writer = new OutputStreamWriter(os,"utf-8");
                writer.write("<script>");
                writer.write("alert('数据为空,生成excel失败!');window.history.go(-1);");
                writer.write("</script>");
                writer.flush();
                writer.close();
                os.close();
                return ;
            }

            HSSFWorkbook hwb = new HSSFWorkbook();
            int countRow = list.size();//总行数
            int countSheet = 1;//总工作表
            int sheetCountRow = countRow;//每个工作表显示的行数
            int sheetMaxCount=65000; //每个工作表最大行数
            if (countRow > sheetMaxCount) {
                countSheet = countRow % sheetMaxCount == 0 ? countRow / sheetMaxCount : countRow / sheetMaxCount + 1;
                sheetCountRow = sheetMaxCount;
            }
            if (countSheet > 256) {
                return;
            }
            CellStyle headStyle = setHeaderCellStyle(hwb);
            CellStyle style =  setRowCellStyle( hwb);//设置默认样式
            for (int i = 0; i < countSheet; i++) {
                Sheet sheet = hwb.createSheet("sheet" + (i + 1));
                int defaultColumnWidth =20;
                if(headMap!=null){
                    defaultColumnWidth =headMap.get("excel_column$Width") == null ? defaultColumnWidth : Integer.valueOf(headMap.get("excel_column$Width").toString());
                }
                sheet.setDefaultColumnWidth(defaultColumnWidth);
                Short defaultHeight =(short) (20*20);
                if(headMap!=null){
                    defaultHeight =headMap.get("excel_row$Height")==null?defaultHeight:Short.valueOf(headMap.get("excel_row$Height").toString());
                }
                sheet.setDefaultRowHeight(defaultHeight);
                Row firstRow = sheet.createRow(0); // 下标为0的行开始
                List<Field> fields =getDeclaredFields(list.get(0));
                int countHead = 0;   //表头
                for (Field item : fields) {
                    String name = item.getName(); // 属性名
                    Integer sort=countHead;
                    Cell cell =null;
                    if(headMap ==null || headMap.isEmpty()){   //遍历全部属性
                        cell = firstRow.createCell(sort);
                        sheet.autoSizeColumn(sort);     //自适应
                        cell.setCellStyle(headStyle);
                        cell.setCellValue(name);
                        countHead++;
                    }else{
                        if(headMap.get(name) != null){
                            if (headMap.get(name+"$Sort") != null) { //改变列名
                                sort= Integer.valueOf(headMap.get(name+"$Sort").toString());
                            }
                            if(headMap.get(name+"$Width")!=null ) {
                                sheet.setColumnWidth(sort,Integer.valueOf(headMap.get(name+"$Width").toString()));
                            }else{
                                //自适应
                                sheet.autoSizeColumn(sort);
                            }
                            cell = firstRow.createCell(sort);
                            cell.setCellStyle(headStyle);
                            cell.setCellValue(headMap.get(name).toString());
                            countHead++;
                        }
                    }


                }
                for (int j = 0; j < sheetCountRow; j++) {
                    int index = i * sheetMaxCount + j;//list集合下表
                    if (index > countRow - 1) {//list已经全部循环取出来了,结束整个循环
                        break;
                    }
                    // 创建一行
                    Row row = sheet.createRow(j + 1);
                    int count = 0;
                    for (Field item : fields) {
                        String name = item.getName(); // 属性名
                        item.setAccessible(true);
                        Cell cell =null;
                        int sort = count;
                        if(headMap == null || headMap.isEmpty()){
                            cell =row.createCell(sort);
                            cell.setCellStyle(style);
                            setCellTypeValue(cell,item,list.get(index));
                            count++;
                        }else{
                            if( headMap.get(name) != null){
                                sort =headMap.get(name+"$Sort")==null ?count : Integer.valueOf(headMap.get(name+"$Sort").toString()); //填充类中需要填充的字段的值
                                cell =row.createCell(sort);
                                cell.setCellStyle(style);
                                setCellTypeValue(cell,item,list.get(index));
                                count++;
                            }
                        }

                    }
                }
            }

            list = null; //清空list释放内存
            OutputStream os = response.getOutputStream();
            // 这个是弹出下载对话框的关键代码
            response.setHeader("Content-disposition", "attachment;filename=" + ((null == fileName) || ("".equals(fileName.trim()))? (new Date().getTime() + "") : new String(fileName.trim().getBytes("gb2312"),"ISO8859-1")) + ".xls");
            // 将工作簿进行输出
            hwb.write(os);
            os.flush(); // 关闭输出流
            os.close();
        } catch (Exception e) {
            log.error("导出excel出错:"+e.getMessage());
        }

    }

    /**
     * 个单元格设置类型,值
     * @param cell 单元格
     * @param item 反射属性类
     * @param entity 集合中的实体
     */
    public static void setCellTypeValue(Cell cell,Field item,Object entity) {
        //Boolean
        String typeName =item.getGenericType().toString();
        try{
            if(typeName.equals("class java.lang.Boolean") || typeName.equals("boolean")){         //后面是它的基本类型
                cell.setCellType(HSSFCell.CELL_TYPE_BOOLEAN);
                if(item.get(entity)!=null){
                    cell.setCellValue((Boolean) item.get(entity));
                }
                return;
            }
            // Double
            if(typeName.equals("class java.lang.Double") || typeName.equals("double")) {
                cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                if(item.get(entity)!=null){
                    cell.setCellValue((Double)item.get(entity));
                }
                return;
            }

            if( typeName.equals("class java.lang.Integer") || typeName.equals("int")){
                cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                if(item.get(entity)!=null){
                    cell.setCellValue((Integer)item.get(entity));

                }
                return;
            }
            if(typeName.equals("class java.lang.Short") || typeName.equals("short")){
                cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                if(item.get(entity)!=null){
                    cell.setCellValue((Short)item.get(entity));

                }
                return;
            }

            if(typeName.equals("class java.lang.Float") || typeName.equals("float")){
                cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                if(item.get(entity)!=null){
                    cell.setCellValue((Float)item.get(entity));

                }
                return;
            }
            if(typeName.equals("class java.lang.Long") || typeName.equals("long")){
                cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                if(item.get(entity)!=null){
                    cell.setCellValue((Long)item.get(entity));

                }
                return;
            }

            //String 其他类型
            cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            if(item.get(entity)!=null){
                cell.setCellValue((String) item.get(entity));
            }
        }catch (Exception e){
            log.error("类型转换出错"+e.getMessage());
        }

    }



    /**
     * 获取属性集合,循环向上转型, 获取对象的属性,包括父类的
     * @param object : 对象
     * @return 属性的集合
     */

    public static List<Field> getDeclaredFields(Object object){
        List<Field> fields = new ArrayList<Field>();
        Class<?> clazz = object.getClass() ;
        for(; clazz != Object.class ; clazz = clazz.getSuperclass()) {
            try {
                fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
            } catch (Exception e) {
                //这里甚么都不要做!并且这里的异常必须这样写,不能抛出去。
                //如果这里的异常打印或者往外抛,则就不会执行clazz = clazz.getSuperclass(),最后就不会进入到父类中了
                log.error("获取父类的属性出错"+e.getMessage());
            }
        }

        return fields;
    }

    /**
     * 设置表头的单元格样式
     * @param hwb
     *
     */
    public static CellStyle setHeaderCellStyle(HSSFWorkbook hwb){
        CellStyle style =hwb.createCellStyle();
        Font font=hwb.createFont();
        font.setFontHeightInPoints((short)12);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);         //字体增粗
        //把字体应用到当前的样式
        style.setFont(font);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;
    }

    /**
     * 设置单元格样式
     * @param hwb
     */
    public static CellStyle setRowCellStyle(HSSFWorkbook hwb){
        CellStyle style =hwb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        return style;
    }



// public static void main(String[] arg){
// CompanyOverValue overValue = new CompanyOverValue();
// overValue.setLicenseImages("xxxx");
// overValue.setRegistNumber("dfadfa");
// overValue.setPhone("1234566545");
// overValue.setAddress("你好啊。");
// List<CompanyOverValue> list = new ArrayList<CompanyOverValue>();
// list.add(overValue);
// Map showHead = new HashMap();
// showHead.put("phone","电话");
// showHead.put("address","地址");
// showHead.put("registNumber","合同号");
// showHead.put("licenseImages","营业执照");
//
// /*
// 不指定排序就是默认类中属性的排序
// showHead.put("excel_head$Height",20);   //表头一列的高度
// showHead.put("excel_row$Height",20); //指定excel每行高度
// showHead.put("phone$Sort",0); //指定列名排序 如果指定了其中一列其他的都要自己指定排序
// showHead.put("address$Sort",1); //指定列名排序 如果指定了其中一列其他的都要自己指定排序
// showHead.put("registNumber$Sort",2); //指定列名排序 如果指定了其中一列其他的都要自己指定排序
// showHead.put("licenseImages$Sort",3); //指定列名排序 如果指定了其中一列其他的都要自己指定排序
    //   showHead.put("licenseImages$Width",200); //置顶这列的宽度
// */
// HttpServletResponse response =null; //自己从controller中拿到
// ExcelUtil.exportExcelFromList("今天测试",list,showHead,response);
// }

}
分享到:
评论

相关推荐

    java Excel相关处理 工具类 java Excel相关处理 工具类

    java Excel相关处理 工具类 java Excel相关处理 工具类java Excel相关处理 工具类 java Excel相关处理 工具类java Excel相关处理 工具类 java Excel相关处理 工具类java Excel相关处理 工具类 java Excel相关处理 ...

    util_ExcelUtils工具类_

    Excel文件通常被广泛用于数据存储、报告生成和数据分析等领域,因此,一个强大的Excel处理工具类是十分必要的。 `ExcelUtils`工具类的核心功能可能包括以下几个方面: 1. **读取Excel文件**:通过Apache POI库或...

    Excel POI 工具类

    10. **数据流处理**:除了处理本地文件,工具类也可能支持从网络流或内存中读写Excel,便于在Web应用中处理Excel数据。 通过使用这样的"Excel POI 工具类",开发人员可以避免重复编写相同的代码,提高代码的可维护...

    Excel导出工具类

    在IT行业中,Excel导出工具类是经常被用于数据处理和报表生成的模块。这个工具类通常是为了简化从应用程序中批量导出数据到Excel文件的过程,使得开发者可以更高效地处理大量的结构化信息。以下是对"Excel导出工具类...

    C#通用Excel导入导出工具类

    本篇文章将深入探讨“C#通用Excel导入导出工具类”的实现原理及应用,主要涉及的技术点包括反射、特性以及如何创建一个高效的Excel导入导出解决方案。 首先,我们要理解反射在C#中的作用。反射是一种强大的机制,它...

    一款很有用的Excel读写工具类

    总结来说,这款Excel读写工具类为非MFC环境提供了便利的数据处理手段,简化了Excel操作的复杂度,提高了开发效率。通过深入理解和应用这个工具,开发者可以更好地进行数据的导入导出,实现更高效的数据管理。

    java写的excel万能工具类

    Java编写的Excel万能工具类是一种高效处理Excel数据的实用程序,它可以帮助开发者轻松地读取、写入和操作Excel文件。在这个工具类中,通常会包含一系列静态方法,用于处理各种Excel相关的任务,比如打开文件、读取...

    excel导出工具类

    这个工具类主要是为了简化编程过程中处理Excel文件的工作,尤其是考虑到数据类型的多样性,使得开发者能够快速、高效地实现Excel文件的导出功能。下面我们将深入探讨Excel导出工具类的相关知识点。 首先,我们要...

    java_poi导入excel通用工具类

    - 在Excel处理方面,POI 提供了 HSSF(Horrible Spreadsheet Format)和 XSSF(XML Spreadsheet Format)两个API,分别用于读写旧版的 `.xls` 文件和较新的 `.xlsx` 文件。 - POI 提供了 Sheet、Row、Cell 等类,...

    Excel创建工具类

    "Excel创建工具类"是用于简化Excel文件操作的一种方法,它允许开发者通过编程方式快速生成和修改Excel工作簿。本篇将详细介绍如何创建这样一个工具类,以及如何利用Apache POI库(版本3.12)来实现。 Apache POI是...

    java使用POI导出 Excel工具类

    java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。

    Excel工具类.zip

    在IT行业中,Excel工具类是常见的一种实用程序,特别是在数据处理和分析的场景下。SpringBoot框架结合Excel工具类,可以方便地实现从数据库中获取数据并导出为Excel文件,便于用户查看、分析或者进一步处理。这个...

    java操作excel工具类

    Java操作Excel工具类是开发过程中常见的一种需求,尤其是在数据导入导出、数据分析或者报表生成的场景下。在Java中,我们可以使用多种库来处理Excel文件,例如Apache POI、JExcelAPI、OpenCSV等。本篇文章将重点介绍...

    Java poi导入导出EXCEL工具类(兼容各版本)

    概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...

    java操作excel的工具类

    java操作excel的工具类,有处理excel的方法。 好资源大家一起分享。如果急需用,但是有下载积分的话,关注我,留言我,就OK了。 希望大家关注的我的CSDN。 我的昵称:今升·小博 地址:...

    java导出excel文档通用工具类

    总之,"java导出excel文档通用工具类"是Java开发中的一个实用组件,它封装了Excel文件生成的复杂性,使得开发者可以专注于数据处理和业务逻辑,而不是底层的文件操作。通过学习和理解这个工具类的工作原理,我们可以...

    java中poi读写excel封装工具类(兼容office2003和2007等版本)

    要兼容不同版本的Excel,工具类需要处理HSSFWorkbook和XSSFWorkbook。可以通过检查文件扩展名或MIME类型来确定使用哪种类型的工作簿。 6. **注意事项** - 关闭资源:读写完成后,记得关闭输入/输出流和工作簿对象...

    excel生成图表工具类.zip

    本项目提供了一个名为"excel生成图表工具类"的Java类库,帮助开发者通过编程方式自动化创建Excel图表,包括柱状图、折线图和饼状图。以下将详细解析这个工具类库的主要知识点: 1. **Java编程基础**:首先,你需要...

    excel 表格处理工具

    1. ExcelAssiant.exe:这是主程序文件,包含了整个Excel处理工具的执行代码。 2. ICSharpCode.SharpZipLib.dll:这是一个开源的.NET库,用于处理压缩和解压缩操作,可能在这个工具中用于读取或保存压缩的Excel文件。...

Global site tag (gtag.js) - Google Analytics