jExcel 学习

如果在你的项目中需要解析 Excel 文件,比如,作为用户上传的模板进行解析。那么选择 jExcel 将是一个不错的决定!虽然 Apache 的 Commons 开源组件包 POI 也能完成相同的功能,但 jExcel 小巧、对中文支持更好!噢,这就足够了!不是吗?我将 jExcel 的主要功能封装成 8 个文件,分别如下。

(1) IExcelWorkbook.java 文件。

import java.util.List;
import java.util.Map;

/**
* IExcelWorkbook 表示只读的 Excel 工作簿。<br>
* flysoft company.<br>
* @author Dingli.<br>
* Jun 15, 2008 12:37:31 AM
*/
public interface IExcelWorkbook
{
/**
* 获取一行单元格的内容。
* @param sheetName 工作表名称。
* @param rowIndex 基于0的行索引。
* @return 单元格的内容。
*/
public Object[] getWorksheetRow(String sheetName, int rowIndex);

/**
* 获取一行单元格的内容。
* @param sheetIndex 基于0的工作表索引。
* @param rowIndex 基于0的行索引。
* @return 单元格的内容。
*/
public Object[] getWorksheetRow(int sheetIndex, int rowIndex);

/**
* 访问全部工作表内容。
* @param excelCellVisitNotify Excel 工作表单元格访问通知接口。
*/
public void visitWorksheets(IExcelCellVisitNotify excelCellVisitNotify);

/**
* 访问指定的工作表内容。
* @param sheetName 工作表名称。
* @param excelCellVisitNotify Excel 工作表单元格访问通知接口。
*/
public void visitWorksheet(String sheetName, IExcelCellVisitNotify excelCellVisitNotify);

/**
* 访问指定的工作表内容。
* @param sheetIndex 基于0的工作表索引。
* @param excelCellVisitNotify Excel 工作表单元格访问通知接口。
*/
public void visitWorksheet(int sheetIndex, IExcelCellVisitNotify excelCellVisitNotify);

/**
* 获取全部工作表内容。
* @return 保存有全部工作表内容的 Map 对象。Map 的 key 为工作表的名称,value 为 List 对象。
*/
public Map getWorksheets();

/**
* 获取工作表内容。
* @param sheetName 工作表名称。
* @return 工作表内容。
*/
public List getWorksheet(String sheetName);

/**
* 获取工作表内容。
* @param sheetIndex 基于0的工作表索引。
* @return 工作表内容。
*/
public List getWorksheet(int sheetIndex);

/**
* 关闭工作簿。
* @throws Exception Exception 异常。
*/
public void closeWorkbook() throws Exception;
}

(2) IExcelWritableWorkbook.java 文件

import java.util.List;

/**
* IExcelWritableWorkbook 表示可写的 Excel 工作簿。<br>
* flysoft company.<br>
* @author Dingli.<br>
* Jun 14, 2008 1:00:36 PM
*/
public interface IExcelWritableWorkbook extends IExcelWorkbook
{
/**
* 建立工作簿。
* @param fileName 文件路径。
* @throws Exception Exception 异常。
*/
public void createWorkbook(String fileName) throws Exception;

/**
* 建立工作表。要确保在 finally 块使用 closeWorkbook() 方法关闭工作簿,否则工作簿内容将在异常发生时丢失。
* @param sheetName 工作表名称。
* @param sheetIndex 基于0的工作表索引。
* @param list 工作表内容。List 中的每个元素表示一行,以对象数组表示。
* @throws Exception Exception 异常。
*/
public void createWorksheet(String sheetName, int sheetIndex, List list) throws Exception;

/**
* 删除工作表。
* @param sheetIndex 基于0的工作表索引。
*/
public void removeWorksheet(int sheetIndex);
}

(3) IExcelFactory.java 文件。

import java.io.InputStream;

/**
* Excel 工作簿构建工厂。<br>
* flysoft company.<br>
* @author Dingli.<br>
* Jun 15, 2008 12:33:33 AM
*/
public interface IExcelFactory
{
/**
* 打开一个只读的 Excel 工作簿并返回。
* @param fileName 文件路径。
* @return 一个只读的 Excel 工作簿。
* @throws Exception Exception 异常。
*/
public IExcelWorkbook openExcelWorkbook(String fileName) throws Exception;

/**
* 打开一个只读的 Excel 工作簿并返回。
* @param inputStream 基本输入流。
* @return 一个只读的 Excel 工作簿。
* @throws Exception Exception 异常。
*/
public IExcelWorkbook openExcelWorkbook(InputStream inputStream) throws Exception;

/**
* 建立一个可写的 Excel 工作簿并返回。
* @return 一个可写的 Excel 工作簿。
*/
public IExcelWritableWorkbook createExcelWritableWorkbook();

/**
* 建立一个可写的 Excel 工作簿并返回。
* @param fileName 文件路径。
* @return 一个可写的 Excel 工作簿。
* @throws Exception Exception 异常。
*/
public IExcelWritableWorkbook createExcelWritableWorkbook(String fileName) throws Exception;

/**
* 打开一个可写的 Excel 工作簿并返回。
* @param fileName 文件路径。
* @return 一个可写的 Excel 工作簿。
* @throws Exception Exception 异常。
*/
public IExcelWritableWorkbook openExcelWritableWorkbook(String fileName) throws Exception;
}

(4) IExcelCellVisitNotify.java 文件。

/**
* Excel 工作表单元格访问通知接口。<br>
* flysoft company.<br>
* @author Dingli.<br>
* Jun 7, 2008 1:05:18 PM
*/
public interface IExcelCellVisitNotify
{
/**
* 实现此方法用于访问到每一个单元格时给与通知。
* @param sheetName 当前访问的工作表名称。
* @param rowIndex 当前访问的基于0的工作表行。
* @param columnIndex 当前访问的基于0的工作表列。
* @param cellContent 当前访问单元格内容。
*/
public void cellVisit(String sheetName, int rowIndex, int columnIndex, Object cellContent);
}

(5) ExcelWritableWorkbook.java 文件。

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jxl.Cell;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**
* ExcelWritableWorkbook 表示可写的 Excel 工作簿。<br>
* flysoft company.<br>
* @author Dingli.<br>
* Jun 14, 2008 1:01:10 PM
*/
class ExcelWritableWorkbook implements IExcelWritableWorkbook
{
//Excel 工作簿对象。
private WritableWorkbook writableWorkbook = null;

/**
* ExcelWritableWorkbook 的默认构造方法。
*/
public ExcelWritableWorkbook()
{}

/**
* 建立工作簿。
* @param fileName 文件路径。
* @throws Exception Exception 异常。
*/
public ExcelWritableWorkbook(String fileName) throws Exception
{
this.createWorkbook(fileName);
}

/**
* 打开工作簿。要确保在 finally 块使用 closeWorkbook() 方法关闭工作簿,否则工作簿内容将在异常发生时丢失。
* @param fileName 文件路径。
* @return ExcelWorkbook 对象。
* @throws Exception Exception 异常。
*/
public static ExcelWritableWorkbook openWorkbook(String fileName) throws Exception
{
ExcelWritableWorkbook excelWritableWorkbook = new ExcelWritableWorkbook();
excelWritableWorkbook.writableWorkbook = Workbook.createWorkbook(new File(fileName));//, Workbook.getWorkbook(new File(fileName)));
return excelWritableWorkbook;
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#createWorkbook(java.lang.String)
*/
public void createWorkbook(String fileName) throws Exception
{
this.writableWorkbook = Workbook.createWorkbook(new File(fileName));
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#createWorksheet(java.lang.String, int, java.util.List)
*/
public void createWorksheet(String sheetName, int sheetIndex, List list) throws Exception
{
if(this.writableWorkbook != null)
{
WritableSheet writableSheet = this.writableWorkbook.createSheet(sheetName, sheetIndex);
for(int i = 0; i < list.size(); i++)
{
Object[] row = (Object[])list.get(i);
for(int j = 0; j < row.length; j++)
{
Label label = new Label(j, i, row[j].toString());
writableSheet.addCell(label);
}
}
}
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#getWorksheetRow(java.lang.String, int)
*/
public Object[] getWorksheetRow(String sheetName, int rowIndex)
{
return this.getWorksheetRow(rowIndex, sheetName);
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#getWorksheetRow(int, int)
*/
public Object[] getWorksheetRow(int sheetIndex, int rowIndex)
{
return this.getWorksheetRow(rowIndex, Integer.valueOf(sheetIndex));
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#visitWorksheets(com.flysoft.dozen.support.jxl.IExcelCellVisitNotify)
*/
public void visitWorksheets(IExcelCellVisitNotify excelCellVisitNotify)
{
if(this.writableWorkbook != null)
{
String[] sheetNames = this.writableWorkbook.getSheetNames();
for(int i = 0; i < sheetNames.length; i++)
{
this.getWorksheet(sheetNames[i], excelCellVisitNotify);
}
}
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#visitWorksheet(java.lang.String, com.flysoft.dozen.support.jxl.IExcelCellVisitNotify)
*/
public void visitWorksheet(String sheetName, IExcelCellVisitNotify excelCellVisitNotify)
{
this.getWorksheet(sheetName, excelCellVisitNotify);
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#visitWorksheet(int, com.flysoft.dozen.support.jxl.IExcelCellVisitNotify)
*/
public void visitWorksheet(int sheetIndex, IExcelCellVisitNotify excelCellVisitNotify)
{
this.getWorksheet(Integer.valueOf(sheetIndex), excelCellVisitNotify);
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#getWorksheets()
*/
public Map getWorksheets()
{
Map map = null;
if(this.writableWorkbook != null)
{
String[] sheetNames = this.writableWorkbook.getSheetNames();
map = new HashMap(sheetNames.length);
for(int i = 0; i < sheetNames.length; i++)
{
map.put(sheetNames[i], this.getWorksheet(sheetNames[i], null));
}
}
return map;
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#getWorksheet(java.lang.String)
*/
public List getWorksheet(String sheetName)
{
return this.getWorksheet(sheetName, null);
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#getWorksheet(int)
*/
public List getWorksheet(int sheetIndex)
{
return this.getWorksheet(Integer.valueOf(sheetIndex), null);
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#removeWorksheet(int)
*/
public void removeWorksheet(int sheetIndex)
{
if(this.writableWorkbook != null)
{
this.writableWorkbook.removeSheet(sheetIndex);
}
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelWritableWorkbook#closeWorkbook()
*/
public void closeWorkbook() throws Exception
{
if(this.writableWorkbook != null)
{
if(this.writableWorkbook.getSheetNames().length != 0)
{
this.writableWorkbook.write();
this.writableWorkbook.close();
}
else
{
throw new IllegalStateException("Excel workbook must one sheet at least");
}
}
else
{
throw new NullPointerException("Excel workbook is not available");
}
}

/**
* 获取工作表。
* @param target 工作表名称或基于0的工作表索引。
* @return 工作表。
*/
private WritableSheet getWritableSheet(Object target)
{
return (target instanceof Integer)? this.writableWorkbook.getSheet(Integer.parseInt(target.toString())): this.writableWorkbook.getSheet(target.toString());
}

/**
* 获取工作表指定行的内容。要确保在 finally 块使用 closeWorkbook() 方法关闭工作簿,否则工作簿内容将在异常发生时丢失。
* @param index 基于0的行索引。
* @param target 工作表名称或基于0的工作表索引。
* @return 工作表指定行的内容。
*/
private Object[] getWorksheetRow(int index, Object target)
{
Object[] column = null;
if(this.writableWorkbook != null)
{
column = this.getCellContentToArray(this.getWritableSheet(target).getRow(index));
}
return column;
}

/**
* 获取指定工作表的内容。
* @param target 工作表名称或基于0的工作表索引。
* @param excelCellVisitNotify 工作表单元格访问通知接口。
* @return 以线性表形式返回的工作表内容。
*/
private List getWorksheet(Object target, IExcelCellVisitNotify excelCellVisitNotify)
{
List list = null;
if(this.writableWorkbook != null)
{
WritableSheet writableSheet = this.getWritableSheet(target);
list = new ArrayList(writableSheet.getRows());
if(excelCellVisitNotify == null)
{
this.addCellContentToList(list, writableSheet);
}
else
{
this.cellContentVisit(writableSheet, excelCellVisitNotify);
}
}
return list;
}

/**
* 以线性表形式获取全部单元格行的内容。
* @param list 要保存的线性表。
* @param writableSheet 工作表。
*/
private void addCellContentToList(List list, WritableSheet writableSheet)
{
for(int i = 0; i < writableSheet.getRows(); i++)
{
list.add(this.getCellContentToArray(writableSheet.getRow(i)));
}
}

/**
* 以数组形式获取一行单元格的内容。
* @param cell 单元格对象数组。
* @return 数组形式表示的一行单元格内容。
*/
private Object[] getCellContentToArray(Cell[] cell)
{
Object[] column = new Object[cell.length];
for(int j = 0; j < column.length; j++)
{
column[j] = cell[j].getContents();
}
return column;
}

/**
* 单元格内容访问。
* @param writableSheet 工作表。
* @param excelCellVisitNotify 单元格内容访问通知接口。
*/
private void cellContentVisit(WritableSheet writableSheet, IExcelCellVisitNotify excelCellVisitNotify)
{
for(int i = 0; i < writableSheet.getRows(); i++)
{
Cell[] cell = writableSheet.getRow(i);
for(int j = 0; j < cell.length; j++)
{
excelCellVisitNotify.cellVisit(writableSheet.getName(), i, j, cell[j].getContents());
}
}
}
}

(6) ExcelWorkbook.java 文件。

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

/**
* ExcelWorkbook 表示只读的 Excel 工作簿。<br>
* flysoft company.<br>
* @author Dingli.<br>
* Jun 7, 2008 3:35:21 PM
*/
class ExcelWorkbook implements IExcelWorkbook
{
//Excel 工作簿对象。
private Workbook workbook = null;

/**
* ExcelWorkbook 的默认构造方法。
*/
public ExcelWorkbook()
{}

/**
* 打开工作簿。
* @param inputStream 输入流对象。
* @return ExcelWorkbook 对象。
* @throws Exception Exception 异常。
*/
public static ExcelWorkbook openWorkbook(InputStream inputStream) throws Exception
{
ExcelWorkbook excelWorkbook = new ExcelWorkbook();
excelWorkbook.workbook = Workbook.getWorkbook(inputStream);
return excelWorkbook;
}

/**
* 打开工作簿。
* @param fileName 文件路径。
* @return ExcelWorkbook 对象。
* @throws Exception Exception 异常。
*/
public static ExcelWorkbook openWorkbook(String fileName) throws Exception
{
ExcelWorkbook excelWorkbook = new ExcelWorkbook();
excelWorkbook.workbook = Workbook.getWorkbook(new File(fileName));
return excelWorkbook;
}

/**
* 获取一行单元格的内容。
* @param sheetName 工作表名称。
* @param rowIndex 基于0的行索引。
* @return 单元格的内容。
*/
public Object[] getWorksheetRow(String sheetName, int rowIndex)
{
return this.getWorksheetRow(rowIndex, sheetName);
}

/**
* 获取一行单元格的内容。
* @param sheetIndex 基于0的工作表索引。
* @param rowIndex 基于0的行索引。
* @return 单元格的内容。
*/
public Object[] getWorksheetRow(int sheetIndex, int rowIndex)
{
return this.getWorksheetRow(rowIndex, Integer.valueOf(sheetIndex));
}

/**
* 访问全部工作表内容。
* @param excelCellVisitNotify Excel 工作表单元格访问通知接口。
*/
public void visitWorksheets(IExcelCellVisitNotify excelCellVisitNotify)
{
if(this.workbook != null)
{
String[] sheetNames = this.workbook.getSheetNames();
for(int i = 0; i < sheetNames.length; i++)
{
this.getWorksheet(sheetNames[i], excelCellVisitNotify);
}
}
}

/**
* 访问指定的工作表内容。
* @param sheetName 工作表名称。
* @param excelCellVisitNotify Excel 工作表单元格访问通知接口。
*/
public void visitWorksheet(String sheetName, IExcelCellVisitNotify excelCellVisitNotify)
{
this.getWorksheet(sheetName, excelCellVisitNotify);
}

/**
* 访问指定的工作表内容。
* @param sheetIndex 基于0的工作表索引。
* @param excelCellVisitNotify Excel 工作表单元格访问通知接口。
*/
public void visitWorksheet(int sheetIndex, IExcelCellVisitNotify excelCellVisitNotify)
{
this.getWorksheet(Integer.valueOf(sheetIndex), excelCellVisitNotify);
}

/**
* 获取全部工作表内容。
* @return 保存有全部工作表内容的 Map 对象。Map 的 key 为工作表的名称,value 为 List 对象。
*/
public Map getWorksheets()
{
Map map = null;
if(this.workbook != null)
{
String[] sheetNames = this.workbook.getSheetNames();
map = new HashMap(sheetNames.length);
for(int i = 0; i < sheetNames.length; i++)
{
map.put(sheetNames[i], this.getWorksheet(sheetNames[i], null));
}
}
return map;
}

/**
* 获取工作表内容。
* @param sheetName 工作表名称。
* @return 工作表内容。
*/
public List getWorksheet(String sheetName)
{
return this.getWorksheet(sheetName, null);
}

/**
* 获取工作表内容。
* @param sheetIndex 基于0的工作表索引。
* @return 工作表内容。
*/
public List getWorksheet(int sheetIndex)
{
return this.getWorksheet(Integer.valueOf(sheetIndex), null);
}

/**
* 关闭工作簿。
* @throws Exception Exception 异常。
*/
public void closeWorkbook() throws Exception
{
if(this.workbook != null)
{
this.workbook.close();
}
else
{
throw new NullPointerException("Excel workbook is not available");
}
}

/**
* 获取工作表。
* @param target 工作表名称或基于0的工作表索引。
* @return 工作表。
*/
private Sheet getSheet(Object target)
{
return (target instanceof Integer)? this.workbook.getSheet(Integer.parseInt(target.toString())): this.workbook.getSheet(target.toString());
}

/**
* 获取工作表指定行的内容。要确保在 finally 块使用 closeWorkbook() 方法关闭工作簿,否则工作簿内容将在异常发生时丢失。
* @param index 基于0的行索引。
* @param target 工作表名称或基于0的工作表索引。
* @return 工作表指定行的内容。
*/
private Object[] getWorksheetRow(int index, Object target)
{
Object[] column = null;
if(this.workbook != null)
{
column = this.getCellContentToArray(this.getSheet(target).getRow(index));
}
return column;
}

/**
* 获取指定工作表的内容。
* @param target 工作表名称或基于0的工作表索引。
* @param excelCellVisitNotify 工作表单元格访问通知接口。
* @return 以线性表形式返回的工作表内容。
*/
private List getWorksheet(Object target, IExcelCellVisitNotify excelCellVisitNotify)
{
List list = null;
if(this.workbook != null)
{
Sheet sheet = this.getSheet(target);
list = new ArrayList(sheet.getRows());
if(excelCellVisitNotify == null)
{
this.addCellContentToList(list, sheet);
}
else
{
this.cellContentVisit(sheet, excelCellVisitNotify);
}
}
return list;
}

/**
* 以线性表形式获取全部单元格行的内容。
* @param list 要保存的线性表。
* @param sheet 工作表。
*/
private void addCellContentToList(List list, Sheet sheet)
{
for(int i = 0; i < sheet.getRows(); i++)
{
list.add(this.getCellContentToArray(sheet.getRow(i)));
}
}

/**
* 以数组形式获取一行单元格的内容。
* @param cell 单元格对象数组。
* @return 数组形式表示的一行单元格内容。
*/
private Object[] getCellContentToArray(Cell[] cell)
{
Object[] column = new Object[cell.length];
for(int j = 0; j < column.length; j++)
{
column[j] = cell[j].getContents();
}
return column;
}

/**
* 单元格内容访问。
* @param sheet 工作表。
* @param excelCellVisitNotify 单元格内容访问通知接口。
*/
private void cellContentVisit(Sheet sheet, IExcelCellVisitNotify excelCellVisitNotify)
{
for(int i = 0; i < sheet.getRows(); i++)
{
Cell[] cell = sheet.getRow(i);
for(int j = 0; j < cell.length; j++)
{
excelCellVisitNotify.cellVisit(sheet.getName(), i, j, cell[j].getContents());
}
}
}
}

(7) ExcelFactory.java 文件。

import java.io.InputStream;

/**
* Excel 工作簿构建工厂。<br>
* flysoft company.<br>
* @author Dingli.<br>
* Jun 15, 2008 12:34:05 AM
*/
class ExcelFactory implements IExcelFactory
{
/**
* ExcelFactory 的私有构造方法。
*/
protected ExcelFactory()
{}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelFactory#openExcelWorkbook(java.io.InputStream)
*/
public IExcelWorkbook openExcelWorkbook(InputStream inputStream) throws Exception
{
return ExcelWorkbook.openWorkbook(inputStream);
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelFactory#openExcelWorkbook(java.lang.String)
*/
public IExcelWorkbook openExcelWorkbook(String fileName) throws Exception
{
return ExcelWorkbook.openWorkbook(fileName);
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelFactory#createExcelWritableWorkbook()
*/
public IExcelWritableWorkbook createExcelWritableWorkbook()
{
return new ExcelWritableWorkbook();
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelFactory#createExcelWritableWorkbook(java.lang.String)
*/
public IExcelWritableWorkbook createExcelWritableWorkbook(String fileName) throws Exception
{
return new ExcelWritableWorkbook(fileName);
}

/*
* (non-Javadoc)
* @see com.flysoft.dozen.support.jxl.IExcelFactory#openExcelWritableWorkbook(java.lang.String)
*/
public IExcelWritableWorkbook openExcelWritableWorkbook(String fileName) throws Exception
{
return ExcelWritableWorkbook.openWorkbook(fileName);
}
}

(8) ExcelFactoryDirector.java 文件。

/**
* ExcelFactoryDirector 用来获取 Excel 构建工厂。<br>
* flysoft company.<br>
* @author Dingli.<br>
* Jun 14, 2008 12:21:12 PM
*/
public class ExcelFactoryDirector
{
//Excel 构建工厂。
private static IExcelFactory excelFactory = null;

/**
* ExcelFactoryDirector 的私有构造方法。
*/
private ExcelFactoryDirector()
{
excelFactory = new ExcelFactory();
}

/**
* 获取 Excel 构建工厂。
* @return Excel 构建工厂。
*/
public synchronized static IExcelFactory getExcelFactory()
{
if(excelFactory == null)
{
excelFactory = new ExcelFactory();
}
return excelFactory;
}
}

单元测试就不在这里写了,但单元测试是必须的,它是保证代码质量的重要手段!将其忽略是不理智也是不可取的!写一个 main() 方法来简单说明如何使用。

public class MainTest
{
public static void main(String[] args)
{
//工作表内容。
List sheet = new ArrayList();
//添加一行单元格表。
sheet.add(new Object[]{"Microsoft", "Excel", "Good"});
//添加另一行单元格。
sheet.add(new Object[]{"Sun", "Java", "Best"});
//获取 Excel 构建工厂。
IExcelFactory excelFactory = ExcelFactoryDirector.getExcelFactory();
//可读写的 Excel 工作簿。
IExcelWritableWorkbook excelWritableWorkbook = null;
try
{
//在 E 盘建立可读写的 Excel 工作簿。
excelWritableWorkbook = excelFactory.createExcelWritableWorkbook("E:/testExcel.xls");
//建立一张工作表。
excelWritableWorkbook.createWorksheet("sheet1", 0, sheet);
//访问刚才建立的工作表的全部内容。
excelWritableWorkbook.visitWorksheet("sheet1", new IExcelCellVisitNotify()
{
public void cellVisit(String sheetName, int rowIndex, int columnIndex, Object cellContent)
{
System.out.println("Sheet Name: " + sheetName);
System.out.println("Row Index: " + (rowIndex + 1));
System.out.println("Column Index: " + (columnIndex + 1));
System.out.println("Cell Content: " + cellContent);
}
});
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
if(excelWritableWorkbook != null)
{
try
{
//必须在 finally 中安全的关闭工作簿。不然所有数据都会丢失。
excelWritableWorkbook.closeWorkbook();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
}
}

这些类中,ExcelWorkbook.java 与 ExcelWritableWorkbook.java 是最重要的实现类。它们完成了解析 Excel 文件的重要任务。事实上,这两个类只在同一个 java 包中可见,对于调用者来说是不可见的。调用都是通过接口中的方法完成的。注意一下,这些 java 类都使用了哪些模式?聪明的你肯定都知道,那就是抽象工厂模式、建造模式、访问者模式与单例模式。这些模式可真讨厌,无处不在。但有时这些“武功套路”还真能让你学到“独孤九剑”。另外,你可以在[url]http://sourceforge.net/[/url]上下载最新的 jExcel 包。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值