注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

欢迎来到三件事的空间

欢迎登陆 javacs.cn

 
 
 

日志

 
 

Java操作Excel  

2010-09-14 11:35:56|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 在做企业的应用当中,经常会涉及到对Excel文件的操作,特别是对于中国电信、政府或其他行业的应用系统当中,用户不习惯于在页面上做数据的录入,而他们更喜欢的操作方式就是在Excel文件当中操作,之后,将Excel导入到系统里面。
    现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI。个人推荐使用JExcelAPI。
    JExcelAPI的官方网址是:http:// jexcelapi.sourceforge.net
      目前最新的版本是2.6.6。
    第一,JExcelAPI的安装
    安装比较简单,只需要将下载的压缩包解压,然后进入解压缩目录,找到jxl.jar,将其加到工程的classpath即可。
    第二,使用JExcelAPI的读取Excel文件:
程序代码 程序代码
package zizz;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;


/**
*
* 使用JExcelAPI读取Excel文件
* @author ZIZZ.
* @version Create Date: 2007-12-3 下午02:33:45.
*/

public class ExcelReader {
    
    private static final String FILE_NAME = "c:/工程教师名册print.xls";
    
    public static void main(String[] args){
        ExcelReader reader = new ExcelReader();
        try {
            //获取导入文件的输入流
            InputStream is = new FileInputStream(ExcelReader.FILE_NAME);
            //解析Excel文件
            reader.readExcel(is);
            //关闭输入流
            is.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 读取Excel文件
     * @param is
     */

    public void readExcel(InputStream is){
        try {
            //得到Excel工作薄
            Workbook book = Workbook.getWorkbook(is);
            //得到工作表
            Sheet sheet = book.getSheet(0);
            //得到工作表的列数
            int columns = sheet.getColumns();
            //得到工作表的行数
            int rows = sheet.getRows();
            //读取工作表内容
            for(int row=0;row<rows;row++){
                for(int col=0;col<columns;col++){
                    //得到单元格数据,第一个参数表示列,第二个参数表示行
                    Cell cell = sheet.getCell(col,row);
                    //得到单元格的内容
                    System.out.print(cell.getContents() + "\t");
                }
                System.out.println();
            }            
            //关闭工作簿
            book.close();
        } catch (BiffException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


      第三,使用JExcelAPI将数据导出为Excel文件:
      我们将从数据库里面读取ZIZZ_USER表,并将数据里的数据导出到Excel文件当中。
    首先,我们先创建一个数据库表的一个映射模型
    
程序代码 程序代码
package zizz;

import java.util.Date;

/**
*
* User模型对象,该对像对应着数据库ZIZZ_USER表当中的一行数据.
* @author ZIZZ.
* @version Create Date: 2007-12-3 下午03:08:24.
*/

public class User {
    /**
     * 映射为表的ID列
     */

    private String id;
    
    /**
     * 映射为表的NAME列
     */

    private String name;
    
    /**
     * 映射为表的LOGINID列
     */

    private String loginId;
    
    /**
     * 映射为表的PASSWORD列
     */

    private String password;
    
    /**
     * 映射为表的BIRTHDAY列
     */

    private Date birthday;
    
    /**
     * 映射为表的Create_TIME列
     */

    private Date createTime;

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getId() {
        return id;
    }

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

    public String getLoginId() {
        return loginId;
    }

    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }    

}


      接着,我们需要读取表的数据并将数据写到Excel文件当中,注意,读取数据库是使用JDBC技术,需要将Mysql的JDBC DRIVER加到工程的CLASSPATH当中。
程序代码 程序代码
package zizz;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.DateTime;
import jxl.write.WritableCell;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import jxl.write.DateFormat;
import jxl.write.WritableCellFormat;

/**
*
* 该类实现了对Excel的操作.
* @author ZIZZ.
* @version Create Date: 2007-12-3 下午03:09:21.
*/

public class ExcelWriter {
    
    private static final String DRVIER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost:3306/hibernate";
    private static final String USER = "root";
    private static final String PASSWORD = "admin";
    
    private static final String EXPORT_FILE_NAME = "c:/用户信息.xls";
    
    static{
        try {
            Class.forName(DRVIER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args){
        ExcelWriter writer = new ExcelWriter();
        List users = writer.queryUser();
        writer.exportToExcel(users);        
    }
    
    /**
     * 得到数据库连接.
     * @return 数据库连接
     */

    private Connection getConnection(){
        Connection result = null;
        try {
            result = DriverManager.getConnection(URL,USER,PASSWORD);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;
    }
    
    /**
     * 查询用户表.
     * @return 所有用户集合
     */

    private List queryUser(){
        List<User> result = new ArrayList<User>();
        Connection conn = this.getConnection();
        Statement stmt = null;
        ResultSet rs = null;
        try {
            stmt = conn.createStatement();
            rs = stmt.executeQuery("Select * FROM ZIZZ_USER");
            while(rs.next()){
                User user = new User();
                user.setId(rs.getString("ID"));
                user.setName(rs.getString("NAME"));
                user.setLoginId(rs.getString("LOGINID"));
                user.setPassword(rs.getString("PASSWORD"));
                user.setBirthday(rs.getTimestamp("BIRTHDAY"));
                user.setCreateTime(rs.getTimestamp("Create_TIME"));
                result.add(user);
            }    
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally{
            try{
                if(rs != null)rs.close();
                if(stmt != null)stmt.close();
                if(conn != null)conn.close();
            }catch(SQLException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }
    
    /**
     * 导出到Excel文件当中.
     * @param users
     */

    private void exportToExcel(List users){
        OutputStream os = null;
        try {
            //得到导出文件的输出流
            os = new FileOutputStream(EXPORT_FILE_NAME);
            //得到可写的Excel工作薄
            WritableWorkbook workbook = Workbook.createWorkbook(os);
            //创建一张新的工作表,工作表表名为用户数据,工作表为最大的65535行
            WritableSheet sheet = workbook.createSheet("sheet1", 0/65534);
            //填充表头数据
            String[] heads = new String[]{"编号","姓名","登录号","密码","生日","建立时间"};
            for(int col=0;col<heads.length;col++){
                //WritableCell有多种实现,包括Blank, Boolean, jxl.write.biff.CellValue, DateTime, Formula, Label, Number
                WritableCell cell = new Label(col,0,heads[col]);
                sheet.addCell(cell);
            }
            //设置时间的显示格式,显示格式为年-月-日,假如需要加上小时,分钟可以加上HH:mm:ss等
            DateFormat dateFormat = new DateFormat("yyyy-MM-dd");
            WritableCellFormat cellDateFormat = new WritableCellFormat(dateFormat);
            //jxl还提供共了比较数字的格式化,单元格的格式化等等功能,非常好用,用法很类似
            //填充表格数据
            if(users != null){
                Iterator iter = users.iterator();
                int row = 1;
                while(iter.hasNext()){
                    User user = (User)iter.next();
                    //设置单元格数据
                    //WritableCell有多种实现,包括Blank, Boolean, jxl.write.biff.CellValue, DateTime, Formula, Label, Number
                    //创建ID的单元格
                    WritableCell idCell = new Label(0,row,user.getId());
                    //创建名字的单元格
                    WritableCell nameCell = new Label(1,row,user.getName());
                    //创建登录号的单元格
                    WritableCell loginIdCell = new Label(2,row,user.getLoginId());
                    //创建密码的单元格
                    WritableCell passwordCell = new Label(3,row,user.getPassword());
                    //创建生日的单元格
                    WritableCell birthdayCell = new DateTime(4,row,user.getBirthday(),cellDateFormat);
                    //创建用户建立时间的单元格
                    WritableCell createTimeCell = new DateTime(5,row,user.getCreateTime(),cellDateFormat);
                    //将单元格加入到工作表
                    sheet.addCell(idCell);
                    sheet.addCell(nameCell);
                    sheet.addCell(loginIdCell);
                    sheet.addCell(passwordCell);
                    sheet.addCell(birthdayCell);
                    sheet.addCell(createTimeCell);
                    row++;
                }
            }        
            //将表格数据写入磁盘
            workbook.write();
            //关闭相应的资源
            workbook.close();
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (RowsExceededException e) {
            e.printStackTrace();
        } catch (WriteException e) {
            e.printStackTrace();
        }
        
    }
}


导出的Excel文件内容如下:
  评论这张
 
阅读(126)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017