如果在你的项目中需要解析 Excel 文件,比如,作为用户上传的模板进行解析。那么选择
jExcel 将是一个不错的决定!虽然 Apache 的 Commons 开源组件包 POI 也能完成相同的功能,但
jExcel 小巧、对中文支持更好!噢,这就足够了!不是吗?我将
jExcel 的主要功能封装成 8 个文件,分别如下。
(1) IExcelWorkbook.java 文件。
(2) IExcelWritableWorkbook.java 文件
(3) IExcelFactory.java 文件。
(4) IExcelCellVisitNotify.java 文件。
(5) ExcelWritableWorkbook.java 文件。
(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;
- }
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);
- }
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;
- }
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);
- }
/**
* 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) </spa>