最近的项目需要使用大量的Excel表,策划把数据都做成Excel表,通过编辑器把Excel表的数据导入到数据库,编辑器提供各种编辑操作,还要提供将数据库导出成Excel表的功能。借助于Java Excel API,这个问题就很简单了。


一:史上最简单的方法

  对于简单的表格(纯文本),其实可以不借助Java Excel API而有更简单的方法!用制表符/t隔开每个域,用换行符/n隔开每一行,将文件后缀名改为”.xls”搞定!只是这样弄出来的Excel表无法指定格式(如颜色,边框,对齐方式等等)。


二:Java Excel API

  Java Excel是一个开源项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件等,在项目中需要导入名为jxl.jar的包。在这里只是示例它的基本用法,其他高级的功能(图片、公式、格式等)请参考JavaExcel的帮助文档,这里是关于它的资料:http://jexcelapi.sourceforge.net/

  如有一个用户资料的Excel表,包含ID、用户名、性别、邮件等信息,定义一个用户JavaBean:

package com.monitor1394.excel;

/**
 * 用户
 * @author monitor
 * Created on 2010-12-22, 9:57:58
 */
public class User {
    /**
     * ID
     */
    private int id;
    /**
     * 用户名
     */
    private String name;
    /**
     * 性别 1:男 2:女
     */
    private int sex;
    /**
     * 邮件
     */
    private String email;

    public User() {
    }

    public User(int id, String name, int sex, String email) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getSex() {
        return sex;
    }

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

    @Override
    public String toString() {
        return id + ":" + name;
    }
}

  提供的Excel表操作类如下,某些单元格的格式可按自己意愿指定:

package com.monitor1394.excel;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

/**
 * Excel表操作
 *
 * @author monitor
 * Created on 2010-12-22, 9:50:28
 */
public class Excel {
    /**
     * 标题单元格格式
     */
    private static WritableCellFormat titleFormat = null;
    /**
     * 主题内容单元格格式
     */
    private static WritableCellFormat bodyFormat = null;
    /**
     * 注释单元格格式
     */
    private static WritableCellFormat noteFormat = null;
    /**
     * 浮点型数据的单元格格式
     */
    private static WritableCellFormat floatFormat = null;
    /**
     * 整型数据的单元格格式
     */
    private static WritableCellFormat intFormat = null;
    /**
     * 初始化数据
     */
    private static boolean init = false;

    /**
     * 私有构造方法,防止错误使用Excel类
     */
    private Excel() {
    }

    /**
     * 初始化各单元格格式
     *
     * @throws WriteException 初始化失败
     */
    private static void init() throws WriteException {
        WritableFont font1, font2, font3, font4;
        //Arial字体,9号,粗体,单元格黄色,田字边框,居中对齐  
        font1 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.BOLD, false);
        titleFormat = new WritableCellFormat(font1);
        titleFormat.setBackground(Colour.YELLOW);
        titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
        titleFormat.setAlignment(Alignment.CENTRE);
        //Arial字体,9号,粗体,单元格黄色,田字边框,左右居中对齐,垂直居中对齐,自动换行  
        font2 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.BOLD, false);
        noteFormat = new WritableCellFormat(font2);
        noteFormat.setBackground(Colour.YELLOW);
        noteFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
        noteFormat.setAlignment(Alignment.CENTRE);
        noteFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
        noteFormat.setWrap(true);
        //Arial字体,9号,非粗体,单元格淡绿色,田字边框  
        font3 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false);
        bodyFormat = new WritableCellFormat(font3);
        bodyFormat.setBackground(Colour.LIGHT_GREEN);
        bodyFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
        //Arial字体,9号,非粗体,单元格淡绿色,田字边框  
        font4 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false);
        floatFormat = new WritableCellFormat(font4, NumberFormats.FLOAT);
        floatFormat.setBackground(Colour.LIGHT_GREEN);
        floatFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
        //Arial字体,9号,非粗体,单元格淡绿色,田字边框  
        font4 = new WritableFont(WritableFont.ARIAL, 9, WritableFont.NO_BOLD, false);
        intFormat = new WritableCellFormat(font4, NumberFormats.INTEGER);
        intFormat.setBackground(Colour.LIGHT_GREEN);
        intFormat.setBorder(Border.ALL, BorderLineStyle.THIN);

        init = true;
    }

    public static void createUserExcelFile(List<User> userList, File destFile) throws WriteException, IOException {
        if (init == false) init();
        int index, row;
        WritableSheet sheet = null;
        WritableWorkbook book = null;
        book = Workbook.createWorkbook(destFile);
        sheet = book.createSheet("用户表", 0);
        sheet.setColumnView(0, 15);
        sheet.setColumnView(1, 15);
        sheet.setColumnView(2, 15);
        sheet.setColumnView(3, 40);
        //字段变量名  
        index = 0;
        sheet.addCell(new Label(index++, 0, "id", titleFormat));
        sheet.addCell(new Label(index++, 0, "name", titleFormat));
        sheet.addCell(new Label(index++, 0, "sex", titleFormat));
        sheet.addCell(new Label(index++, 0, "email", titleFormat));
        //字段名  
        index = 0;
        sheet.addCell(new Label(index++, 1, "ID", titleFormat));
        sheet.addCell(new Label(index++, 1, "用户名", titleFormat));
        sheet.addCell(new Label(index++, 1, "性别", titleFormat));
        sheet.addCell(new Label(index++, 1, "邮件", titleFormat));
        //字段注释  
        index = 0;
        sheet.addCell(new Label(index++, 2, null, noteFormat));
        sheet.addCell(new Label(index++, 2, null, noteFormat));
        sheet.addCell(new Label(index++, 2, "1:男/n2:女", noteFormat));
        sheet.addCell(new Label(index++, 2, null, noteFormat));
        row = 3;
        for (User user : userList) {
            if (user == null) continue;
            index = 0;
            sheet.addCell(new Number(index++, row, user.getId(), bodyFormat));
            sheet.addCell(new Label(index++, row, user.getName(), bodyFormat));
            sheet.addCell(new Number(index++, row, user.getSex(), bodyFormat));
            sheet.addCell(new Label(index++, row, user.getEmail(), bodyFormat));
            row++;
        }
        book.write();
        if (book != null) book.close();
    }

    public static List<User> readUserExcelFile(File file) throws IOException, BiffException {
        if (file == null) return null;
        int row, column;
        String temp = null;
        Workbook book = null;
        Sheet sheet = null;
        List<User> userList = new ArrayList<User>();
        book = Workbook.getWorkbook(file);
        sheet = book.getSheet(0);
        row = 3;
        while (row < sheet.getRows()) {
            column = 0;
            User user = new User();
            //id  
            temp = sheet.getCell(column++, row).getContents().trim();
            if (temp != null && !temp.equals("") && temp.matches("//d+")) user.setId(Integer.parseInt(temp));
            else break;
            //名称  
            temp = sheet.getCell(column++, row).getContents().trim();
            if (temp != null && !temp.equals("")) user.setName(temp);
            //性别  
            temp = sheet.getCell(column++, row).getContents().trim();
            if (temp != null && !temp.equals("") && temp.matches("//d+")) user.setSex(Integer.parseInt(temp));
            //邮件  
            temp = sheet.getCell(column++, row).getContents().trim();
            if (temp != null && !temp.equals("")) user.setEmail(temp);

            userList.add(user);
            row++;
        }
        if (book != null) book.close();
        return userList;
    }
}

要导入的Excel表格式如下:

Java将表数据导出为word表格 java将数据导出excel_User


导出后的Excel表如下:

Java将表数据导出为word表格 java将数据导出excel_List_02