使用POI读取excel内容.doc_第1页
使用POI读取excel内容.doc_第2页
使用POI读取excel内容.doc_第3页
使用POI读取excel内容.doc_第4页
使用POI读取excel内容.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1.前言项目中要求读取excel文件内容,并将其转化为xml格式。常见读取excel文档一般使用POI和JExcelAPI这两个工具。这里我们介绍使用POI实现读取excel文档。2.代码实例:package edu.sjtu.erplab.poi;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.text.SimpleDateFormat;import java.util.Date;import java.util.HashMap;import java.util.Map;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFDateUtil;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;/* * 操作Excel表格的功能类 */public class ExcelReader private POIFSFileSystem fs; private HSSFWorkbook wb; private HSSFSheet sheet; private HSSFRow row; /* * 读取Excel表格表头的内容 * param InputStream * return String 表头内容的数组 */ public String readExcelTitle(InputStream is) try fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); catch (IOException e) e.printStackTrace(); sheet = wb.getSheetAt(0); row = sheet.getRow(0); / 标题总列数 int colNum = row.getPhysicalNumberOfCells(); System.out.println(colNum: + colNum); String title = new StringcolNum; for (int i = 0; i colNum; i+) /titlei = getStringCellValue(row.getCell(short) i); titlei = getCellFormatValue(row.getCell(short) i); return title; /* * 读取Excel数据内容 * param InputStream * return Map 包含单元格数据内容的Map对象 */ public Map readExcelContent(InputStream is) Map content = new HashMap(); String str = ; try fs = new POIFSFileSystem(is); wb = new HSSFWorkbook(fs); catch (IOException e) e.printStackTrace(); sheet = wb.getSheetAt(0); / 得到总行数 int rowNum = sheet.getLastRowNum(); row = sheet.getRow(0); int colNum = row.getPhysicalNumberOfCells(); / 正文内容应该从第二行开始,第一行为表头的标题 for (int i = 1; i = rowNum; i+) row = sheet.getRow(i); int j = 0; while (j colNum) / 每个单元格的数据内容用-分割开,以后需要时用String类的replace()方法还原数据 / 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean / str += getStringCellValue(row.getCell(short) j).trim() + / -; str += getCellFormatValue(row.getCell(short) j).trim() + ; j+; content.put(i, str); str = ; return content; /* * 获取单元格数据内容为字符串类型的数据 * * param cell Excel单元格 * return String 单元格数据内容 */ private String getStringCellValue(HSSFCell cell) String strCell = ; switch (cell.getCellType() case HSSFCell.CELL_TYPE_STRING: strCell = cell.getStringCellValue(); break; case HSSFCell.CELL_TYPE_NUMERIC: strCell = String.valueOf(cell.getNumericCellValue(); break; case HSSFCell.CELL_TYPE_BOOLEAN: strCell = String.valueOf(cell.getBooleanCellValue(); break; case HSSFCell.CELL_TYPE_BLANK: strCell = ; break; default: strCell = ; break; if (strCell.equals() | strCell = null) return ; if (cell = null) return ; return strCell; /* * 获取单元格数据内容为日期类型的数据 * * param cell * Excel单元格 * return String 单元格数据内容 */ private String getDateCellValue(HSSFCell cell) String result = ; try int cellType = cell.getCellType(); if (cellType = HSSFCell.CELL_TYPE_NUMERIC) Date date = cell.getDateCellValue(); result = (date.getYear() + 1900) + - + (date.getMonth() + 1) + - + date.getDate(); else if (cellType = HSSFCell.CELL_TYPE_STRING) String date = getStringCellValue(cell); result = date.replaceAll(年月, -).replace(日, ).trim(); else if (cellType = HSSFCell.CELL_TYPE_BLANK) result = ; catch (Exception e) System.out.println(日期格式不正确!); e.printStackTrace(); return result; /* * 根据HSSFCell类型设置数据 * param cell * return */ private String getCellFormatValue(HSSFCell cell) String cellvalue = ; if (cell != null) / 判断当前Cell的Type switch (cell.getCellType() / 如果当前Cell的Type为NUMERIC case HSSFCell.CELL_TYPE_NUMERIC: case HSSFCell.CELL_TYPE_FORMULA: / 判断当前的cell是否为Date if (HSSFDateUtil.isCellDateFormatted(cell) / 如果是Date类型则,转化为Data格式 /方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00 /cellvalue = cell.getDateCellValue().toLocaleString(); /方法2:这样子的data格式是不带带时分秒的:2011-10-12 Date date = cell.getDateCellValue(); SimpleDateFormat sdf = new SimpleDateFormat(yyyy-MM-dd); cellvalue = sdf.format(date); / 如果是纯数字 else / 取得当前Cell的数值 cellvalue = String.valueOf(cell.getNumericCellValue(); break; / 如果当前Cell的Type为STRIN case HSSFCell.CELL_TYPE_STRING: / 取得当前的Cell字符串 cellvalue = cell.getRichStringCellValue().getString(); break; / 默认的Cell值 default: cellvalue = ; else cellvalue = ; return cellvalue; public static void main(String args) try / 对读取Excel表格标题测试 InputStream is = new FileInputStream(d:test2.xls); ExcelReader excelReader = new ExcelReader(); String title = excelReader.readExcelTitle(is); System.out.println(获得Excel表格的标题:); for (String s : title) System.out.print(s + ); / 对读取Excel表格内容测试 InputStream is2 = new FileInputStream(d:test2.xls); Map map = excelReader.readExcelContent(is2); System.out.println(获得Excel表格的内容:); for (int i = 1; i = map.size(); i+) System.out.println(map.get(i); catch (FileNotFoundException e) System.out.println(未找到指定路径的文件!); e.printStackTrace(); 3.总结因为excel单元格中的内容往往都有一定的格式,比如日期型,数字型,字符串型,因此在读取的时候要进行格式判断,不然会出现错误。常见的就是不能正常读取日期。在代码实例中有一个方法:getCellFormatValue(HSSFCell cell)往这个方法中传入excel单元格就能识别单元格格式,并转化为正确的格式。ps:2012-2-23代码实例中有一段代码:int colNum = row.getPhysicalNumberOfCells();其中的HSSFRow.getPhysicalNumberOfCells();这个方法是用于获取一行中存在的单元格数,POI的官方API中有给出getPhysicalNumberOfCells方法的解释getPhysicalNumberOfCellspublic int getPhysicalNum

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论