1、说明POIFS(POI File System)POIFS是POI项目中最早的最基础的一个模块,是Java到OLE 2 Compound Document Format的接口,支持读写功能,所有的其他项目都依赖与该项目。HSSF(Horrible Spreadsheet Format)HSSF是Java到Microsoft Excel 97(-2002)文件的接口,支持读写功能HWPF(Horrible Word Processing Format)HWPF是Java到Microsoft Word 97文件的接口,支持读写功能,但目前该模块还处于刚开始开发阶段,只能实现一些简单文件的操作,在后
2、续版本中,会提供更强大的支持HPSF(Horrible Property Set Format)HPSF 是Java到OLE 2 Compound Document Format文件的属性设置的接口,属性设置通常用来设置文档的属性(标题,作者,最后修改日期等),还可以设置用户定义的属性。HPSF支持读写功能,当前发布版本中直支持读功能。7.3.1 对Excel的处理类下面通过HSSF提供的接口对Excel文件经行处理。首先需要下载POI的包,可以到apache的官方网站下载,地址为:http:/apache.justdn.org/jakarta/poi/,本书采用的是poi-2.5.1-fin
3、al-20040804.jar,读者可以下载当前的稳定版本。把下载的包按照前面介绍的方式加入Build Path,然后新建一个ch7.poi包,并创建一个ExcelReader类。ExcelReader类可以读取一个XLS文件,然后将其内容逐行提取出来,写入文本文件。其代码如下。代码7.6public class ExcelReader / 创建文件输入流 private BufferedReader reader = null; / 文件类型 private String filetype; / 文件二进制输入流 private InputStream is = null; / 当前的She
4、et private int currSheet; / 当前位置 private int currPosition; / Sheet数量 private int numOfSheets; / HSSFWorkbook HSSFWorkbook workbook = null; / 设置Cell之间以空格分割 private static String EXCEL_LINE_DELIMITER = ; / 设置最大列数 private static int MAX_EXCEL_COLUMNS = 64; / 构造函数创建一个ExcelReader public ExcelReader(Strin
5、g inputfile) throws IOException, Exception / 判断参数是否为空或没有意义 if (inputfile = null | inputfile.trim().equals() throw new IOException(no input file specified); / 取得文件名的后缀名赋值给filetype this.filetype = inputfile.substring(inputfile.lastIndexOf(.) + 1); / 设置开始行为0 currPosition = 0; / 设置当前位置为0 currSheet = 0;
6、is = new FileInputStream(inputfile); / 判断文件格式 if (filetype.equalsIgnoreCase(txt / 如果是txt则直接创建BufferedReader读取 reader = new BufferedReader(new InputStreamReader(is);else if (filetype.equalsIgnoreCase(xls / 如果是Excel文件则创建HSSFWorkbook读取 workbook = new HSSFWorkbook(is); / 设置Sheet数 numOfSheets = workbook.
7、getNumberOfSheets();else throw new Exception(File Type Not Supported / 函数readLine读取文件的一行 public String readLine() throws IOException / 如果是txt文件则通过reader读取 String str = reader.readLine(); / 空行则略去,直接读取下一行 while (str.trim().equals( str = reader.readLine(); return str; / 如果是XLS文件则通过POI提供的API读取文件 else if
8、 (filetype.equalsIgnoreCase( / 根据currSheet值获得当前的sheet HSSFSheet sheet = workbook.getSheetAt(currSheet); / 判断当前行是否到但前Sheet的结尾 if (currPosition sheet.getLastRowNum() / 当前行位置清零 / 判断是否还有Sheet while (currSheet != numOfSheets - 1) / 得到下一张Sheet sheet = workbook.getSheetAt(currSheet + 1); / 当前行数是否已经到达文件末尾 i
9、f (currPosition = sheet.getLastRowNum() / 当前Sheet指向下一张Sheet currSheet+; continue; else / 获取当前行数 int row = currPosition; currPosition+; / 读取当前行数据 return getLine(sheet, row); return null; / 函数getLine返回Sheet的一行数据 private String getLine(HSSFSheet sheet, int row) / 根据行数取得Sheet的一行 HSSFRow rowline = sheet.
10、getRow(row); / 创建字符创缓冲区 StringBuffer buffer = new StringBuffer(); / 获取当前行的列数 int filledColumns = rowline.getLastCellNum(); HSSFCell cell = null; / 循环遍历所有列for (int i = 0; i filledColumns; i+) / 取得当前Cell cell = rowline.getCell(short) i); String cellvalue = null; if (cell != null) / 判断当前Cell的Type switch (cell.getCellType() / 如果当前Cell的Type为NUMERIC case HSSFCell.CELL_TYPE_NUMERIC: / 判断当前的cell是否为Date if (HSSFDateUtil.isCellDateFormatted(cell) / 如果是Date类型则,取得该Cell的Date值 Date date = cel