文档章节

POI导出EXCEL

Romanceling
 Romanceling
发布于 2017/04/15 11:40
字数 777
阅读 11
收藏 0

package com.gsww.chis.util;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.Iterator;

import javax.servlet.http.HttpServletResponse;

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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;

/**
 * 有关Excel导出的方法
 * @author fengll
 *
 */
public class ExcelUtils<T> {
    /**
     * 导出excel的方法
     * @param <T> 实体类型
     * @param list 要导出的数据
     * @param response
     */
    public static <T> void exportExcel(Iterable<T> list,HttpServletResponse response,String []titles,String[] methods){
        //创建HSSFWorkbook对象  
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建HSSFSheet对象  
        HSSFSheet sheet = workbook.createSheet("sheet0"); 
        //设置列宽   
        sheet.setColumnWidth(0,15*256);//第0列,宽为8个字节
        sheet.setColumnWidth(1,15*256);
        sheet.setColumnWidth(2,15*256);
        sheet.setColumnWidth(3,15*256);
        sheet.setColumnWidth(4,20*256);
        sheet.setColumnWidth(5,20*256);
        sheet.setColumnWidth(6,15*256);
        sheet.setColumnWidth(7,15*256);
        sheet.setColumnWidth(8,25*256);
        sheet.setColumnWidth(9,30*256);
        
        //第一行合并单元格
        //CellRangeAddress craF=new CellRangeAddress(0, 0, 0,8); 
        //sheet.addMergedRegion(craF);
        
        //生成一个字体样式
        HSSFFont font = workbook.createFont();
        font.setBoldweight(Font.BOLDWEIGHT_BOLD);//加粗
        
        //生成一个cell样式
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(CellStyle.ALIGN_CENTER);//水平居中
        style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直居中
        style.setFont(font);
        
        //第二行样式
        HSSFCellStyle style2= workbook.createCellStyle();
        style2.setBorderTop(CellStyle.BORDER_THIN); //设置上边框
        style2.setBorderRight(CellStyle.BORDER_THIN); //设置右边框
        style2.setBorderBottom(CellStyle.BORDER_THIN); //设置下边框
        style2.setBorderLeft(CellStyle.BORDER_THIN); //设置左边框
        style2.setAlignment(CellStyle.ALIGN_CENTER); //设置居中
        style2.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直居中
        
        //第三行样式
        HSSFCellStyle style3 = workbook.createCellStyle();
        style3.setAlignment(CellStyle.ALIGN_CENTER);//水平居中
        style3.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直居中
        
        
        //第1行
        
        createExcelRow(sheet,style2,0,0,25*20,titles); 
        
        //从第二行开始往后顺延
        int i = 1;
        createExcelRowByIterator(sheet,style3,i,20*20,list,methods);
        
        //将excel输出到浏览器
        OutputExcelToBrowser("测试.xls", workbook, response);
    }
    
    /**
     * 根据迭代器创建excel行
     * @param <T>
     * @param sheet
     * @param style cell样式
     * @param rowIndex 行下标
     * @param height 行高
     * @param itAble 要导出的数据
     */
    public static <T> void createExcelRowByIterator(HSSFSheet sheet,HSSFCellStyle style,int rowIndex,int height,Iterable<T> itAble,String[] methods){
        try{
            Iterator<T> it = itAble.iterator();
            while(it.hasNext()){
                T t = it.next();
                Class tCls = t.getClass();
                Object[] values = new String[methods.length];
                for(int j = 0;j<methods.length;j++){
                    //获取方法
                    Method getMethod = tCls.getMethod(methods[j], new Class[] {});
                    //执行方法获取值
                    Object value = getMethod.invoke(t, new Object[] {});
                    if(value instanceof Double||value instanceof Long||value instanceof Integer){
                        value=value+"";
                    }
                    values[j] = value;
                }
                //创建行
                createExcelRow(sheet,style,rowIndex,0,20*20,values);
                rowIndex++;
            }
        }catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
    
    /**
     * 创建excel行
     * @param sheet
     * @param style cell样式
     * @param rowIndex 行下标
     * @param cellIndex cell下标
     * @param height 行高
     * @param obj 数据
     */
    public static void createExcelRow(HSSFSheet sheet,HSSFCellStyle style,int rowIndex,int cellIndex,int height,Object obj){
        HSSFRow rows = sheet.createRow(rowIndex);
        rows.setHeight((short)height);
        if(obj == null){
            createExcelCell(rows,style,cellIndex,"");
        }else if(obj instanceof String){
            createExcelCell(rows,style,cellIndex,obj);
        }else if(obj instanceof Object[]){
            Object[] arrays = (Object[])obj;
            for(int i=0;i<arrays.length;i++){
                createExcelCell(rows,style,i,arrays[i]);
            }
        }
    }
    
    /**
     * 创建每个excel格子
     * @param rows 行
     * @param style cell样式
     * @param cellIndex
     * @param cellValue
     */
    public static void createExcelCell(HSSFRow rows,HSSFCellStyle style,int cellIndex,Object cellValue){
        HSSFCell cell=rows.createCell(cellIndex); 
        cell.setCellStyle(style);
        if(cellValue == null){
            cell.setCellValue("");
        }else if(cellValue instanceof String){
            cell.setCellValue(cellValue.toString());
        }
    }
    
    /**
     * 将excel输出到浏览器的方法
     * @param fileName
     * @param workbook
     * @param response
     */
    public static void OutputExcelToBrowser(String fileName,HSSFWorkbook workbook,HttpServletResponse response){
        OutputStream os = null;
        try {
            response.setContentType("application/vnd.ms-excel; charset=utf-8");
            response.setHeader("Content-Disposition","attachment;filename="+ java.net.URLEncoder.encode(fileName, "UTF-8"));
            os = response.getOutputStream();
            workbook.write(os);
        }catch(IOException e){
            throw new RuntimeException(e);
        }finally{
            if(os!=null){
                try {
                    os.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

----------------------------------

controller部分

@RequestMapping(value="/uploadFile", method = RequestMethod.GET)
    public void  uploadFile(String jgdm,String timeBegin,String timeEnd,String fph,String name,String cardNumber,Integer pageSize, Integer pageNumber,HttpServletRequest request, HttpServletResponse response){
        List<YmMzGhfyxxVo> list=ymMzGhfyxxService.selectYwMzGhfp(jgdm, timeBegin, timeEnd, fph, name, cardNumber);
        PageListUtil<YmMzGhfyxxVo> pageListUtil = new PageListUtil<YmMzGhfyxxVo>(pageNumber, pageSize, list);
        String[] titles = {"挂号时间","费别","姓名","性别","出生日期","身份证号","类别","科室","医生","发票号","金额","卡号","凭证号","操作员","状态"};
        String[] methods = {"getCzsj","getFbmc","getXm","getXb","getCsrq","getSfzh","getJzlb","getKsmc","getYsmc","getFph","getZje","getKbh","getPzh","getCzrymc","getJlzt"};
        ExcelUtils.exportExcel(pageListUtil.getList(),response,titles,methods);
    }

© 著作权归作者所有

上一篇: POI导入EXCEL
Romanceling
粉丝 14
博文 166
码字总数 91809
作品 0
无锡
程序员
私信 提问

暂无文章

Java中print、printf、println的区别

printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行

hellation_
16分钟前
0
0
spring在静态类中注入bean的的解释

@Componentpublic class ModelMapper {@AutoWiredprivate static AssignmentManager assignmentManager;public static void add(){a+b;}} 静态方法是属于类的,普通方法才属于...

无知的小狼
17分钟前
1
0
分而治之-归并排序

如果有1个数组,数组的左半部分和右半部分都已经排好序,如何将该数组合成1个有序的数组? 开辟1个同样大小的临时空间辅助我们完成归并过程,如下图 k:表示归并过程中,当前需要替换的原数组...

万山红遍
31分钟前
1
0
Linux修改时区的正确方法【修改时间,需要修改软连接,靠谱】

CentOS和Ubuntu的时区文件是/etc/localtime,但是在CentOS7以后localtime以及变成了一个链接文件 [root@centos7 ~]# ll /etc/localtime lrwxrwxrwx 1 root root 33 Oct 12 11:01 /etc/loca......

Airship
今天
1
0
《Netkiller Spring Cloud 手札》之 Master / Slave 主从数据库数据源配置

5.19.1. Master / Slave 主从数据库数据源配置 5.19.1.1. application.properties spring.datasource.master.driverClassName = com.mysql.cj.jdbc.Driverspring.datasource.master.url=j......

netkiller-
今天
50
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部