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. 使用DNSPod域名解析

    1 在GoDaddy域名注册商 注册域名 https://sg.godaddy.com/zh/ 2 登陆DNSPod https://www.dnspod.cn 3 选择域名解析 添加域名 4 添加记 ...

  2. Python处理海量数据的实战研究

    最近看了July的一些关于Java处理海量数据的问题研究,深有感触,链接:http://blog.csdn.net/v_july_v/article/details/6685962 感谢July ^_ ...

  3. Linux系统内存管理

    <linux 内存管理模型> 下面这个图将Linux内存管理基本上描述完了,但是显得有点复杂,接下来一部分一部分的解析. 内存管理系统可以分为两部分,分别是内核空间内存管理和用户空间内存管 ...

  4. 【BZOJ 1419】1419: Red is good (概率DP)

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 807  Solved: 343 Description 桌面上有R张 ...

  5. Codeforces.547C.Mike and Foam(容斥/莫比乌斯反演)

    题目链接 \(Description\) 给定n个数(\(1\leq a_i\leq 5*10^5\)),每次从这n个数中选一个,如果当前集合中没有就加入集合,有就从集合中删去.每次操作后输出集合中互 ...

  6. [UOJ240]aliens

    学习了一下凸优化DP,感觉挺有意思的 首先把所有点对称到左下角,然后以每个点为顶点画等腰直角三角形,将被覆盖的点去掉,现在所有点从左上到右下横纵坐标都是递增的,设坐标为$(x_{1\cdots M}, ...

  7. Alpha 冲刺报告8

    组长:吴晓晖 今天完成了哪些任务: maven和idea用的不熟啊,jar包或者war包导出来一直有问题:生气了把ide扔到服务器里去运行springboot了,卡哭了,终于可以运行了,然后debug ...

  8. [ZHOJ1956]vfk的地雷

    题目大意: 有$n$个开关,$r$句话. 每个开关$i$有$p_i$的概率被触发,并造成$d_i$的代价. 每个开关至多被触发一次,一句话至多触发一个开关. 每个开关按照顺序被尝试触发. 求期望代价. ...

  9. 一个完成的spring xml配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  10. hdu 3949 第k大异或组合

    题意: 给你一些数,其中任选一些数(大于等于一个),那么他们有一个异或和. 求所有这样的异或和的第k小. 我们可以将每一位看成一维,然后就是给我们n个60维的向量,求它们线性组合后得到的向量空间中,第 ...