HSSFWorkbook和XSSFWorkbook的区别
HSSFWorkbook读取97-2003格式 ,XSSFWorkbook读取2007-2013格式
- /**
- * 读取97-2003格式
- * @param filePath 文件路径
- * @throws java.io.IOException
- */
- public static List<Map> readExcel2003(String filePath) throws IOException{
- //返回结果集
- List<Map> valueList=new ArrayList<Map>();
- FileInputStream fis=null;
- try {
- fis=new FileInputStream(filePath);
- HSSFWorkbook wookbook = new HSSFWorkbook(fis); // 创建对Excel工作簿文件的引用
- HSSFSheet sheet = wookbook.getSheetAt(0); // 在Excel文档中,第一张工作表的缺省索引是0
- int rows = sheet.getPhysicalNumberOfRows(); // 获取到Excel文件中的所有行数
- Map<Integer,String> keys=new HashMap<Integer, String>();
- int cells=0;
- // 遍历行(第1行 表头) 准备Map里的key
- HSSFRow firstRow = sheet.getRow(0);
- if (firstRow != null) {
- // 获取到Excel文件中的所有的列
- cells = firstRow.getPhysicalNumberOfCells();
- // 遍历列
- for (int j = 0; j < cells; j++) {
- // 获取到列的值
- try {
- HSSFCell cell = firstRow.getCell(j);
- String cellValue = getCellValue(cell);
- keys.put(j,cellValue);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- // 遍历行(从第二行开始)
- for (int i = 1; i < rows; i++) {
- // 读取左上端单元格(从第二行开始)
- HSSFRow row = sheet.getRow(i);
- // 行不为空
- if (row != null) {
- //准备当前行 所储存值的map
- Map<String, Object> val=new HashMap<String, Object>();
- boolean isValidRow = false;
- // 遍历列
- for (int j = 0; j < cells; j++) {
- // 获取到列的值
- try {
- HSSFCell cell = row.getCell(j);
- String cellValue = getCellValue(cell);
- val.put(keys.get(j),cellValue);
- if(!isValidRow && cellValue!=null && cellValue.trim().length()>0){
- isValidRow = true;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- //第I行所有的列数据读取完毕,放入valuelist
- if(isValidRow){
- valueList.add(val);
- }
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally {
- fis.close();
- }
- return valueList;
- }
- /**
- * 读取2007-2013格式
- * @param filePath 文件路径
- * @return
- * @throws java.io.IOException
- */
- public static List<Map> readExcel2007(String filePath) throws IOException{
- List<Map> valueList=new ArrayList<Map>();
- FileInputStream fis =null;
- try {
- fis =new FileInputStream(filePath);
- XSSFWorkbook xwb = new XSSFWorkbook(fis); // 构造 XSSFWorkbook 对象,strPath 传入文件路径
- XSSFSheet sheet = xwb.getSheetAt(0); // 读取第一章表格内容
- // 定义 row、cell
- XSSFRow row;
- // 循环输出表格中的第一行内容 表头
- Map<Integer, String> keys=new HashMap<Integer, String>();
- row = sheet.getRow(0);
- if(row !=null){
- //System.out.println("j = row.getFirstCellNum()::"+row.getFirstCellNum());
- //System.out.println("row.getPhysicalNumberOfCells()::"+row.getPhysicalNumberOfCells());
- for (int j = row.getFirstCellNum(); j <=row.getPhysicalNumberOfCells(); j++) {
- // 通过 row.getCell(j).toString() 获取单元格内容,
- if(row.getCell(j)!=null){
- if(!row.getCell(j).toString().isEmpty()){
- keys.put(j, row.getCell(j).toString());
- }
- }else{
- keys.put(j, "K-R1C"+j+"E");
- }
- }
- }
- // 循环输出表格中的从第二行开始内容
- for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getPhysicalNumberOfRows(); i++) {
- row = sheet.getRow(i);
- if (row != null) {
- boolean isValidRow = false;
- Map<String, Object> val = new HashMap<String, Object>();
- for (int j = row.getFirstCellNum(); j <= row.getPhysicalNumberOfCells(); j++) {
- XSSFCell cell = row.getCell(j);
- if (cell != null) {
- String cellValue = null;
- if(cell.getCellType()==XSSFCell.CELL_TYPE_NUMERIC){
- if(DateUtil.isCellDateFormatted(cell)){
- cellValue = new DataFormatter().formatRawCellContents(cell.getNumericCellValue(), 0, "yyyy-MM-dd HH:mm:ss");
- }
- else{
- cellValue = String.valueOf(cell.getNumericCellValue());
- }
- }
- else{
- cellValue = cell.toString();
- }
- if(cellValue!=null&&cellValue.trim().length()<=0){
- cellValue=null;
- }
- val.put(keys.get(j), cellValue);
- if(!isValidRow && cellValue!= null && cellValue.trim().length()>0){
- isValidRow = true;
- }
- }
- }
- // 第I行所有的列数据读取完毕,放入valuelist
- if (isValidRow) {
- valueList.add(val);
- }
- }
- }
- } catch (IOException e) {
- e.printStackTrace();
- }finally {
- fis.close();
- }
- return valueList;
- }
- /**
- * 文件操作 获取文件扩展名
- *
- * @Author: sunny
- * @param filename
- * 文件名称包含扩展名
- * @return
- */
- public static String getExtensionName(String filename) {
- if ((filename != null) && (filename.length() > 0)) {
- int dot = filename.lastIndexOf('.');
- if ((dot > -1) && (dot < (filename.length() - 1))) {
- return filename.substring(dot + 1);
- }
- }
- return filename;
- }
HSSFWorkbook和XSSFWorkbook的区别的更多相关文章
- Java HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述
Java HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述 一.HSSFworkbook,XSSFworkbook,SXSSFworkbook区别简述 用Java ...
- 关于poi导出excel方式HSSFWorkbook(xls).XSSFWorkbook(xlsx).SXSSFWorkbook.csv的总结
1.HSSFWorkbook(xls) import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermo ...
- HSSFWorkbook 与 XSSFWorkbook
刚开始使用new HSSFWorkbook(new FileInputStream(excelFile))来读取Workbook,对Excel2003以前(包括2003)的版本没有问题,但读取Exce ...
- [转载]Java读取Excel中的单元格数据
目前网上能找到的读取Excel表格中数据的两种比较好的方案:PageOffice好用开发效率高:POI免费.供大家参考,针对具体情况选择具体方案. 1. PageOffice读取excel impor ...
- POI操作Excel的三种Workbook的发展和区别
POI的一些使用方法: 创建流程:(上级为下级的载体) 1.创建Workbook(工作薄): 2.创建Sheet(表单,可以创建多个): 3.创建Row(行): 4.创建Cell(单元格) 接下来分别 ...
- java使用poi(XSSFWorkbook)读取excel(.xlsx)文件
经过一番搜索发现,java操纵excel文件常用的有jxl和poi两种方式,孰好孰坏看自己需求而定.其中最主要的区别在于jxl不支持.xlsx,而poi支持.xlsx这里介绍的使用poi方式(XSSF ...
- Java使用POI的SXSSFWorkbook与HSSFWorkbook导出复杂表头
一.HSSFWorkbook与SXSSFWorkbook的区别: HSSFWorkbook是对Excel2003以前的版本进行操作的,即后缀名为.xls SXSSFWorkbook时对Excel200 ...
- Asp.Net Core(.net内核)
Asp.Net Core(.net内核) //----------------Day1----------------一章 Web基本原理 1节课程说明 web窗体--设计界面--加法使用Chr ...
- Java_POI之MS-Excel2003(扩展名.xls)升级至MS-Excel2007及以上版本(扩展名.xlsx)技术过程概要
Java_POI之MS-Excel2003(扩展名.xls)升级至MS-Excel2007及以上版本(扩展名.xlsx)技术过程概要 作者:Eric.Zhang(花名:穿越者7号) 日期:2015年1 ...
随机推荐
- Effective C++(19) 设计class犹如设计type
问题聚焦: 这一节不涉及代码,但是我们需要明确的一点是,思想比代码要重要得多. 设计优秀的classes是一项艰巨的工作,就像设计好的types一样. 我们应该带着和“语言设计 ...
- Coding Dojo
Coding Dojo 发表于 2012-10-25 什么是Coding Dojo? Coding Dojo是一个学习的过程.一些程序员(通常是15-20人)在一起编程解决一个程序问题.一边编程,一边 ...
- DotNetOpenAuth搭建OAuth2.0
使用DotNetOpenAuth搭建OAuth2.0授权框架 标题还是一如既往的难取. 我认为对于一个普遍问题,必有对应的一个简洁优美的解决方案.当然这也许只是我的一厢情愿,因为根据宇宙法则,所有事物 ...
- UML和模式
UML和模式应用学习笔记-2(迭代和进化式开发) 一:什么是迭代和进化式开发 1:迭代和进化式开发:通常会在还没有详细定义所有需求的情况下假设开发开始,同时使用反馈来明确和改进演化中的规格说明: ...
- socket网络编程快速上手(二)——细节问题(5)(完结篇)
6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢?如果EINTR前,三次握手已经发起,我们当然希望链路就此已经建 ...
- 系统架构、网络通信、IM、视频会议技术
专注于系统架构.网络通信.IM.视频会议技术. 主要作品: ESFramework 强悍的通信框架.P2P框架.群集平台. OMCS 简单易用的 网络语音视频 框架. MFile 语音视频录制组件. ...
- [转载]linux下编译php中configure参数具体含义
编译N次了 原来这么回事 原文地址:linux下编译php中configure参数具体含义作者:捷心特 php编译参数的含义 ./configure –prefix=/usr/local/php ...
- SQL Server中的高可用性1
SQL Server中的高可用性(1)----高可用性概览 自从SQL Server 2005以来,微软已经提供了多种高可用性技术来减少宕机时间和增加对业务数据的保护,而随着SQL Server ...
- 关于Ajax无刷新分页技术的一些研究 c#
关于Ajax无刷新分页技术的一些研究 c# 小弟新手,求大神有更好的解决方案,指教下~ 以前做项目,用过GridView的刷新分页,也用过EasyUI的封装好的分页技术,最近在老项目的基础上加新功能, ...
- ICMP:internet 控制报文协议
ICMP:internet 控制报文协议 1.概述 ICMP是(Internet Control Message Protocol)Internet控制报文协议.它是TCP/IP协议族的一个 ...