package cn.com.css.common.util;

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;

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] = 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 colNum1 = row.getPhysicalNumberOfCells(); // 获取有数据的列的个数

  int colNum = 15;

  // 正文内容应该从第二行開始,第一行为表头的标题

  for (int i = 1; i <= rowNum; i++) {

   row = sheet.getRow(i);

   int j = 0;

while (j < colNum) {

    String cell = getCellFormatValue(row.getCell((short) j)).trim();

    if (cell == "") {

     j++;

     continue;

    }

    str += cell + " ";

    j++;

   }

   str.trim();

   // System.out.println(str);

   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: {

    cellvalue = String.valueOf(cell.getNumericCellValue());

    break;

   }

   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;

}

}

ExcelReader(解析Excel的工具类)的更多相关文章

  1. Excel导入工具类兼容xls和xlsx

    package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import or ...

  2. 基于jdk1.7实现的excel导出工具类

    通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...

  3. excel读取 工具类

    package cn.yongche.utils; import java.io.File; import java.io.FileInputStream; import java.io.IOExce ...

  4. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  5. EXCEL导出工具类及调用

    一.Excel导出工具类代码 package com.qiyuan.util; import java.io.OutputStream; import java.io.UnsupportedEncod ...

  6. 下载数据到Excel,工具类

    使用反射将model数据下载到Excel中 package test.upload.utils; import java.lang.reflect.Method; import java.math.B ...

  7. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  8. 使用Apache poi来编写导出excel的工具类

    在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...

  9. 使用POI做的一个生成Excel的工具类。包含了导出Excel和解析Excel方法

    PoiExcelUtils.java /** * */ package com.common.office; import java.io.File; import java.io.FileInput ...

随机推荐

  1. bzoj2660: [Beijing wc2012]最多的方案

    题目链接 bzoj2660: [Beijing wc2012]最多的方案 题解 对于一个数的斐波那契数列分解,他的最少项分解是唯一的 我们在拆分成的相临两项之间分解后者,这样形成的方案是最优且不重的 ...

  2. MySQL主从复制(Replication)(MySQL数据同步)配置

    MySQL是开源的关系型数据库系统.复制(Replication)是从一台MySQL数据库服务器(主服务器master)复制数据到另一个服务器(从服务器slave)的一个进程. 配置主服务器(mast ...

  3. 【洛谷】2474:[SCOI2008]天平【差分约束系统】

    P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...

  4. bzoj 3473 后缀自动机多字符串的子串处理方法

    后缀自动机处理多字符串字串相关问题. 首先,和后缀数组一样,用分割符连接各字符串,然后建一个后缀自动机. 我们定义一个节点代表的字符串为它原本代表的所有串去除包含分割符后的串.每个节点代表的字符串的数 ...

  5. 20172319 2018.04.11 《Java程序设计教程》第7周课堂测验(补写博客)

    20172319 2018.04.11 <Java程序设计教程>第7周课堂测验 课程:<程序设计与数据结构> 班级:1723 学生:唐才铭 学号:20172319 指导老师:王 ...

  6. python数据库操作——sqlite3模块

    # -*- coding: utf-8 -*- ''' Version : Python27 Author : Spring God Date : 2012-4-26 ''' import sqlit ...

  7. Codeforces Round #361 (Div. 2) D. Friends and Subsequences 二分

    D. Friends and Subsequences 题目连接: http://www.codeforces.com/contest/689/problem/D Description Mike a ...

  8. SPOJ 1811. Longest Common Substring (LCS,两个字符串的最长公共子串, 后缀自动机SAM)

    1811. Longest Common Substring Problem code: LCS A string is finite sequence of characters over a no ...

  9. mybatis逆向工程--自动生成实体代码(mybatis-generator)

    随便找个目录,  添加文件, 如图 主要是两个jar包,  generator的下载路径:   https://github.com/mybatis/generator/releases   驱动包随 ...

  10. Property Finder – a Cross-Platform Xamarin MonoTouch Mobile App

    Developers are now finding themselves having to author applications for a diverse range of mobile pl ...