JavaWeb POI导出EXCEL经典实现_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3779 | 回复: 0   主题: JavaWeb POI导出EXCEL经典实现        上一篇   下一篇 
ke.li
注册用户
等级:上士
经验:283
发帖:12
精华:0
注册:1970-1-1
状态:离线
发送短消息息给ke.li 加好友    发送短消息息给ke.li 发消息
发表于: IP:您无权察看 2016-4-20 10:39:52 | [全部帖] [楼主帖] 楼主

JAVAWEB POI导出EXCEL经典实现

在web开发中,有一个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作。而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下。(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^)

        呵呵,首先我们来导出EXCEL格式的文件吧。现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI。这里我们用Apache POI!我们先去Apache的大本营下载POI的jar包:http://poi.apache.org/ ,我这里使用的是3.0.2版本。

        将3个jar包导入到classpath下,写一个导出Excel的实用类(所谓实用,是指基本不用怎么修改就可以在实际项目中直接使用的!)。我一直强调做类也好,做方法也好,一定要通用性和灵活性强。

Student.java

import java.util.Date;   

   

public class Student   

{   

    private long id;   

    private String name;   

    private int age;   

    private boolean sex;   

    private Date birthday;   

   

    public Student()   

    {   

    }   

   

    public Student(long id, String name, int age, boolean sex, Date birthday)   

    {   

        this.id = id;   

        this.name = name;   

        this.age = age;   

        this.sex = sex;   

        this.birthday = birthday;   

    }   

   

    public long getId()   

    {   

        return id;   

    }   

   

    public void setId(long id)   

    {   

        this.id = id;   

    }   

   

    public String getName()   

    {   

        return name;   

    }   

   

    public void setName(String name)   

    {   

        this.name = name;   

    }   

   

    public int getAge()   

    {   

        return age;   

    }   

   

    public void setAge(int age)   

    {   

        this.age = age;   

    }   

   

    public boolean getSex()   

    {   

        return sex;   

    }   

   

    public void setSex(boolean sex)   

    {   

        this.sex = sex;   

    }   

   

    public Date getBirthday()   

    {   

        return birthday;   

    }   

   

    public void setBirthday(Date birthday)   

    {   

        this.birthday = birthday;   

    }   

   

}   


Book.java 

public class Book   

{   

    private int bookId;   

    private String name;   

    private String author;   

    private float price;   

    private String isbn;   

    private String pubName;   

    private byte[] preface;   

   

    public Book()   

    {   

    }   

   

    public Book(int bookId, String name, String author, float price,   

            String isbn, String pubName, byte[] preface)   

    {   

        this.bookId = bookId;   

        this.name = name;   

        this.author = author;   

        this.price = price;   

        this.isbn = isbn;   

        this.pubName = pubName;   

        this.preface = preface;   

    }   

   

    public int getBookId()   

    {   

        return bookId;   

    }   

   

    public void setBookId(int bookId)   

    {   

        this.bookId = bookId;   

    }   

   

    public String getName()   

    {   

        return name;   

    }   

   

    public void setName(String name)   

    {   

        this.name = name;   

    }   

   

    public String getAuthor()   

    {   

        return author;   

    }   

   

    public void setAuthor(String author)   

    {   

        this.author = author;   

    }   

   

    public float getPrice()   

    {   

        return price;   

    }   

   

    public void setPrice(float price)   

    {   

        this.price = price;   

    }   

   

    public String getIsbn()   

    {   

        return isbn;   

    }   

   

    public void setIsbn(String isbn)   

    {   

        this.isbn = isbn;   

    }   

   

    public String getPubName()   

    {   

        return pubName;   

    }   

   

    public void setPubName(String pubName)   

    {   

        this.pubName = pubName;   

    }   

   

    public byte[] getPreface()   

    {   

        return preface;   

    }   

   

    public void setPreface(byte[] preface)   

    {   

        this.preface = preface;   

    }   

}   


上面这两个类一目了然,就是两个简单的javabean风格的类。再看下面真正的重点类:

ExportExcel.java

import java.io.BufferedInputStream;   

import java.io.FileInputStream;   

import java.io.FileNotFoundException;   

import java.io.FileOutputStream;   

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 javax.swing.JOptionPane;   

   

import org.apache.poi.hssf.usermodel.HSSFCell;   

import org.apache.poi.hssf.usermodel.HSSFCellStyle;   

import org.apache.poi.hssf.usermodel.HSSFClientAnchor;   

import org.apache.poi.hssf.usermodel.HSSFComment;   

import org.apache.poi.hssf.usermodel.HSSFFont;   

import org.apache.poi.hssf.usermodel.HSSFPatriarch;   

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;   

   

  

public class ExportExcel< T>   

{   

    public void exportExcel(Collection< T> dataset, OutputStream out)   

    {   

        exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");   

    }   

   

    public void exportExcel(String[] headers, Collection< T> dataset,   

            OutputStream out)   

    {   

        exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");   

    }   

   

    public void exportExcel(String[] headers, Collection< T> dataset,   

            OutputStream out, String pattern)   

    {   

        exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);   

    }   

   

      

    @SuppressWarnings("unchecked")   

    public void exportExcel(String title, String[] headers,   

            Collection< T> dataset, OutputStream out, String pattern)   

    {   

        // 声明一个工作薄   

        HSSFWorkbook workbook = new HSSFWorkbook();   

        // 生成一个表格   

        HSSFSheet sheet = workbook.createSheet(title);   

        // 设置表格默认列宽度为15个字节   

        sheet.setDefaultColumnWidth((short) 15);   

        // 生成一个样式   

        HSSFCellStyle style = workbook.createCellStyle();   

        // 设置这些样式   

        style.setFillForegroundColor(HSSFColor.SKY_BLUE.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 style2 = workbook.createCellStyle();   

        style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);   

        style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);   

        style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);   

        style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);   

        style2.setBorderRight(HSSFCellStyle.BORDER_THIN);   

        style2.setBorderTop(HSSFCellStyle.BORDER_THIN);   

        style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);   

        style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);   

        // 生成另一个字体   

        HSSFFont font2 = workbook.createFont();   

        font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);   

        // 把字体应用到当前的样式   

        style2.setFont(font2);   

   

        // 声明一个画图的顶级管理器   

        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();   

        // 定义注释的大小和位置,详见文档   

        HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,   

                0, 0, 0, (short) 4, 2, (short) 6, 5));   

        // 设置注释内容   

        comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));   

        // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.   

        comment.setAuthor("leno");   

   

        // 产生表格标题行   

        HSSFRow row = sheet.createRow(0);   

        for (short 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;   

        while (it.hasNext())   

        {   

            index++;   

            row = sheet.createRow(index);   

            T t = (T) it.next();   

            // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值   

            Field[] fields = t.getClass().getDeclaredFields();   

            for (short i = 0; i <  fields.length; i++)   

            {   

                HSSFCell cell = row.createCell(i);   

                cell.setCellStyle(style2);   

                Field field = fields[i];   

                String fieldName = field.getName();   

                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 instanceof Integer) {   

                    // int intValue = (Integer) value;   

                    // cell.setCellValue(intValue);   

                    // } else if (value instanceof Float) {   

                    // float fValue = (Float) value;   

                    // textValue = new HSSFRichTextString(   

                    // String.valueOf(fValue));   

                    // cell.setCellValue(textValue);   

                    // } else if (value instanceof Double) {   

                    // double dValue = (Double) value;   

                    // textValue = new HSSFRichTextString(   

                    // String.valueOf(dValue));   

                    // cell.setCellValue(textValue);   

                    // } else if (value instanceof Long) {   

                    // long longValue = (Long) value;   

                    // cell.setCellValue(longValue);   

                    // }   

                    if (value instanceof Boolean)   

                    {   

                        boolean bValue = (Boolean) value;   

                        textValue = "男";   

                        if (!bValue)   

                        {   

                            textValue = "女";   

                        }   

                    }   

                    else if (value instanceof Date)   

                    {   

                        Date date = (Date) value;   

                        SimpleDateFormat sdf = new SimpleDateFormat(pattern);   

                        textValue = sdf.format(date);   

                    }   

                    else if (value instanceof byte[])   

                    {   

                        // 有图片时,设置行高为60px;   

                        row.setHeightInPoints(60);   

                        // 设置图片所在列宽度为80px,注意这里单位的一个换算   

                        sheet.setColumnWidth(i, (short) (35.7 * 80));   

                        // sheet.autoSizeColumn(i);   

                        byte[] bsValue = (byte[]) value;   

                        HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,   

                                1023, 255, (short) 6, index, (short) 6, index);   

                        anchor.setAnchorType(2);   

                        patriarch.createPicture(anchor, workbook.addPicture(   

                                bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));   

                    }   

                    else   

                    {   

                        // 其它数据类型都当作字符串简单处理   

                        textValue = value.toString();   

                    }   

                    // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成   

                    if (textValue != null)   

                    {   

                        Pattern p = Pattern.compile("^//d+(//.//d+)?$");   

                        Matcher matcher = p.matcher(textValue);   

                        if (matcher.matches())   

                        {   

                            // 是数字当作double处理   

                            cell.setCellValue(Double.parseDouble(textValue));   

                        }   

                        else   

                        {   

                            HSSFRichTextString richString = new HSSFRichTextString(   

                                    textValue);   

                            HSSFFont font3 = workbook.createFont();   

                            font3.setColor(HSSFColor.BLUE.index);   

                            richString.applyFont(font3);   

                            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();   

                }   

                finally   

                {   

                    // 清理资源   

                }   

            }   

        }   

        try   

        {   

            workbook.write(out);   

        }   

        catch (IOException e)   

        {   

            e.printStackTrace();   

        }   

    }   

   

    public static void main(String[] args)   

    {   

        // 测试学生   

        ExportExcel< Student> ex = new ExportExcel< Student>();   

        String[] headers =   

        { "学号", "姓名", "年龄", "性别", "出生日期" };   

        List< Student> dataset = new ArrayList< Student>();   

        dataset.add(new Student(10000001, "张三", 20, true, new Date()));   

        dataset.add(new Student(20000002, "李四", 24, false, new Date()));   

        dataset.add(new Student(30000003, "王五", 22, true, new Date()));   

        // 测试图书   

        ExportExcel< Book> ex2 = new ExportExcel< Book>();   

        String[] headers2 =   

        { "图书编号", "图书名称", "图书作者", "图书价格", "图书ISBN", "图书出版社", "封面图片" };   

        List< Book> dataset2 = new ArrayList< Book>();   

        try   

        {   

            BufferedInputStream bis = new BufferedInputStream(   

                    new FileInputStream("V://book.bmp"));   

            byte[] buf = new byte[bis.available()];   

            while ((bis.read(buf)) != -1)   

            {   

                //   

            }   

            dataset2.add(new Book(1, "jsp", "leno", 300.33f, "1234567",   

                    "清华出版社", buf));   

            dataset2.add(new Book(2, "java编程思想", "brucl", 300.33f, "1234567",   

                    "阳光出版社", buf));   

            dataset2.add(new Book(3, "DOM艺术", "lenotang", 300.33f, "1234567",   

                    "清华出版社", buf));   

            dataset2.add(new Book(4, "c++经典", "leno", 400.33f, "1234567",   

                    "清华出版社", buf));   

            dataset2.add(new Book(5, "c#入门", "leno", 300.33f, "1234567",   

                    "汤春秀出版社", buf));   

   

            OutputStream out = new FileOutputStream("E://a.xls");   

            OutputStream out2 = new FileOutputStream("E://b.xls");   

            ex.exportExcel(headers, dataset, out);   

            ex2.exportExcel(headers2, dataset2, out2);   

            out.close();   

            JOptionPane.showMessageDialog(null, "导出成功!");   

            System.out.println("excel导出成功!");   

        }   

        catch (FileNotFoundException e)   

        {   

            e.printStackTrace();   

        }   

        catch (IOException e)   

        {   

            e.printStackTrace();   

        }   

    }   

}   


        写完之后,如果您不是用eclipse工具生成的Servlet,千万别忘了在web.xml上注册这个Servelt。而且同样的,拷贝一张小巧的图书图片命名为book.jpg放置到当前WEB根目录的/WEB-INF/下。部署好web工程,用浏览器访问Servlet看下效果吧!是不是下载成功了。呵呵,您可以将下载到本地的excel报表用打印机打印出来,这样您就大功告成了。完事了我们就思考:我们发现,我们做的方法,不管是本地调用,还是在WEB服务器端用Servlet调用;不管是输出学生列表,还是图书列表信息,代码都几乎一样,而且这些数据我们很容器结合后台的DAO操作数据库动态获取。





赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论