最近项目中需要用到数据的导出与导入功能,我和我同事各负责一个, 我负责做导出这一块,比较简单。至于想看导入的同志们,我这里暂时是没有的,所以就不要浪费时间在这片文章上了。不过以后肯定会补上导入的功能。

鄙人看到一些博客上通过引用各种的util工具包,其实说白了还是利用apache的poi,在项目中直接导入poi包就可以。当然,你可以把代码都抽取出来成工具类,这里为了方便理解,就不抽取了,废话不多说。

1、首先准备一些poi的jar包,(这里就不多说了,需要的朋友可以在我的资源里寻找,等会我还会分享一下数据导出完整的源代码,里面也有jar包);

2、准备好jar包之后就可以写代码了,接下来我就把代码写简单,让大家都能看懂。至于你后面想用多么牛逼的代码实现它,都可以,只要原理懂了,其它的都不是事,对吧。
首先我要建一个实体类:Student.class

package testExport;

/**
 * 
 * @author zsl
 *
 */

public class Student {
    private Integer id;
    private String name;
    private String sex;
    public Student(Integer id, String name, String sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

这个不多说,接下来我还有一个类:ExportExcel.class

package testExport;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ExportExcel {
    public void Export(){
        // 声明一个工作薄
        HSSFWorkbook wb = new HSSFWorkbook();
        //声明一个单子并命名
        HSSFSheet sheet = wb.createSheet("学生表");
        //给单子名称一个长度
        sheet.setDefaultColumnWidth((short)15);
        // 生成一个样式  
        HSSFCellStyle style = wb.createCellStyle();
        //创建第一行(也可以称为表头)
        HSSFRow row = sheet.createRow(0);
        //样式字体居中
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //给表头第一行一次创建单元格
        HSSFCell cell = row.createCell((short) 0);
        cell.setCellValue("学生编号"); 
        cell.setCellStyle(style);
        cell = row.createCell( (short) 1);  
        cell.setCellValue("学生姓名");  
        cell.setCellStyle(style);  
        cell = row.createCell((short) 2);  
        cell.setCellValue("学生性别");  
        cell.setCellStyle(style);               
        //添加一些数据,这里先写死,大家可以换成自己的集合数据
        List<Student> list = new ArrayList<Student>();
        list.add(new Student(111,"张三","男"));
        list.add(new Student(111,"李四","男"));
        list.add(new Student(111,"王五","女"));

        //向单元格里填充数据
        for (short i = 0; i < list.size(); i++) {
            row = sheet.createRow(i + 1); 
            row.createCell(0).setCellValue(list.get(i)
                                .getId());                                                                                            
            row.createCell(1).setCellValue(list.get(i)
                                .getName());
            row.createCell(2).setCellValue(list.get(i)
                                .getSex());                                                                                                                                                                                                               
        }

        try {
            //默认导出到E盘下
            FileOutputStream out = new FileOutputStream("E://学生表.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();
        }
    }
}

ok,上面这样就结束了。大家可以测试下,只要把上面字体标红部分的数据改成自己的数据集合即可。
下面看一下效果图:

java用poi导出word文档 java poi excel导出_java用poi导出word文档

下面附上源码一份:
附件源码:
Java利用POI实现数据Excel导出实例源码

当然有什么疑问,大家共同交流,共同进步。

注意

这样就完成了。只要自己抽取出一个公用类,非常方便,简单。当然你不抽取也是可以的。虽然抽取的时候比较麻烦,但是以后做多个表格的导出就方便了,磨刀还是不误砍柴工的。

package com.tspt.util;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.swing.JOptionPane;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ExportExcelUtil<T> {
        public void export(
            String sheetName, 
            String[] headers, String[] columns, 
            List<T> lists, 
            HttpServletRequest request,
            HttpServletResponse response) throws Exception 
        {
            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFSheet sheet = wb.createSheet(sheetName);
            sheet.setDefaultColumnWidth(15);
            HSSFCellStyle style = wb.createCellStyle();

            HSSFRow row = sheet.createRow(0);
            style.setAlignment(HSSFCellStyle.ALIGN_LEFT);

            for (int i = 0; i < headers.length; i++) {
                HSSFCell headerCell = row.createCell(i);
                headerCell.setCellValue(headers[i]);
                headerCell.setCellStyle(style);
            }

            Iterator<T> it = lists.iterator();
            int rowIndex = 0;
            while (it.hasNext()) {
                rowIndex++;
                row = sheet.createRow(rowIndex);
                T t = it.next();
                Field[] fields = t.getClass()
                            .getDeclaredFields();

                for (int i = 0; i < fields.length; i++) {
                    Field field = fields[i];
                    String fieldName = field.getName();

                    for (int j = 0; j < columns.length; j++) {
                        if (fieldName.equals(columns[j])) {
                        String getMethodName = "get" + 
                            fieldName.substring(0, 1).
                            toUpperCase() + fieldName.
                            substring(1);
                        Class cls = t.getClass();

                        Method getMethod = cls.getMethod(
                            getMethodName, new Class[] {});
                        Object val = getMethod.invoke(
                            t, new Object[] {});
                        String textVal = null;
                        if (null != val) {
                            textVal = val.toString();
                        } else {
                            textVal = null;
                        }
                            row.createCell(j).
                                setCellValue(textVal);
                    }
                }
            }
        }

        //try {
            //默认导出到E盘下
            //FileOutputStream out = new FileOutputStream("E://学生表.xls");
            //wb.write(out);
            //out.close();
            //JOptionPane.showMessageDialog(null, "导出成功!");
        //} catch (Exception e) {
           //JOptionPane.showMessageDialog(null, "导出失败!");
        //e.printStackTrace();
        //}

        String filename = sheetName + ".xls";
        String filepath = request.getRealPath("/") + filename;
        FileOutputStream out = new FileOutputStream(filepath);
        wb.write(out);
        out.close();

        downloadExcel(filepath, response);
    }


    /**
     * 下载
     */
    public static void downloadExcel(String filepath, HttpServletResponse response)
            throws IOException {
        File file = new File(filepath);
        String fileName = file.getName();
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        response.addHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("GBK"), "ISO8859-1"));
        response.setCharacterEncoding("utf-8");
        InputStream fis = new BufferedInputStream(new FileInputStream(file));
        byte[] b = new byte[fis.available()];
        fis.read(b);
        response.getOutputStream().write(b);
        fis.close();
    }

}

首先一个随便创建任何一个实体类

package testExport;

/**
 * 
 * @author zsl
 *
 */

public class Student {
    private Integer id;
    private String name;
    private String sex;

    public Student(Integer id, String name, String sex) {
        this.id = id;
        this.name = name;
        this.sex = sex;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

下面就是调用了。
//导出学生表

public String exportUser(HttpServletRequest request,HttpServletResponse response) throws Exception{
    String sheetName = "student";   //导出的Excel名称
    String [] headers = {"编号","姓名","性别"};
    String [] columns = {"id","name","sex"};
    //添加一些数据,大家可以从数据库里读取
    /为了方便这里先写死,
    List<Student> list = new ArrayList<Student>();
    list.add(new Student(111,"张三","男"));
    list.add(new Student(111,"李四","男"));
    list.add(new Student(111,"王五","女"));
    ExportExcelUtil<Student> util = new ExportExcelUtil<Student>();
    util.export(sheetName,headers,columns,list,request,response);
}

注意:
1、这样就大功告成了,但是有些问题需要大家自己去解决,比如request 和response 在你们的项目里是怎么获取的;
因为这里把下载也包含了,所以程序里需要这两个参数,这里我就没有写;
如果大家想要简单测试一下,可以把request 和 response两个参数去掉,ExportExcelUtil类里面的注释放开,然后注释下面的代码注释掉就可以测试了;
3、需要导出哪些字段,只要在columns里对应该实体的字段即可;
4、该工具类适用于任何实体类的导出;
5、本人没有对字段类型进行判断,导出数据全部为字符串类型。(大家可以自己改进)
6、这种方式下载,不能用ajax调用导出,必须要使用window.location.href=”excel/export.do”

如果大家需求不同,可以自己在上面代码基础上再次进行封装优化。