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. 历史文章分类汇总-Anaconda安装第三方包(whl文件)

    本文主要是对公众号之前发布的文章进行分类整理,方面大家查阅,以后会不定期对文章汇总进行更新与发布.   一.推荐阅读: Anaconda安装第三方包(whl文件) 福布斯系列之数据分析思路篇 福布斯系 ...

  2. shell run 屏蔽一切log

    &命令: xxx >/dev/null 2>&1 &                           屏蔽一切logxxx >/tmp/xxx.log 2 ...

  3. 图解在Eclipse中如何上传项目到svn

    方法/步骤 1.在Eclipse中新建project,如下图所示: 2.右键project --> team --> share project,如下图所示: 3.选择repository ...

  4. Javascript中call方法和apply方法用法和区别

    第一次在博客园上面写博客,知识因为看书的时候发现了一些有意思的知识,顺便查了一下资料,就发到博客上来了,希望对大家有点帮助. 连续几天阅读<javascript高级程序设计>这本书了,逐渐 ...

  5. 机器学习之路:python 特征降维 特征筛选 feature_selection

    特征提取: 特征降维的手段 抛弃对结果没有联系的特征 抛弃对结果联系较少的特征 以这种方式,降低维度 数据集的特征过多,有些对结果没有任何关系,这个时候,将没有关系的特征删除,反而能获得更好的预测结果 ...

  6. android 定时, 延时 任务

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 倒计时类  用  倒计时定时器CountDownTimer 延迟类 CountDownT ...

  7. android handler messageQueue,looper

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 处理器获取 当前线程中的 循环器对象, 循环器 从 消息队列中 取出 消息, 给 处理器 ...

  8. POJ2104 K-th Number 不带修改的主席树 线段树

    http://poj.org/problem?id=2104 给定一个序列,求区间第k小 通过构建可持久化的点,得到线段树左儿子和右儿子的前缀和(前缀是这个序列从左到右意义上的),然后是一个二分的ge ...

  9. 随笔idea-辗转落户cnblogs

    辗转了几个blog,也用了自己域名2年,感觉忙起来,可能没有那么多时间去维护自己的域: 其他地方的blog也不在一块,思虑许久后,来到cnblogs:

  10. 【Codeforces 949D】Shake It! 【动态规划】

    参考: http://blog.csdn.net/gjghfd/article/details/77824901 所求的是满足条件的图中“不同构”的数量,意味着操作的顺序是可以忽略的.考虑若干次操作后 ...