ExcelParser ,Excel解析的工具类(正对解析xlsx)
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)的更多相关文章
- Java解析Excel工具类(兼容xls和xlsx)
依赖jar <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml&l ...
- Excel解析easyexcel工具类
Excel解析easyexcel工具类 easyexcel解决POI解析Excel出现OOM <!-- https://mvnrepository.com/artifact/com.alibab ...
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...
- Workbook导出excel封装的工具类
在实际中导出excel非常常见,于是自己封装了一个导出数据到excel的工具类,先附上代码,最后会写出实例和解释.支持03和07两个版本的 excel. HSSF导出的是xls的excel,XSSF导 ...
- Java基础学习总结(49)——Excel导入导出工具类
在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...
- flink---实时项目--day02-----1. 解析参数工具类 2. Flink工具类封装 3. 日志采集架构图 4. 测流输出 5. 将kafka中数据写入HDFS 6 KafkaProducer的使用 7 练习
1. 解析参数工具类(ParameterTool) 该类提供了从不同数据源读取和解析程序参数的简单实用方法,其解析args时,只能支持单只参数. 用来解析main方法传入参数的工具类 public c ...
- Excel导入工具类兼容xls和xlsx
package com.bj58.finance.platform.operation.provider.util; import org.apache.log4j.Logger; import or ...
- 【原创】POI操作Excel导入导出工具类ExcelUtil
关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.Th ...
- android 解析XML 工具类
/** * Created by John on 2016/3/29. */ public class XmlParser { private static final String ns = nul ...
- 导入导出Excel的Java工具类ExcelUtil
在编写ExcelUtil之前,在网上查了一些资料.java中用来处理Excel的第三方开源项目主要就是POI和JXL.poi功能强大,但是比较耗资源,对于大数据量的导入导出性能不是太好:jxl功能简单 ...
随机推荐
- Java 使用Dom4j和JFileChooser实现xml文件的自主选择路径导出
直接来个简单的例子,大家一看便知. Document doc=DocumentHelper.createDocument();//创建document Element rootElement=doc. ...
- linux下操作gpio寄存器的方法
一. 在驱动中: 1. 用的时候映射端口:ioremap; #define GPIO_OFT(x) ((x) - 0x56000000) #define GPFCON (*(volatile unsi ...
- jquery日历签到控件的实现
calendar.js var calUtil = { //当前日历显示的年份 showYear:2015, //当前日历显示的月份 showMonth:1, //当前日历显示的天数 showDays ...
- MVC框架浅析(基于PHP)
MVC框架浅析(基于PHP) MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数 ...
- C语言回溯算法解决N皇后问题
回溯算法的模型是 x++, not satisfy ? x-- : continue. 代码中x作列号,y[x]保存第x列上皇后放置的位置. #include<stdio.h> #incl ...
- base64这种编码的意义
BASE64不是用来加密的.你看看经过BASE64编码后的字符串,全部都是由标准键盘上面的常规字符组成,这样编码后的字符串在网关之间传递不会产生UNICODE字符串不能识别或者丢失的现象.你再仔细研究 ...
- jQuery 子元素选择
对于如下代码片段 如何对河meishi这个div的子DIV呢? <div id="vertical-Menu-meishi" class="J-nav-item& ...
- CMD获取当前目录的绝对路径
@echo offecho 当前盘符:%~d0echo 当前盘符和路径:%~dp0echo 当前批处理全路径:%~f0echo 当前盘符和路径的短文件名格式:%~sdp0echo 当前CMD默认目录: ...
- 求n^k的前缀和
我都已经高二了,却还不知\(1^2+2^2+3^2+4^2+...+n^2\)的通式,真是惭愧. 现在说说如何求\(n^k\)的前缀和. 如果k比较小,我们可以直接差分序列手算.否则,我们可以用神奇的 ...
- NAT简单介绍
NAT本质就是让一群机器公用同一个IP.还有一个重要的用途是保护NAT内的主机不受外界攻击 NAT类型: 1.Full Cone:IPport不受限 Full Cone仅仅做单纯的地址转换,不正确进出 ...