package cn.com.css.common.util;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.math.BigDecimal;

import java.util.HashMap;

import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.xssf.usermodel.XSSFCell;

import org.apache.poi.xssf.usermodel.XSSFRow;

import org.apache.poi.xssf.usermodel.XSSFSheet;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelParser {

 private XSSFWorkbook xssfWorkbook;

 private XSSFSheet xssfSheet;

 private XSSFRow xssfRow;

 private int columnNumbers;

 private int totalRows;

/**

  * @param args

  * @throws Exception

  */

 private String getCellFormatValue(XSSFCell cell) {

  String cellvalue = "";

  if (cell != null) {

   // 推断当前Cell的Type

   switch (cell.getCellType()) {

   // 假设当前Cell的Type为NUMERIC

   case XSSFCell.CELL_TYPE_NUMERIC: {

    BigDecimal big = new BigDecimal(cell.getNumericCellValue());

    cellvalue = big.toString();

    break;

   }

   case XSSFCell.CELL_TYPE_FORMULA: {

    // 推断当前的cell是否为Date

    /*

     * if (XSSFDateUtil.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()); }

     */

    BigDecimal bigula = new BigDecimal(cell

      .getCachedFormulaResultType());

    cellvalue = bigula.toString();

    break;

   }

    // 假设当前Cell的Type为STRIN

   case HSSFCell.CELL_TYPE_STRING:

    // 取得当前的Cell字符串

    cellvalue = cell.getRichStringCellValue().getString();

    break;

   // 默认的Cell值

   default:

    cellvalue = " ";

   }

  } else {

   cellvalue = "";

  }

  return cellvalue;

}

/**

  * \brief 通过这种方法获得Excel中的列名和一些excel的初始化信息,比方行数和列数

  *

  * @param is

  * @return

  * @attention

  * @author 涂作权

  * @date 2014-5-27

  * @note begin modify by null

  */

 public String[] getTitle(InputStream is) {

  try {

   xssfWorkbook = new XSSFWorkbook(is);

  } catch (IOException e) {

   e.printStackTrace();

  }

  xssfSheet = xssfWorkbook.getSheetAt(0);

  System.out.println("xssfSheet.getSheetName() = " + xssfSheet.getSheetName());

// 获得行数

  totalRows = xssfSheet.getLastRowNum();

  System.out.println("totalRows = " + totalRows);

  xssfRow = xssfSheet.getRow(0);// first line:title

  // 获得列数

  columnNumbers = xssfRow.getPhysicalNumberOfCells();

  System.out.println("columnNumbers = " + columnNumbers);

// 列名的集合

  String[] title = new String[columnNumbers];

  for (int i = 0; i < columnNumbers; i++) {

   title[i] = getCellFormatValue(xssfRow.getCell(i));

  }

// 返回的是列名的数组

  return title;

 }

public Map<Integer, String> readExcelContent(InputStream is) {

  getTitle(is);

  Map<Integer, String> content = new HashMap<Integer, String>();

  String str = "";

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

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

   xssfRow = xssfSheet.getRow(i);

   int j = 0;

while (j <= columnNumbers) {

    String cell = getCellFormatValue(xssfRow.getCell(j)).trim();

    if (cell == "") {

     j++;

     continue;// cell="null";

    }

    str += cell + "\t";

    j++;

   }

   str.trim();

   content.put(i, str);

   str = "";

  }

  return content;

 }

public XSSFWorkbook getXssfWorkbook() {

  return xssfWorkbook;

 }

public void setXssfWorkbook(XSSFWorkbook xssfWorkbook) {

  this.xssfWorkbook = xssfWorkbook;

 }

public XSSFSheet getXssfSheet() {

  return xssfSheet;

 }

public void setXssfSheet(XSSFSheet xssfSheet) {

  this.xssfSheet = xssfSheet;

 }

public XSSFRow getXssfRow() {

  return xssfRow;

 }

public void setXssfRow(XSSFRow xssfRow) {

  this.xssfRow = xssfRow;

 }

public int getColumnNumbers() {

  return columnNumbers;

 }

public void setColumnNumbers(int columnNumbers) {

  this.columnNumbers = columnNumbers;

 }

public int getTotalRows() {

  return totalRows;

 }

public void setTotalRows(int totalRows) {

  this.totalRows = totalRows;

 }

public static void main(String[] args) throws Exception {

  // 构造 XSSFWorkbook 对象,strPath 传入文件路径

  ExcelParser ep = new ExcelParser();

  InputStream is = new FileInputStream(new File("D:\\产品管理模板.xlsx"));

  //String[] titles = ep.getTitle(is);

  Map<Integer, String> map = ep.readExcelContent(is);

  

  for (int i = 1; i <= map.size(); i++) {

   String row = map.get(i);

   String rowArr[] = row.split(" ");

   // 假设每行里面有大于3列信息

   String cell0 = rowArr[0]; // 产品名

   String cell1 = rowArr[1]; // 国家编码

   System.out.println(cell0 + "\t" + cell1);

   //System.out.println(map.size());

  }

  

  is.close();

      is = null;

 }

}

ExcelParser ,Excel解析的工具类(正对解析xlsx)的更多相关文章

  1. Java解析Excel工具类(兼容xls和xlsx)

    依赖jar <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml&l ...

  2. Excel解析easyexcel工具类

    Excel解析easyexcel工具类 easyexcel解决POI解析Excel出现OOM <!-- https://mvnrepository.com/artifact/com.alibab ...

  3. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  4. Workbook导出excel封装的工具类

    在实际中导出excel非常常见,于是自己封装了一个导出数据到excel的工具类,先附上代码,最后会写出实例和解释.支持03和07两个版本的 excel. HSSF导出的是xls的excel,XSSF导 ...

  5. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  6. flink---实时项目--day02-----1. 解析参数工具类 2. Flink工具类封装 3. 日志采集架构图 4. 测流输出 5. 将kafka中数据写入HDFS 6 KafkaProducer的使用 7 练习

    1. 解析参数工具类(ParameterTool) 该类提供了从不同数据源读取和解析程序参数的简单实用方法,其解析args时,只能支持单只参数. 用来解析main方法传入参数的工具类 public c ...

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

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

  8. 【原创】POI操作Excel导入导出工具类ExcelUtil

    关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.Th ...

  9. android 解析XML 工具类

    /** * Created by John on 2016/3/29. */ public class XmlParser { private static final String ns = nul ...

  10. 导入导出Excel的Java工具类ExcelUtil

    在编写ExcelUtil之前,在网上查了一些资料.java中用来处理Excel的第三方开源项目主要就是POI和JXL.poi功能强大,但是比较耗资源,对于大数据量的导入导出性能不是太好:jxl功能简单 ...

随机推荐

  1. lightOJ 1317 Throwing Balls into the Baskets

    lightOJ  1317  Throwing Balls into the Baskets(期望)  解题报告 题目链接:http://acm.hust.edu.cn/vjudge/contest/ ...

  2. URAL 1260 Nudnik Photographer DFS DP

    题目:click here :这个题可以先dfs深搜下,规律dp dfs: #include <bits/stdc++.h> using namespace std; #define S ...

  3. 「OC」类的深入研究、description方法和sel

    一.类的深入研究 (一)类的本质 类本身也是一个对象,是class类型的对象,简称“类对象”. Class类型的定义: Typedef struct obj class *class; 类名就代表着类 ...

  4. Windows Phone 8初学者开发—第9部分:Windows Phone 8模拟器概述

    原文 Windows Phone 8初学者开发—第9部分:Windows Phone 8模拟器概述 第9部分:Windows Phone 8模拟器概述 原文地址: http://channel9.ms ...

  5. android 项目中使用到的网络请求框架以及怎样配置好接口URL

    我们在做项目中一定少不了网络请求,如今非常多公司的网络请求这块好多都是使用一些比較好的开源框架,我项目中使用的是volley,如今讲讲一些volley主要的使用,假设想要具体的了解就要去看它的源代码了 ...

  6. ListView下拉刷新及上拉更多两种状态

    一.前言: 很多应用都会用到ListView,当然如果是iOS就会用UITableViewController,这两个控件在不同的OS上,功能是一样的,只是有些细微的不同(iOS的UITableVie ...

  7. [Swust OJ 666]--初来乍到(题号都这么溜~~,递归,找规律)

    题目链接:http://acm.swust.edu.cn/problem/0666/ Time limit(ms): 1000 Memory limit(kb): 65535   Descriptio ...

  8. KVO(键-值观察)

    // 1.键-值观察 // 2.它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知. // 3.符合KVC(Key-ValuedCoding)机制的对象才可以使用KVO // 4.实现过 ...

  9. html向servlet传乱码解决办法

    html 设置为utf-8格式 <meta http-equiv="content-type" content="text/html;charset=UTF-8&q ...

  10. AddSelf

    今天看     C语言深度深度解剖  第58页 看到了这么一段代码,就敲进了dev 谁知居然出现了个死循环.但是我不知道为什么. 贴出来,等有空了再请教别人好好分析,或者是网络上的高人指点一下 //d ...