POI导出Excel的工具

java

浏览数:629

2019-1-23

package com.meinong.util;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

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.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

/**
 * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保留以下信息,注明出处!
 * 
 * @author h_man
 * @version v1.0
 * @param <T>
 *            应用泛型,代表任意一个符合javabean风格的类
 *            注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx()
 */
public class ExportExcel<T>
{
    public void exportExcel(String title ,String[] headers,Collection<T> dataset, OutputStream out)
    {
        exportExcel(title, headers, dataset,"yyyy-MM-dd HH:mm:ss", out, new ArrayList<String>());
    }
    public void exportExcel(String title ,String[] headers,Collection<T> dataset,String pattern, OutputStream out)
    {
        exportExcel(title, headers, dataset,pattern, out, new ArrayList<String>());
    }
    public void exportExcel(String title ,String[] headers,String pattern,Collection<T> dataset, OutputStream out,String notExpStr)
    {
        List<String> li = new ArrayList<String>();
        li.add(notExpStr);
        exportExcel(title, headers, dataset,pattern,out, li);
    }


    /**
     * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
     * 
     * @param title
     *            表格标题名
     * @param headers
     *            表格属性列名数组
     * @param dataset
     *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
     *            javabean属性的数据类型有基本数据类型及String,Date
     * @param out
     *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
     * @param pattern
     *            如果有时间数据,设定输出格式。默认为"yyyy-MM-dd HH:mm:ss"
     * @param List<String> notExpStrs 不导出字段 集合         
     *             
     */
    @SuppressWarnings("unchecked")
    public void exportExcel(String title, String[] headers,
            Collection<T> dataset, String pattern, OutputStream out,List<String> li)
    {
        // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet(title);
        // 设置表格默认列宽度为20个字节
        sheet.setDefaultColumnWidth(20);
        // 生成一个样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置这些样式
        style.setFillForegroundColor(HSSFColor.WHITE.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 生成一个字体
        HSSFFont font = workbook.createFont();
//      font.setColor(HSSFColor.VIOLET.index);
        font.setFontHeightInPoints((short) 12);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 把字体应用到当前的样式
        style.setFont(font);
        //生成数据区域样式
        HSSFCellStyle style1 = workbook.createCellStyle();
        // 设置这些样式
        style1.setFillForegroundColor(HSSFColor.WHITE.index);
//      style1.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//      style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);
//      style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);
//      style1.setBorderRight(HSSFCellStyle.BORDER_THIN);
//      style1.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 生成一个字体
//      HSSFFont font1 = workbook.createFont();
//              font.setColor(HSSFColor.VIOLET.index);
//      font.setFontHeightInPoints((short) 12);
//      font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 把字体应用到当前的样式
//      style.setFont(font);
        //-----
        // 产生表格标题行
        HSSFRow row = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++)
        {
            HSSFCell cell = row.createCell(i);
            cell.setCellStyle(style);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
        }

        // 遍历集合数据,产生数据行
        Iterator<T> it = dataset.iterator();
        int index = 0;
        HSSFFont font3 = workbook.createFont();
        while (it.hasNext())
        {   
            index++;
            row = sheet.createRow(index);
            T t = (T) it.next();
            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
            Field[] fields = t.getClass().getDeclaredFields();
            List<String> strFields = new ArrayList<String>();
            for(Field f :fields){
                if(!li.contains(f.getName()))
                    strFields.add(f.getName());
            }
            for (int i = 0; i < strFields.size(); i++)
            {
                HSSFCell cell = row.createCell(i);
//              cell.setCellStyle(style2);
//              Field field = fields[i];
                String fieldName = strFields.get(i);
                String getMethodName = "get"
                        + fieldName.substring(0, 1).toUpperCase()
                        + fieldName.substring(1);
                try
                {
                    Class tCls = t.getClass();
                    Method getMethod = tCls.getMethod(getMethodName,
                            new Class[]
                            {});
                    Object value = getMethod.invoke(t, new Object[]
                    {});
                    String textValue =null;
                    // 判断值的类型后进行强制类型转换
                    if(value!=null){
                        if(value.toString().length()>=2)
                            if(value.toString().substring(0, 2).equals("0E"))
                                value = "0.00";
                        if (value instanceof Date)  
                        {   style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                            Date date = (Date) value;  
                            SimpleDateFormat sdf = new SimpleDateFormat(pattern);  
                            textValue = sdf.format(date);  
                        } 
                        else
                            textValue = value.toString();
                    }
                    //利用正则表达式判断textValue是否全部由数字组成
                    if (textValue != null)
                    {
                        Pattern p = Pattern.compile("^//d+(//.//d+)?$");
                        Matcher matcher = p.matcher(textValue);
                        if (matcher.matches())
                        {
                            style1.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
                            // 是数字当作double处理
                            cell.setCellStyle(style1);
                            cell.setCellValue(Double.parseDouble(textValue));
                        }
                        else
                        {
                            HSSFRichTextString richString = new HSSFRichTextString(
                                    textValue);
                            
//                          font3.setColor(HSSFColor.BLUE.index);
                            style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                            richString.applyFont(font3);
                            cell.setCellStyle(style1);
                            cell.setCellValue(richString);
                        }
                    }
                }
                catch (SecurityException e)
                {
                    e.printStackTrace();
                }
                catch (NoSuchMethodException e)
                {
                    e.printStackTrace();
                }
                catch (IllegalArgumentException e)
                {
                    e.printStackTrace();
                }
                catch (IllegalAccessException e)
                {
                    e.printStackTrace();
                }
                catch (InvocationTargetException e)
                {
                    e.printStackTrace();
                }
                
            }
        }
        try
        {
            workbook.write(out);
            workbook.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    
//  private Field[] delNotExpStr(Field[] fields , String[] notExpStr){
//      if(notExpStr==null)
//          return fields;
//      else{
//          
//          return null;
//      }
//          
//  }

}

原文地址: