您的位置:首页 > 编程语言 > Java开发

基于POI的Excel表格数据导出

2017-03-17 21:18 344 查看
首先来个自我介绍,16届毕业,现就业一家电力行业公司。工作也差不多半年了,尝试一下写博客,看看能不能为我们伟大的Java贡献点绵薄之力。。好吧,有点心虚。

好了,进入主题。去公司的第一个任务就是导出页面数据。。之前也没做过啊,这啥子?懵逼脸。赶紧百度。。有了,用POI啊!nice,看了一遍,小case啦,搞个包调几个方法就OK啦。简单说就像种树嘛,挖坑,种树,挖坑,种树;一个个挖一颗颗填就完了,只是一颗树占一行。

好,那我们就开始种树。jar包:

poi-3.12.jar

poi-examples-3.12.jar

poi-excelant-3.12.jar

poi-ooxml-schemas-3.12.jar

poi-ooxml-3.12.jar

poi-scratchpad-3.12.jar

简单示例:

package cn.lbb.entity;

import java.io.Serializable;

/**
 * 简单JavaBean。
 * @author LOGOD
 *
 */
public class Tree implements Serializable{
    
    private static final long serialVersionUID = 1L;
    
    private String id;
    private String name;
    private String type;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }

    public Tree() {}

    public Tree(String id, String name, String type) {
        super();
        this.id = id;
        this.name = name;
        this.type = type;
    }
    
}


我就先简单的导出来吧,不写工具类其他的了,之后会写一个导出树的,有兴趣可以去瞅瞅。

package cn.lbb.main;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JOptionPane;

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 cn.lbb.entity.Tree;

public class ExcelTableDemo {
    
    /**
     * 转化器:将满足JavaBean规范的对象封装的数据转化到一个有序列表中
     * @param bean JavaBean
     * @return    列表
     */
    public static List<String> bean2List(Serializable bean) {
        List<String> beanList = new ArrayList<String>();
        if (bean != null) {
            Class<? extends Serializable> beanClass = bean.getClass();
            Field[] beanFields = beanClass.getDeclaredFields();
            Field.setAccessible(beanFields, true);    //强暴一把
            for (Field beanField : beanFields) {
                String fieldName = beanField.getName();
                if ("serialVersionUID".equals(fieldName)) {
                    continue;
                }
                try {
                    Method beanMethod = beanClass.getMethod(
                            "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));
                    String value = (String) beanMethod.invoke(bean);
                    beanList.add(value);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return beanList;
    }
    
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        //我们要种一堆树,分两堆
        List<Tree> trees1 = new ArrayList<Tree>();
        List<Tree> trees2 = new ArrayList<Tree>();
        for (int i = 0; i < 100; i++) {
            trees1.add(new Tree(String.valueOf(i), "我是A的树" + i, "类型" + i));
            trees2.add(new Tree(String.valueOf(i), "我是B的树" + i, "类型" + i));
        }
        //开始干活
        HSSFWorkbook wb = new HSSFWorkbook();        //创建工作簿对象,这相当于一个要种树的公园
        HSSFSheet sheetA = wb.createSheet("区域A");    //创建Excel中的页签对象,看作公园左边的区域
        HSSFSheet sheetB = wb.createSheet("区域B");    //创建Excel中的新的页签对象,看作公园右边的区域
        /* 页签可以有多个,我只是打个比句,你也可以把公园划分为ABCD等等个区域 */
        //从A区域开始种tree1的树
        //创建一个单元个的样式对象,由工作簿创建,可以作用整个工作簿
        HSSFCellStyle style = wb.createCellStyle();
        /* 设置样式:我这里简单设置一下好了 */
        //样式字体居中
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        /* 创建一种字体对象,由工作簿创建,可以作用整个工作簿,需放在样式中,才能作用于单元格 */
        HSSFFont font = wb.createFont();
        font.setFontName("宋体");    //设置字体样式
        style.setFont(font);
        /* 开始创建单元格 */
        for (int i = 0; i < trees1.size(); i++) {
            List<String> treeList = bean2List(trees1.get(i));    //将tree对象的数据转化到列表
            HSSFRow row = sheetA.createRow(i);    //创建行
            for (int j = 0; j < treeList.size(); j++) {
                HSSFCell cell = row.createCell(j); //创建列
                cell.setCellStyle(style);           //设置这个单元个的样式
                cell.setCellValue(treeList.get(j));//赋值
            }
        }
        
        /* 同理区域B */
        //可以设置另一种样式,注意:需操作另一个对象,否则后面的设置会覆盖前面的设置
        HSSFCellStyle style2 = wb.createCellStyle();
        style2.setAlignment(HSSFCellStyle.ALIGN_LEFT);
        HSSFFont font2 = wb.createFont();
        font2.setFontName("雅黑");    //设置字体样式
        style2.setFont(font2);
        /* 开始创建单元格 */
        for (int i = 0; i < trees2.size(); i++) {
            List<String> treeList = bean2List(trees2.get(i));    //将tree对象的数据转化到列表
            HSSFRow row = sheetB.createRow(i);    //创建行
            for (int j = 0; j < treeList.size(); j++) {
                HSSFCell cell = row.createCell(j); //创建列
                cell.setCellStyle(style2);           //设置这个单元个的样式
                cell.setCellValue(treeList.get(j));//赋值
            }
        }
        
        /* OK到这里就可以导出了 */
        try {
            //默认导出到D盘下
            FileOutputStream out = new FileOutputStream("D://Demo.xls");
            wb.write(out);    //写入输出流
            out.close();
            JOptionPane.showMessageDialog(null, "导出成功!");
        } catch (FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, "导出失败!");
            e.printStackTrace();
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "导出失败!");
            e.printStackTrace();
        }
    }
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java poi excel 导出表格