读取excel到对象

来源:互联网 发布:炒外汇技术大数据 编辑:程序博客网 时间:2024/06/09 15:46

简单读取excel表格的工具类,网上下载,然后做了部分改动,本工具类只适合读取.xls结尾的excel,.xlsx结尾的excel不支持。readExcelContent方法返回map类型,key表示行号,value表示行内容。为保证单元格与对象属性完全匹配,没有数据的单元格设置为" &",最终的数据用split("&")分割,excel里有10个单元格就会分出10段数据。然后分别赋值给对象。 

需要poi包

/** * 操作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 String[colNum];for (int i = 0; i < colNum; i++) {// title[i] = getStringCellValue(row.getCell((short) i));title[i] = getCellFormatValue(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的属性中,此时需要新建一个javabean// str += getStringCellValue(row.getCell((short) j)).trim() +"-";// 为保证单元格与对象属性完全匹配,没有数据的单元格设置为" &",最终的数据用split("&")分割,excel里有10个单元格就会分出10段数据。 str += "".equals(getCellFormatValue(row.getCell((short) j)) .trim()) ? " &" : getCellFormatValue( 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的Typeswitch (cell.getCellType()) {// 如果当前Cell的Type为NUMERICcase HSSFCell.CELL_TYPE_NUMERIC:case HSSFCell.CELL_TYPE_FORMULA: {// 判断当前的cell是否为Dateif (HSSFDateUtil.isCellDateFormatted(cell)) {// 如果是Date类型则,转化为Data格式// 方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00// cellvalue = cell.getDateCellValue().toLocaleString();// 方法2:这样子的data格式是不带带时分秒的:2011-10-12Date date = cell.getDateCellValue();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");cellvalue = sdf.format(date);}// 如果是纯数字else {// 取得当前Cell的数值cellvalue = String.valueOf(cell.getNumericCellValue());}break;}// 如果当前Cell的Type为STRINcase HSSFCell.CELL_TYPE_STRING:// 取得当前的Cell字符串cellvalue = cell.getRichStringCellValue().getString();break;// 默认的Cell值default:cellvalue = " ";}} else {cellvalue = "";}return cellvalue;}}


原创粉丝点击