立即注册
 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广州大学城网业务调整

[Java/JSP] java如何读取excel数据 [复制链接] qrcode

查看: 1733 | 回复: 0

大法师的 该用户已被删除
发表于: 2012-11-20 16:01:22 | 显示全部楼层

  项目中用户需要导入大量Excel表格数据到数据库,为此需求自己写了一个读取Excel数据的java类,现将代码贴出来与大家一起分享。
  该类提供两个方法,一个方法用于读取Excel表格的表头,另一个方法用于读取Excel表格的内容。
  (注:本类需要POI组件的支持,POI是apache组织下的一个开源组件,)
  代码如下:
  Java代码
  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
  title = getStringCellValue(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
  //每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
  //也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
  str += 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 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();
  }
  }
  }
  Java代码
  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
  title = getStringCellValue(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
  //每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
  //也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
  str += 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 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();
  }
  }
  }
  view plaincopy to clipboardprint?
  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
  title = getStringCellValue(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
  //每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
  //也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
  str += 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 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();
  }
  }
  }
  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
  title = getStringCellValue(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
  //每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
  //也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
  str += 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 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)方法读取日期类型的数据将得到的是一个浮点数,这很可能不符合实际要求。
  QQ 744437114
  疯狂软件官网:www.fkjava.org
  疯狂java视频 android视频:http://www.fkjava.org/video.html
跳转到指定楼层
快速回复 返回顶部 返回列表