POI读取Excel浅谈

article/2025/10/21 3:46:49

POI读取Excel浅谈

  • 博客分类:
  • J2EE
  • Java开源
  • Servlet/Jsp
  • 设计模式
Excel Ruby Office Apache Microsoft 

先看代码,挨句解释:

一般遍历使用两种方式,1:得到总的行数和每行的列数,然后循环。2:使用迭代

先看第一种:

Java代码   收藏代码
  1. package com.golden.test;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5.   
  6. import org.apache.poi.hssf.usermodel.HSSFCell;  
  7. import org.apache.poi.hssf.usermodel.HSSFRow;  
  8. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  9. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  10.   
  11. /** 
  12.  *  
  13.  * @author 崔素强 
  14.  *  
  15.  */  
  16. public class PoiReadXls2 {  
  17.     public static void main(String[] args) {  
  18.         File f = new File("c:\\a.xls");  
  19.         try {  
  20.             FileInputStream is = new FileInputStream(f);  
  21.             HSSFWorkbook wbs = new HSSFWorkbook(is);  
  22.             HSSFSheet childSheet = wbs.getSheetAt(0);  
  23.             // System.out.println(childSheet.getPhysicalNumberOfRows());  
  24.             System.out.println("有行数" + childSheet.getLastRowNum());  
  25.             for (int j = 0; j < childSheet.getLastRowNum(); j++) {  
  26.                 HSSFRow row = childSheet.getRow(j);  
  27.                 // System.out.println(row.getPhysicalNumberOfCells());  
  28.                 // System.out.println("有列数" + row.getLastCellNum());  
  29.                 if (null != row) {  
  30.                     for (int k = 0; k < row.getLastCellNum(); k++) {  
  31.                         HSSFCell cell = row.getCell(k);  
  32.                         if (null != cell) {  
  33.                             switch (cell.getCellType()) {  
  34.                             case HSSFCell.CELL_TYPE_NUMERIC: // 数字  
  35.                                 System.out.print(cell.getNumericCellValue()  
  36.                                         + "   ");  
  37.                                 break;  
  38.                             case HSSFCell.CELL_TYPE_STRING: // 字符串  
  39.                                 System.out.print(cell.getStringCellValue()  
  40.                                         + "   ");  
  41.                                 break;  
  42.                             case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean  
  43.                                 System.out.println(cell.getBooleanCellValue()  
  44.                                         + "   ");  
  45.                                 break;  
  46.                             case HSSFCell.CELL_TYPE_FORMULA: // 公式  
  47.                                 System.out.print(cell.getCellFormula() + "   ");  
  48.                                 break;  
  49.                             case HSSFCell.CELL_TYPE_BLANK: // 空值  
  50.                                 System.out.println(" ");  
  51.                                 break;  
  52.                             case HSSFCell.CELL_TYPE_ERROR: // 故障  
  53.                                 System.out.println(" ");  
  54.                                 break;  
  55.                             default:  
  56.                                 System.out.print("未知类型   ");  
  57.                                 break;  
  58.                             }  
  59.                         } else {  
  60.                             System.out.print("-   ");  
  61.                         }  
  62.                     }  
  63.                 }  
  64.                 System.out.println();  
  65.             }  
  66.         } catch (Exception e) {  
  67.             e.printStackTrace();  
  68.         }  
  69.     }  
  70. }  

 

得到Excel的文件然后读取,这个很简单。关键有两个地方,也许在网上会看到有的这样使用有的那样使用。

System.out.println("有行数" + childSheet.getLastRowNum());

System.out.println(childSheet.getPhysicalNumberOfRows());

System.out.println("有列数" + row.getLastCellNum());

System.out.println(row.getPhysicalNumberOfCells());

如果人都拷贝代码进行使用了,不知道有什么区别。太多的区别不知道,但是有一点我发现了,那就是如果中间各行或者隔列的话getPhysicalNumberOfRows和getPhysicalNumberOfCells就不能读取到所有的行和列了。

再者,一定要对单元格的格式进行判断switch (cell.getCellType()),不同的单元格格式使用不同的方法。最后加上为止类型,以防万一。

而且在数字类型里,又分为了纯数字和时间格式:

Java代码   收藏代码
  1. case HSSFCell.CELL_TYPE_NUMERIC: // 数值型  
  2.     if (HSSFDateUtil.isCellDateFormatted(cell)) {  
  3.         //  如果是date类型则 ,获取该cell的date值  
  4.         value = HSSFDateUtil.getJavaDate(cell.getNumericCellValue()).toString();  
  5.     } else { // 纯数字  
  6.         value = String.valueOf(cell.getNumericCellValue());  
  7. }  

 

还有一种迭代的方法:

Java代码   收藏代码
  1. package com.golden.test;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.util.Iterator;  
  8. import org.apache.poi.hssf.usermodel.HSSFCell;  
  9. import org.apache.poi.hssf.usermodel.HSSFRow;  
  10. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  11. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  12. import org.apache.poi.poifs.filesystem.POIFSFileSystem;  
  13.   
  14. /** 
  15.  *  
  16.  * @author 崔素强 
  17.  *  
  18.  */  
  19. public class PoiReadXls {  
  20.     @SuppressWarnings( { "unchecked""deprecation" })  
  21.     public static void main(String[] args) {  
  22.         File f = new File("c:\\a.xls");  
  23.         try {  
  24.             InputStream input = new FileInputStream(f);  
  25.             POIFSFileSystem fs = new POIFSFileSystem(input);  
  26.             HSSFWorkbook wb = new HSSFWorkbook(fs);  
  27.             HSSFSheet sheet = wb.getSheetAt(0);  
  28.             Iterator rows = sheet.rowIterator();  
  29.             while (rows.hasNext()) {  
  30.                 HSSFRow row = (HSSFRow) rows.next();  
  31.                 // System.out.print("行:" + row.getRowNum() + " ");  
  32.                 Iterator cells = row.cellIterator();  
  33.                 while (cells.hasNext()) {  
  34.                     HSSFCell cell = (HSSFCell) cells.next();  
  35.                     // System.out.println("列:" + cell.getCellNum());  
  36.                     switch (cell.getCellType()) {  
  37.                     case HSSFCell.CELL_TYPE_NUMERIC: // 数字  
  38.                         System.out.print(cell.getNumericCellValue() + "   ");  
  39.                         break;  
  40.                     case HSSFCell.CELL_TYPE_STRING: // 字符串  
  41.                         System.out.print(cell.getStringCellValue() + "   ");  
  42.                         break;  
  43.                     case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean  
  44.                         System.out.println(cell.getBooleanCellValue() + "   ");  
  45.                         break;  
  46.                     case HSSFCell.CELL_TYPE_FORMULA: // 公式  
  47.                         System.out.print(cell.getCellFormula() + "   ");  
  48.                         break;  
  49.                     case HSSFCell.CELL_TYPE_BLANK: // 空值  
  50.                         System.out.println(" ");  
  51.                         break;  
  52.                     case HSSFCell.CELL_TYPE_ERROR: // 故障  
  53.                         System.out.println(" ");  
  54.                         break;  
  55.                     default:  
  56.                         System.out.print("未知类型   ");  
  57.                         break;  
  58.                     }  
  59.                 }  
  60.                 System.out.println();  
  61.             }  
  62.         } catch (IOException ex) {  
  63.             ex.printStackTrace();  
  64.         }  
  65.     }  
  66. }  

 

这种方法,如果数据的紧凑的,使用还是方便的,但是我发现,如果是空行或者是空列,他就会隔过去。具体的自己试试就知道了。

另外,也能看到这里得到Excel文件的方式是通过File,如果要引用到Struts2里,这是很简单的,因为Struts2上传时Action里定义的就是File或者File数组。



http://chatgpt.dhexx.cn/article/31uubAWD.shtml

相关文章

【Java】POI读取Excel的两种模式

用户模式 基本使用 usermodel相关包&#xff0c;对用户友好&#xff0c;在ss包下有统一的接口&#xff0c;但它是把整个文件读取到内存中&#xff0c;对于大量数据很容易内存溢出&#xff0c;所以只能用来处理小量数据 示例代码 public static List<Map<String, Stri…

使用POI读取EXCEL中的所有Sheet表

使用POI读取EXCEL中的所有Sheet表 最近接触到了多sheet页的导入导出功能&#xff0c;现举例如何 使用POI&#xff0c;通过多个循环读取EXCEL中的所有Sheet表内容。 package poitest; import java.io.File; import java.io.FileInputStream; import org.apache.poi.hssf.u…

poi读取Excel文档(.xls .xlsx)包含合并单元格

例子&#xff1a; 结果&#xff1a; 开始&#xff1a;----------------------------------- 导入的poi <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</ar…

Java教程:使用POI读取excel文档(根据BV1bJ411G7Aw整理)

Java教程&#xff1a;使用POI读取excel文档&#xff08;根据BV1bJ411G7Aw整理&#xff09; 最近公司需要我做一个导出Excel表格的功能&#xff0c;为此来学习一下POI&#xff0c;在这里记录一下学习笔记。B站直接搜BV1bJ411G7Aw就能找到视频。 一、简介 poi如何操作表格 二…

poi读取excel模板,并填充数据

一、POI介绍 Apache POI是Apache软件基金会的开放源码函式库&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 基本功能&#xff1a; HSSF &#xff0d; 提供读写Microsoft Excel格式档案的功能。 XSSF &#xff0d; 提供读写Microsoft Excel OOXM…

java使用poi操作读取Excel文件

在上代码之前首先说说Excel文件的一些名词 工作区workbook&#xff1a;可以理解为一个Excel文件&#xff0c;比如LinkL.xlsx文件 表sheet&#xff1a;一个.xlsx文件中的不同表 行row&#xff1a;表中的一行数据 单元格cell&#xff1a;每一行中的每一个数据就是单元格 附&…

使用Java通过POI读取EXCEL中的数据

这里有个Excel&#xff0c;怎么使用java读取excel中的数据呢&#xff1f; 文件存放位置&#xff1a; 首先引入poi的jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></…

使用POI读取excel文件内容

1.前言 项目中要求读取excel文件内容&#xff0c;并将其转化为xml格式。常见读取excel文档一般使用POI和JExcelAPI这两个工具。这里我们介绍使用POI实现读取excel文档。 2.代码实例&#xff1a; package edu.sjtu.erplab.poi;import java.io.FileInputStream;import java.io.Fi…

使用POI读取Excel文件

使用POI读取Excel文件 一、前言 用户可以通过上传excel文件&#xff0c;后端通过读取excel文件的内容并将内容写入数据库中以便更好的使用。 本文档使用的excel的工具类既可以读取有合并单元格的文件也可以读取没有合并单元格的文件&#xff0c;并且读取到单元格的数据进行了…

POI读写Excel的基本使用

一、Excel导入导出的应用场景 1、数据导入&#xff1a;减轻录入工作量 2、数据导出&#xff1a;统计信息归档 3、数据传输&#xff1a;异构系统之间数据传输 二、POI简介&#xff08;Apache POI&#xff09; 1、什么是POI Apache POI是Apache软件基金会的开放源码函式库&…

C# 加载DotNetBar组件

C#作为前端的开发软件&#xff0c;使用的人很多&#xff0c;但是原生的C#界面较为简陋&#xff0c;已经不能满足公司级的开发工作了&#xff0c;今天这篇博客的主要内容是讲一下怎么在C#端使用一个可以提升界面美感的第三方控件&#xff0c;DotNetBar 首先去官网下载最新的DotN…

DevComponents.DotNetBar2 美化包使用以及验证教程

使用这个美化包是在别人项目上看到的&#xff0c;遇到一些懵逼问题&#xff0c;不断总结&#xff0c;所以写一下教程 DotNetBar 美化包控件不可编辑问题&#xff1a; 如图&#xff1a; 解决办法&#xff1a; 安装DotNetBar 这个软件&#xff08;有试用版&#xff09;&#xff…

winform DevComponents.DotNetBar2 添加到工具栏方法

当C#项目引入皮肤组件&#xff0c;或其他组件是&#xff0c;发现工具框里面没有引用的组件怎么办&#xff1f; 1.组件的引用 我是把下载好的*.dll组件&#xff0c;复制到项目的\bin\Debug\路径下&#xff0c;然后在项目处右键-->添加引用&#xff0c;这样组件就引入项目了…

DotNetBar控件的多文档界面的实现

DotNetBar是一个不错的DotNET控件套装&#xff0c;原来是一个DLL文件&#xff0c;能够做出很漂亮的界面效果&#xff0c;记得在8.0以前的版本&#xff0c;好像实现多文档界面稍显得麻烦一些&#xff0c;我的Winform框架、WCF框架虽然也提供了这样多文档的界面&#xff0c;不过都…

C#之DotNetBar2使用方法 - itemPanel1

用itemPanel做个按钮菜单&#xff0c;模拟用来操控开关按钮 对象buttonItem1的属性&#xff08;itempanel可以添加的子控件列表对象&#xff0c;根据需要选择&#xff0c;这里用到的Button&#xff09; 可以用控件自带的样式&#xff0c;也可以用代码控制&#xff0c;也可以预先…

winfrom DotNetBar sideNav控件使用问题

sideNav初始UI 在最开始的界面&#xff0c;不知道设置了什么东西&#xff0c;然后没有那个东西 最后又新建了个项目&#xff0c;一个一个对比参数。还是没找到&#xff01;倒是发现几个其他的参数属性 在这里记录下 这是分别对应的是对sideNav的sideNavPanel的折叠 最大化 隐藏…

界面控件DotNetBar for WinForms使用教程:highlight组件使用教程

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。DotNetBar是全世界第一个引入全功能Office 2…

C#之DotNetBar2使用方法 - superTabControl1

C#版本&#xff1a;DevComponents.DotNetBar2 14.1.0 &#xff08;可以搜下各种版本&#xff09; 常用的控件使用属性&#xff0c;方法&#xff1b; 1&#xff09;superTabControl1 关闭和菜单设置方法 visibletrue/false closebox :关闭当前选中的TAB menubox:切换tab的菜…

DevComponents.DotNetBar2之SuperTabControl使用技巧

关于类似SuperTabControl的使用如何动态调整其TAB标签的顺序问题&#xff0c;搜了全网也没有找到类似答案&#xff0c;都提到tab键的顺序或者是通过控件界面进行调整其顺序&#xff0c;都不是想要的结果&#xff0c;有个网友问的类似问题但是没有一个答案可用。经过反复测试总结…

界面控件DotNetBar for WinForms使用教程:LayoutControl详解(二)

DotNetBar for WinForms是一个拥有89个组件的用户界面控件套包&#xff0c;用户可以使用Visual Studio 2005-2015轻松地创建专业的用户界面。十多年来DotNetBar帮助开发人员轻松地创建易用的专业Windows Forms (WinForms) 用户界面。 点击下载DotNetBar for WinForms最新试用版…