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功能简单 ...
随机推荐
- UVa---------10935(Throwing cards away I)
题目: Problem B: Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 ...
- BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )
QAQ我没读过书...四边形都不会判定了 简单的dp.... --------------------------------------------------------------------- ...
- python命令行解析工具argparse模块【5】
上一节我们学习了parse_args()的用法,这一节,我们将继续学习argparse的其他一些用法. 1.sub-commands子命令 argpar ...
- [Just a feeling]
The possibility of enhancing one's knowledge is limitless. Graduation only marks a stage of one's ed ...
- struts OGNL数据标签
OGNL对象图导航语言,类似于el表达式,strut的底层就是用这个写的在导入struts-core的时候会导入ognl.jar public class Test { public static v ...
- 将HDC保存为BMP文件
HDC在MSDN中的全称为:The handle of device context.通常,我们都是用来做相应的显示操作. 熟悉WIN32的朋友对于其应该不会陌生,经常采用GetDC,G ...
- JNI_Java Native Interface
一.简介 Java Native Interface(JNI),java与c/c++交互的接口,下面是一个简单是示例. javah 可以生成native方法对应的头文件,javap 可以查看方法或者属 ...
- FLASH ROM与EEPROM的区别
EEPROM,虽然也叫“非易失性数据存储器”,但它不能直接参与ALU运算,只是用于掉电不丢失的数据存储. EEPROM和片内RAM 类似,也属于数据存储器,它的特点是数据掉电可保持,而程序存储器一般指 ...
- BNU Invading system
http://www.bnuoj.com/bnuoj/problem_show.php?pid=29364 这个题被坑了. 题意:密码就是那些数字里面的数,转换成二进制后1最少的那个数,当1的个数相同 ...
- 使用apache benchmark(ab) 测试报错汇总
1.socket: Too many open files (24) 解决方法: [root@zabbix ~]# ulimit -a core file size (blocks, -c) 0 da ...