package cn.eguid;

import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry; import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory; /**
* --2016.3.23
* 解析EXCEL文档1.2
* 支持xlsx和xls文档解析,全面兼容OFFICE所有EXCEL版本文件
* @author eguid
*
** --2016.3.21
* 解析EXCEL文档1.1
* 支持xls文档解析
* @author eguid
*/
public class poi {
/**
* 按照给定的字段进行解析
* 如给定数组:{id,name,sal,date}
* @throws IOException
* @throws InvalidFormatException
*/
public static Map<String, List<String>> parseByfield(File file,String[] fields) throws InvalidFormatException, IOException
{
Workbook wb=createWorkbook(file);
Sheet sheet=wb.getSheetAt(0);
//列
Cell cell=null;
//暂时存放
String data=null;
//最大行数
int maxRowNum=sheet.getLastRowNum();
//最大列数
int MaxCellNum=sheet.getRow(0).getLastCellNum();
List<String>list=null; Map<String,List<String>>map=null;
map=new HashMap<String,List<String>>(); for(int i=0;i<maxRowNum;i++){ list=new ArrayList<String>();
String title=null;
for(int j=0;j<MaxCellNum;j++){
//获取第j行第i列的值
cell=sheet.getRow(j).getCell(i); data=getValue4Cell(cell); //如果标题与给定字段对应,则记录值;否则进入下个整列
if(ishave(fields,data))
{
if(j==0)
{
title=data;
}else{
list.add(data);
}
}
else{
break;
} }
map.put(title, list);
}
return map;
}
/**
* 是否有此字段
* @param fields
* @param field
* @return
*/
private static boolean ishave(String[] fields,String field)
{
if(field==null||fields==null||fields.length<1){
return false;
} for(int index=0;index<fields.length;index++)
{
if(field.equals(fields[index]))
return true;
else
return false;
}
return false;
}
/**
*
* 解析
* 第一行是标题行
* 第二行以后都是内容
* 例如:
* id sex name
* 1 男 王
* 2 女 李
*
*
* 解析后的map格式:
* key value
* 0 List()一行
* 1 List()一行
* 2 List()一行
*
*例如:
*0 [id , name, sex, sal , date]
*1 [1.0, wang, 1.0, 1000.0, 42287.0]
*2 [2.0, liang, 1.0, 1001.0, 42288.0]
*@param file
*@throws IOException
* @throws InvalidFormatException
*/
public static Map parse1(File file) throws IOException, InvalidFormatException
{
//提取并创建工作表
Workbook wb=createWorkbook(file);
//获取sheet页第0页
Sheet sheet = wb.getSheetAt(0);
//获取行迭代器
Iterator rows = sheet.rowIterator();
//解析出来的数据存放到这个map里面,value套了一层List,key用于存放标题,List用于存放标题下的所有数据
Map<String,List<String>> map=new HashMap<String,List<String>>(); String title=null;//标题
int rowindex=0;//行数
int cellindex=0;//列数
String data=null;//用于暂存数据
while(rows.hasNext())
{
List<String> list=new ArrayList<String>();
cellindex=0;
//获取行中数据
Row row = (Row) rows.next();
//获取列迭代器
Iterator cells = row.cellIterator(); while(cells.hasNext())
{
//获取列中数据
Cell cell = (Cell) cells.next();
//获取每个单元格的值
//将标题下的内容放到list中
list.add( getValue4Cell(cell));
}
//将解析完的一列数据压入map
map.put(""+rowindex++, list);
} return map;
}
/**
* 把默认的格式转换成这种格式
* id [1,2,3,4,5]
*name [wang,liang,eguid,qq,yy]
*
* @param map map格式:Map<String,List<String>>
* @return Map<String,List<String>>
*/
public static Map<String,List<String>> format(Map<String,List<String>> map)
{
Map<String,List<String>> newmap=new HashMap<String,List<String>>();
//获取标题行有多少列
String[] titles=new String[map.get("0").size()];
int index=0;
//获取所有标题
for(String s:map.get("0"))
{
titles[index++]=s;
}
//控制List
for(int i=0;i<titles.length;i++)
{
List<String>newlist=new ArrayList<String>();
//控制map
for(int j=1;j<map.size();j++)
{
newlist.add(map.get(j+"").get(i));
}
newmap.put(titles[i],newlist);
}
return newmap;
}
/**
* 解析文件名后缀
* @return
*/
private static String parseFileSuffix(File file)
{
String fileName=file.getName();
return fileName.substring(fileName.lastIndexOf(".")+1, fileName.length());
}
/**
* 提取文件并创建工作表
* @throws IOException
* @throws InvalidFormatException
*/
private static Workbook createWorkbook(File file) throws InvalidFormatException, IOException
{
//如果文件不存在,抛出文件没找到异常
InputStream input = new FileInputStream(file); Workbook wb=null;
//如果创建工作表失败会抛出IO异常
wb=WorkbookFactory.create(input);
return wb;
}
/**
* 提取单元格中的值
*/
private static String getValue4Cell(Cell cell)
{
String data=null;
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC: // 数字
data=String.valueOf(cell.getNumericCellValue()) ;
break;
case Cell.CELL_TYPE_STRING: // 字符串
data=String.valueOf(cell.getStringCellValue()) ;
break;
case Cell.CELL_TYPE_BOOLEAN: // Boolean
data=String.valueOf( cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA: // 公式
data=String.valueOf(cell.getCellFormula()) ;
break;
case Cell.CELL_TYPE_BLANK: // 空值
data=String.valueOf("");
break;
case Cell.CELL_TYPE_ERROR: // 故障
System.out.println(" 故障");
break;
default:
System.out.print("未知类型 ");
break;
}
return data;
}
/**
* 用于关闭流(暂不用)
* @throws IOException
*/
private void closeAll(Closeable...closes) throws IOException
{
if(closes==null)
{
return;
}
if(closes.length<1)
{
return;
}
for(Closeable c:closes)
{
if(c!=null)
{
try {
c.close();
} catch (IOException e) {
e.printStackTrace();
throw e;
}
}
}
}
/**
* 格式:
key value id [1.0, 2.0, 3.0, 4.0, 5.0]
sex [1.0, 1.0, 1.0, 0.0, 0.0]
name [wang, liang, eguid, qq, yy]
date [42287.0, 42288.0, 42289.0, 42290.0, 42291.0]
sal [1000.0, 1001.0, 1002.0, 1003.0, 1004.0]
* @throws InvalidFormatException
*/ public static void test1() throws IOException, InvalidFormatException
{
Map<String, List<String>>map=parse1(new File("测试.xlsx"));
Map <String,List<String>>newmap=format(map);
for(Entry<String,List<String>>e:newmap.entrySet())
{
System.out.println(e.getKey());
System.out.println(e.getValue());
}
}
/**
格式:
key value
0 [id, name, sex, sal, date]
1 [1.0, wang, 1.0, 1000.0, 42287.0]
2 [2.0, liang, 1.0, 1001.0, 42288.0]
3 [3.0, eguid, 1.0, 1002.0, 42289.0]
4 [4.0, qq, 0.0, 1003.0, 42290.0]
5 [5.0, yy, 0.0, 1004.0, 42291.0]
* @throws InvalidFormatException
*/
public static void test2() throws IOException, InvalidFormatException
{
Map<String, List<String>>map=parse1(new File("测试.xlsx"));
for(Entry<String,List<String>>e:map.entrySet())
{
System.out.println(e.getKey());
System.out.println(e.getValue());
}
}
public static void main(String[]args) throws IOException, InvalidFormatException
{
//System.out.println(parseFileSuffix(new File("测试.xlsx")));
// test1();
// test2();
Map<String, List<String>> map=parseByfield(new File("测试.xlsx"),new String[]{"id","name"});
System.out.println(map);
}
}

POI使用:解析xls/xlsx文件(兼容office2003/2007/2010版本)的更多相关文章

  1. 使用POI读取/创建Execl(.xlsx)文件

    最近项目中用到了解析Execl表格的功能,在网上百度了一下自己写了一个小Demo.由于项目中使用的是Execl2007,就是后缀为.xlsx的,所以只研究了解析和创建Execl2007的文件,解析Ex ...

  2. 【POI】解析xls报错:java.util.zip.ZipException: error in opening zip file

    今天使用POI解析XLS,报错如下: Servlet.service() for servlet [rest] in context with path [/cetBrand] threw excep ...

  3. R 读取xls/xlsx文件

    包readxl install.packages('readxl',repois='https://mirrors.utsc.edu.cn/CRAN/) library(readxl) # read_ ...

  4. java使用poi(XSSFWorkbook)读取excel(.xlsx)文件

    经过一番搜索发现,java操纵excel文件常用的有jxl和poi两种方式,孰好孰坏看自己需求而定.其中最主要的区别在于jxl不支持.xlsx,而poi支持.xlsx这里介绍的使用poi方式(XSSF ...

  5. ajaxfileupload.js上传文件兼容IE7及以上版本

    要兼容IE789,要修改ajaxfileupload.js;要将此处的代码替换掉 if(window.ActiveXObject) { var io = document.createElement( ...

  6. 添加找回鼠标右键新建菜单里的新建office2003/2007/2010文档的简洁方法

    鼠标右键新建菜单里的新建office文档丢失了怎么办?我们可以通过一些优化设置软件如优化大师来定制,但更简单的方法是只需要导入相应的注册表设置就行了. 下面即在鼠标右键新建菜单里添加新建office2 ...

  7. office2003?2007共存?版本各自打开的解决方案

    在现在的办公软件中, Microsoft出品的 Office集成办公软件占据了绝大多数的市场份额,从最初的 Office 2000,到后面的 Office 2003以至近两年刚发行的 Office 2 ...

  8. java读取excel文件(.xls,xlsx,csv)

    前提,maven工程通过poi读写excel文件,需要在pom.xml中配置依赖关系: 在<dependencies>中添加如下代码 <dependency> <grou ...

  9. java实现文件批量导入导出实例(兼容xls,xlsx)

    1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iRepo ...

随机推荐

  1. java线程控制方法

    一.中断线程 1.Thread.sleep()让线程进入睡眠状态,放弃CPU的占用暂停若干毫秒使用方法: public class runable implements Runnable { @Ove ...

  2. hadoop环境搭建之关于NAT模式静态IP的设置 ---VMware12+CentOs7

    很久没有更新了,主要是没有时间,今天挤出时间验证了一下,果然还是有些问题的,不过已经解决了,就发上来吧. PS:小豆腐看仔细了哦~ 关于hadoop环境搭建,从单机模式,到伪分布式,再到完全分布式,我 ...

  3. 统计数据方面SQL与HQL

    因为HQL是面向对象的,所以对于统计数据方面使用HQL时不合适的,其实HQL最终还是会转化成SQL语句,项目里使用HQL语句应该是为了标准规范化. 统计的数据:同一个表,同一个字段,不同属性,统计不同 ...

  4. 创建一个JS函数,运用JS中arguments对象

    Javascript中有个内置的arguments对象. arguments对象包含了参数调用的参数数组. <p>查找最大的数.</p> <p id="demo ...

  5. Oracle修改监听端口号1521[转]

    在oracle中,默认的监听端口号为1521,一旦有人扫描出这个端口号就会知道此服务器为oracle数据库服务器,存在极其大的安全隐患,在这里,教大家如何修改oracle默认端口号为9999: 1.查 ...

  6. hibernate 对象三态(瞬态、持久态、脱管态)之我见

    刚开始学习hibernate时,对其对象的三种状态理解的模模糊糊,一直停留在一知半解的状态,前两天又回顾了一下,顿时醒悟,原来三种状态理解起来是很容易的. 先看一下对Hibernate对象状态的解释: ...

  7. app性能测试【通过loadrunner录制】

    随着智能手机近年来的快速增长,从游戏娱乐到移动办公的各式各样的手机APP软件渗透到我们的生活中,对于大型的手机APP测试不仅要关注它的功能性.易用性还要关注它的性能,最近发现LoadRunner12可 ...

  8. 十分钟彻底理解javascript 的 this指向,不懂请砸店

    函数的this指向谁,和函数在哪里被定义的,函数在哪里被执行的没有半毛钱关系,只遵守下面的规律: 在非严格模式中: 1.自执行函数里面,this永远指向window; <script> v ...

  9. angular2项目添加ng2-bootstrap

    1. 先webstome创建一个空的工程.例如test File--> New -->Project --> Empty Project 2.然后命令行(Alt+F12)下执行以下命 ...

  10. Win10或Win8下ObjectARX2015 Wizard向导创建项目失败解决方法

    [原创]objectARX 2015 Wizard安装向导在Win8/win10下无法创建项目的解决方法总结by edata @2017-5-1objectARX 2015 Wizard安装向导在Wi ...