打造自己的读取Excel数据的工具类
在实际应用中经常需要把Excel表格数据导入到数据库,为此需求本人写了一个读取Excel数据的java类,现将代码贴出来与大家一起分享。
该类提供两个方法,一个方法用于读取Excel表格的表头,另一个方法用于读取Excel表格的内容。
(注:本类需要POI组件的支持,POI是apache组织下的一个开源组件,)
代码如下:
package org.hnylj.poi.util;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;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.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import org.apache.poi.poifs.filesystem.POIFSFileSystem;/** * 操作Excel表格的功能类 * @author:hnylj * @version 1.0 */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();String[] title = new String[colNum];for (int i=0; i<colNum; i++) {title[i] = getStringCellValue(row.getCell((short) i));}return title;}/** * 读取Excel数据内容 * @param InputStream * @return Map 包含单元格数据内容的Map对象 */public Map<Integer,String> readExcelContent(InputStream is) {Map<Integer,String> content = new HashMap<Integer,String>();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的属性中,此时需要新建一个javabeanstr += getStringCellValue(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;}public static void main(String[] args) {try {//对读取Excel表格标题测试InputStream is = new FileInputStream("C:\\Excel表格测试.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("C:\\Excel表格测试.xls");Map<Integer,String> 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();}}}通过该类提供的方法就能读取出Excel表格中的数据,数据读取出来了,其他的,对这些数据进行怎样的操作,要靠你另外写程序去实现,因为该类只提供读取Excel表格数据的功能。
?
说明:在该类中有一个getStringCellValue(HSSFCell cell)方法和一个getDateCellValue(HSSFCell cell)方法,前一个方法用于读取那些为字符串类型的数据,如果你的Excel表格中填写的是日期类型的数据,则你应该在readExcelContent(InputStream is)方法里调用getDateCellValue(HSSFCell cell)方法,因为若调用getStringCellValue(HSSFCell cell)方法读取日期类型的数据将得到的是一个浮点数,这很可能不符合实际要求。
?
break;