poi读取excel,包含所有excel版本,兼容excel2003和2007以上版本

合集下载

java使用POI读取excel数据

java使用POI读取excel数据

java使⽤POI读取excel数据⼀、定义 Apache POI是Apache软件基⾦会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

⼆、所需jar包:三、简单的⼀个读取excel的demo1、读取⽂件⽅法/*** 读取出filePath中的所有数据信息* @param filePath excel⽂件的绝对路径**/public static void getDataFromExcel(String filePath){//String filePath = "E:\\123.xlsx";//判断是否为excel类型⽂件if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx")){System.out.println("⽂件不是excel类型");}FileInputStream fis =null;Workbook wookbook = null;try{//获取⼀个绝对地址的流fis = new FileInputStream(filePath);}catch(Exception e){e.printStackTrace();}try{//2003版本的excel,⽤.xls结尾wookbook = new HSSFWorkbook(fis);//得到⼯作簿}catch (Exception ex){//ex.printStackTrace();try{//2007版本的excel,⽤.xlsx结尾wookbook = new XSSFWorkbook(fis);//得到⼯作簿} catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}}//得到⼀个⼯作表Sheet sheet = wookbook.getSheetAt(0);//获得表头Row rowHead = sheet.getRow(0);//判断表头是否正确if(rowHead.getPhysicalNumberOfCells() != 3){System.out.println("表头的数量不对!");}//获得数据的总⾏数int totalRowNum = sheet.getLastRowNum();//要获得属性String name = "";int latitude = 0;//获得所有数据for(int i = 1 ; i <= totalRowNum ; i++){//获得第i⾏对象Row row = sheet.getRow(i);//获得获得第i⾏第0列的 String类型对象Cell cell = row.getCell((short)0);name = cell.getStringCellValue().toString();//获得⼀个数字类型的数据cell = row.getCell((short)1);latitude = (int) cell.getNumericCellValue();System.out.println("名字:"+name+",经纬度:"+latitude); }}2、测试public static void main(String[] args){getDataFromExcel("E:"+ File.separator +"123.xlsx");}3、原始数据4、结果名字:A1,经纬度:1名字:A2,经纬度:2名字:A3,经纬度:3名字:A4,经纬度:4名字:A5,经纬度:5名字:A6,经纬度:6名字:A7,经纬度:7名字:A8,经纬度:8名字:A9,经纬度:9名字:A10,经纬度:10名字:A11,经纬度:11。

java poi读取2003或2007版本excl为list

java poi读取2003或2007版本excl为list

MAVEN配置<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.14</version></dependency>Java代码本段代码主要是读取2003和2007版本的excl文件,如果要读取所有sheet 的文本内容,可以在这基础上循环sheet,做些简单的封装即可。

package com.youku.core.utils;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import mons.fileupload.FileItem;import mons.io.FilenameUtils;import ng.StringUtils;import ermodel.HSSFWorkbook;import ermodel.Cell;import ermodel.Row;import ermodel.Sheet;import ermodel.Workbook;import ermodel.XSSFCell;import ermodel.XSSFRow;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;/*** Excel组件** @author sunyue* @version 2.0* @since 2.0*/publicabstractclass ExcelHelper {/*** Excel 2003*/privatefinalstatic String XLS = "xls";/*** Excel 2007*/privatefinalstatic String XLSX = "xlsx";/*** 由Excel文件的Sheet导出至List** @param file* @param sheetNum* @return*/publicstatic List<List<String>> readExcel(FileItem file, int sheetNum) throws IOException {String extensionName =FilenameUtils.getExtension(file.getName());InputStream is = file.getInputStream();return readExcel(is, extensionName, sheetNum);}/*** 读取excl文件** @param is* @param extensionName* @param sheetNum* @return* @throws IOException*/@SuppressWarnings("resource")privatestatic List<List<String>> readExcel(InputStream is, String extensionName, int sheetNum)throws IOException {if (extensionName.toLowerCase().equals(XLS)) {Workbook workbook = new HSSFWorkbook(is);Sheet sheet = workbook.getSheetAt(sheetNum);return getXlsSheetList(sheet);} elseif (extensionName.toLowerCase().equals(XLSX)) { XSSFWorkbook workbook = new XSSFWorkbook(is);XSSFSheet sheet = workbook.getSheetAt(sheetNum);return getXlsxSheetList(sheet);}else{returnnull;}}/*** 读取XLS后缀excl** @param workbook* @param sheetNum* @return* @throws IOException*/privatestatic List<List<String>> getXlsSheetList(Sheet sheet) {List<List<String>>result = new ArrayList<List<String>>();int minRow = sheet.getFirstRowNum();int maxRow = sheet.getLastRowNum();for (int rowIx = minRow; rowIx<= maxRow; rowIx++) {List<String>list = new ArrayList<String>();Row row = sheet.getRow(rowIx);int minCell = row.getFirstCellNum();int maxCell = row.getLastCellNum();for (int ci = minCell; ci<maxCell; ci++) {Cell cell = row.getCell(ci);if (cell != null) {cell.setCellType(XSSFCell.CELL_TYPE_STRING);String cellVal = cell.getStringCellValue();if(StringUtils.isNotBlank(cellVal)){list.add(cellVal);}else{list.add("");}}else{list.add("");}}result.add(list);}return result;}/*** 读取XLSX后缀excl** @param workbook* @param sheetNum* @return* @throws IOException*/privatestatic List<List<String>> getXlsxSheetList(XSSFSheet sheet) {List<List<String>>result = new ArrayList<List<String>>();try {int minRow = sheet.getFirstRowNum();int maxRow = sheet.getLastRowNum();for (int rowIx = minRow; rowIx<= maxRow; rowIx++) {List<String>list = new ArrayList<String>();XSSFRow row = sheet.getRow(rowIx);int minCell = row.getFirstCellNum();int maxCell = row.getLastCellNum();for (int ci = minCell; ci<maxCell; ci++) {XSSFCell cell = row.getCell(ci);if (cell != null) {cell.setCellType(XSSFCell.CELL_TYPE_STRING);String cellVal = cell.getStringCellValue();if(StringUtils.isNotBlank(cellVal)){list.add(cellVal);}else{list.add("");}}else{list.add("");}}result.add(list);}return result;} catch (Exception e) {e.printStackTrace();return result;}}}。

POI读取EXCEL教程

POI读取EXCEL教程

一、Excel基础二、HSSF概况三、通过usermodel读取文件四、通过usermodel写入文件五、通过eventusermodel读取文件六、HSSF电子表格结构七、通过HPSF读取文档属性八、文档摘要信息九、附录━━━━━━正文:━━━━━━在上一篇文章中,我们介绍了POI项目的基本概念,了解了如何用POI来读写OLE 2复合文档结构,并给出了两个简单的例子:用POI来读写Excel文件的Workbook流。

本文继续前文的话题,阐述如何用POI来读取/写入完整的Excel 文件。

约定:POI项目2.0版现在已经接近正式发行阶段,开发进度迅速,不断有新的功能集成到原有的系统,同时也有对原有系统的修改。

为了保证本文的及时性,本文将按照最近的1.9开发版说明。

虽然编译最近的发行版源代码也能正常运行,但现在的代码和2.0的发行版会有一些出入。

一、Excel基础Microsoft Excel 97文件格式也被称为BIFF8,最近版本的Excel只对该格式作了少量的改动。

增加对新格式的支持除了增加项目的复杂性之外,唯一的效果也许只是不得不使每个用户升级代码,没有什么实际的好处。

因此,在下文说明中,凡是提到Excel 97格式的地方其实都是指Excel从97到XP的格式。

二、HSSF概况POI项目实现的Excel 97文件格式称为HSSF——也许你已经猜到,HSSF是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”(微软使某些原本简单的事情过分复杂,同时又过分简单地处理了某些原本需要灵活性的事情,让人不胜佩服!)也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。

通过HSSF,你可以用纯Java代码来读取、写入、修改Excel 文件。

前面一篇文章提到了POIFS,那么HSSF和POIFS又有什么关系呢?就象其他POI的API一样,HSSF建立在 POIFS的基础上,因此在HSSF内的有些代码和前文的某些代码很相似。

poi操作excel(读取)

poi操作excel(读取)

poi操作excel(读取)poi读取excel有两种模式,⼀种是⽤户模式,⼀种是事件模式。

⽤户模式有许多封装好的⽅法操作简单,但创建太多的对象,⾮常耗内存。

当读取数据量太多时,就需要使⽤事件模式。

sax模式excel在07版后存储⽅式发⽣变化,因此事件模式也有两种读取接⼝。

⼀种读取excel03版以下;⼀种是excel07版以上,使⽤sax。

excel03版03版使⽤HSSFEventFactory来处理excel,HSSFEventFactory通过RecordFactoryInputStreaml循环获取Record.sid,将每⼀条送给HSSFRequest注册的监听器处理。

⽤户要处理每条记录还需要⾃定义⼀个HSSFListener,通过实例化processRecord(Record record)接⼝⽅法处理Record.sid。

关于Record.sid的类型,可以查看poi的api⽂档,⽂档有所有类型Record.sid的描述(这点⽐07版好,07版可能你还需要⾃⼰去找标签的意义)。

1、RecordFactoryInputStreaml:将数据转为Record.sid2、HSSFListener:监听获取每条Record.sid记录进⾏处理3、HSSFRequest:注册监听器HSSFEventFactory实例化代码⽰例:1/**2 * 初始化流监控3 * @param in4*/5public void readExcelContent(InputStream in,int rowNum){6this.rowNum = rowNum;7 POIFSFileSystem poifs = null;8 InputStream din = null;9try{10 poifs = new POIFSFileSystem(in);11 din = poifs.createDocumentInputStream("Workbook");12//这⼉为所有类型的Record都注册了监听器,如果需求明确的话,可以⽤addListener⽅法,并指定所需的Record类型13 HSSFRequest req = new HSSFRequest();14//添加监听记录的事件15 MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(this);16 formatListener = new FormatTrackingHSSFListener(listener); //监听代理,⽅便获取recordformat17 req.addListenerForAllRecords(formatListener);18//创建时间⼯⼚19 HSSFEventFactory factory = new HSSFEventFactory();20//处理基于时间⽂档流(循环获取每⼀条Record进⾏处理)21 factory.processEvents(req, din);22 }catch(Exception e){23throw new RuntimeException(e);24 }finally{25//关闭基于POI⽂档流26if (din != null) {27try {28 din.close();29 } catch (IOException io) {30throw new RuntimeException(io);31 }32 }33 }34 }excel07版excel07版是⼀种基于xml读取的发⽣取值,通过读取结构化的xml数据,取得表单数据。

java中poi解析Excel文件版本问题解决办法

java中poi解析Excel文件版本问题解决办法

java中poi解析Excel⽂件版本问题解决办法poi解析Excel⽂件版本问题解决办法poi解析Excel⽂件时有两种格式:HSSFWorkbook格式⽤来解析Excel2003(xls)的⽂件XSSFWorkbook格式⽤来解析Excel2007(xlsx)的⽂件如果⽤HSSFWorkbook解析Excel2007(xlsx)时就会报异常:“The supplied data appears to be in the Office 2007+ XML.You are calling the part of POI that deals with OLE2 Office Documents.You need to call a different part of POI to process this data (eg XSSF instead of HSSF)”因为HSSFWorkbook和XSSFWorkbook都实现了Workbook接⼝,所以我们可以⽤Workbook来解析两个版本的Excel。

代码如下:try{//将⽂件的输⼊流转换成WorkbookWorkbook wb = WorkbookFactory.create(numFile.getInputStream());//获得第⼀个⼯作表Sheet sheet = wb.getSheetAt(0);//获得第⼀⾏Row row = sheet.getRow(0);//获得第⼀⾏的第⼀列Cell cell = row.getCell(0);}catch (Exception e){e.printStackTrace();}以上就是poi解析Excel⽂件版本问题解决办法的详解,如有疑问请留⾔或者到本站社区交流讨论,谢谢⼤家对本站的⽀持!。

Java开发小技巧(六):使用ApachePOI读取Excel

Java开发小技巧(六):使用ApachePOI读取Excel

Java开发⼩技巧(六):使⽤ApachePOI读取Excel前⾔在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这⾥所说的数据源并⾮仅仅是指数据库,还包括excel、csv、xml等各种类型的数据接⼝⽂件,⽽这些⽂件中的数据不⼀定是结构化存储的,⽐如各种各样的报表⽂件,往往是⼀些复杂的表格结构,其中不仅有我们需要的数据,还有⼀些冗余的、⽆价值的数据,这时我们就⽆法直接⽤⼀般数据加载⼯具直接读取⼊库了。

也许你会想,数据源导出⽂件前先处理好数据就⾏了。

然⽽,实际开发中数据源往往是多个的,⽽且涉及到不同的部门甚⾄公司,这其间难免会出现各种⿇烦,甚⾄有些数据⽂件还是纯⼿⼯处理的,不⼀定能给到你满意的数据格式。

所以我们不讨论谁该负责转换的问题,这⾥主要介绍如何使⽤Apache POI来从Excel数据⽂件中读取我们想要的数据,以及⽤Bean Validation对数据内容按照预定的规则进⾏校验。

⽂章要点:Apache POI是什么如何使⽤Apache POI读取Excel⽂件使⽤Bean Validation进⾏数据校验Excel读取⼯具类使⽤实例Apache POI是什么Apache POI是⽤Java编写的免费开源的跨平台的Java API,提供API给Java程式对Microsoft Office格式档案进⾏读和写的操作。

如何使⽤Apache POI处理Excel⽂件1、导⼊Maven依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version></dependency>2、创建Workbook实例这⾥需要注意的是Excel⽂档的版本问题,Excel2003及以前版本的⽂档使⽤HSSFWorkbook对象,Excel2007及之后版本使⽤HSSFWorkbook对象// Excel2003及以前版本Workbook workbook = new XSSFWorkbook(new FileInputStream(path));// Excel2007及之后版本Workbook workbook = new HSSFWorkbook(new FileInputStream(path));3、获取Sheet表格页对象Sheet是Excel⽂档中的⼯作簿即表格页⾯,读取前要先找到数据所在页⾯,可以通过标签名或者索引的⽅式获取指定Sheet对象// 按索引获取Sheet sheet = workbook.getSheetAt(index);// 按标签名获取4、获取Cell单元格对象// ⾏索引row和列索引col都是以 0 起始Cell cell = sheet.getRow(row).getCell(col);5、获取单元格内容获取单元格的值之前⾸先要获知单元格内容的类型,在Excel中单元格有6种类型:1. CELL_TYPE_BLANK :空值2. CELL_TYPE_BOOLEAN :布尔型3. CELL_TYPE_ERROR :错误4. CELL_TYPE_FORMULA :公式型5. CELL_TYPE_STRING:字符串型6. CELL_TYPE_NUMERIC:数值型各种类型的内容还需要进⼀步判断其数据格式,例如单元格的Type为CELL_TYPE_NUMERIC时,它有可能是Date类型,在Excel中的Date 类型是以Double类型的数字存储的,不同类型的值要调⽤cell对象相应的⽅法去获取,具体情况具体分析public Object getCellValue(Cell cell) {if(cell == null) {return null;}switch (cell.getCellType()) {case Cell.CELL_TYPE_STRING:return cell.getRichStringCellValue().getString();case Cell.CELL_TYPE_NUMERIC:if (DateUtil.isCellDateFormatted(cell)) {return cell.getDateCellValue();} else {return cell.getNumericCellValue();}case Cell.CELL_TYPE_BOOLEAN:return cell.getBooleanCellValue();case Cell.CELL_TYPE_FORMULA:return formula.evaluate(cell).getNumberValue();default:return null;}}6、关闭Workbook对象workbook.close();使⽤Bean Validation进⾏数据校验当你要处理⼀个业务逻辑时,数据校验是你不得不考虑和⾯对的事情,程序必须通过某种⼿段来确保输⼊进来的数据从语义上来讲是正确的或者符合预定义的格式,⼀个Java程序⼀般是分层设计的,⽽不同的层可能是不同的开发⼈员来完成,这样就很容易出现不同的层重复进⾏数据验证逻辑,导致代码冗余等问题。

利用POI读取word、Excel文件的最佳实践教程

利用POI读取word、Excel文件的最佳实践教程

利⽤POI读取word、Excel⽂件的最佳实践教程前⾔是 Apache 旗下⼀款读写微软家⽂档声名显赫的类库。

应该很多⼈在做报表的导出,或者创建 word ⽂档以及读取之类的都是⽤过 POI。

POI 也的确对于这些操作带来很⼤的便利性。

我最近做的⼀个⼯具就是读取计算机中的 word 以及 excel ⽂件。

POI结构说明包名称说明HSSF提供读写Microsoft Excel XLS格式档案的功能。

XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。

HWPF提供读写Microsoft Word DOC格式档案的功能。

HSLF提供读写Microsoft PowerPoint格式档案的功能。

HDGF提供读Microsoft Visio格式档案的功能。

HPBF提供读Microsoft Publisher格式档案的功能。

HSMF提供读Microsoft Outlook格式档案的功能。

下⾯就word和excel两⽅⾯讲解以下遇到的⼀些坑:word 篇对于 word ⽂件,我需要的就是提取⽂件中正⽂的⽂字。

所以可以创建⼀个⽅法来读取 doc 或者 docx ⽂件:private static String readDoc(String filePath, InputStream is) {String text= "";try {if (filePath.endsWith("doc")) {WordExtractor ex = new WordExtractor(is);text = ex.getText();ex.close();is.close();} else if(filePath.endsWith("docx")) {XWPFDocument doc = new XWPFDocument(is);XWPFWordExtractor extractor = new XWPFWordExtractor(doc);text = extractor.getText();extractor.close();is.close();}} catch (Exception e) {logger.error(filePath, e);} finally {if (is != null) {is.close();}}return text;}理论上来说,这段代码应该对于读取⼤多数 doc 或者 docx ⽂件都是有效的。

关于POI解析Excel文件(03和07版本不同)的问题

关于POI解析Excel文件(03和07版本不同)的问题

关于POI解析Excel⽂件(03和07版本不同)的问题问题描述:在使⽤poi包进⾏excel解析时,发现对Excel2003以前(包括2003)的版本没有问题,但读取Excel2007时发⽣如下异常:org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)。

原因分析:XSSF不能读取Excel2003以前(包括2003)的版本,如果遇到2007版本的Excel⽂件就需要在读取前判断⽂件是2003前的版本还是2007的版本,然后对应调⽤HSSF或XSSF来读取。

解决⽅式:⽬前只能通过后缀名来判断⽂件版本,代码如下:(如果有⾼⼿知道别的解决⽅法,请告知,谢谢!)1public static boolean isExcel2003(String filePath)2 {34return filePath.matches("^.+\\.(?i)(xls)$");56 }获得版本号之后,根据版本号的不同创建不同的对象,代码如下:1/** 根据版本选择创建Workbook的⽅式 */23 Workbook wb = null;45if (isExcel2003)6 {7 wb = new HSSFWorkbook(inputStream);8 }9else10 {11 wb = new XSSFWorkbook(inputStream);12 }。

POI导出Excel的三种workbook的区别

POI导出Excel的三种workbook的区别

POI导出Excel的三种workbook的区别
三种workbook分别是HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook
第⼀种:HSSFWorkbook
针对EXCEL 2003版本,扩展名为.xls,此种的局限就是导出的⾏数最多为65535⾏。

因为导出⾏数受限,不⾜7万⾏,所以⼀般不会发送内存溢出(OOM)的情况
第⼆种:XSSFWorkbook
这种形式的出现是由于第⼀种HSSF的局限性产⽣的,因为其导出⾏数较少,XSSFWorkbook应运⽽⽣,其对应的是EXCEL2007+ ,扩展名为.xlsx ,最多可以导出104万⾏,不过这样就伴随着⼀个问题–OOM内存溢出。

因为使⽤XSSFWorkbook创建的book sheet row cell 等是存在内存中的,并没有持久化到磁盘上,那么随着数据量的增⼤,内存的需求量也就增⼤。

那么很有可能出现 OOM了,那么怎么解决呢?
第三种:SXSSFWorkbook poi.jar 3.8+
SXSSFWorkbook可以根据⾏数将内存中的数据持久化写到⽂件中。

此种的情况就是设置最⼤内存条数,⽐如设置最⼤内存量为5000⾏, new SXSSFWookbook(5000),当⾏数达到 5000 时,把内存持久化写到⽂件中,以此逐步写⼊,避免OOM。

这样就完美解决了⼤数据下导出的问题。

POI判断excel文件版本

POI判断excel文件版本
传入的inputstream用bufferedinputstream装饰一层如果直接传入inputstream如果流不支持markreset机制会抛出javaioioexception
POI判断 excel文件版本
1 通过POIFSFileSystem.hasPOIFSHeader(InputStream is);判断Excel 2003及以下
2通过POIXMLDocument.hasOOXMLHeader(InputStream is);判断Excel 2007及以上
这种判断,即使将excel文件后缀变换,也会正确识别,比如将.xlsx人为换成xls导入,还是能识别出为2007以上版本。
注意:传入的InputStream用BufferedInputStream装饰一层,如果直接传入InputStream,如果流不支持mark/reset机制,会抛出 java.io.IOException: mark/reset not supported
最后附上示例:
public static void main(String[] args)throws Exception { File file = new File("D:\\docs\\work\\需求排期安排.xlsx"); InputStream is = new FileInputStream(file); //这里用BufferedInputStream再包装一层,可解决:mark/reset not supported问题 BufferedInputStream bis = new BufferedInputStream(is); if(POIFSFileSystem.hasPOIFSHeader(bis)) { System.out.println("2003及

使用POI解析Excel

使用POI解析Excel

使⽤POI解析ExcelExcel作为⼀种常⽤的数据存储格式,在很多项⽬中都会有相应的导⼊导出的功能。

这篇⽂章会介绍如何使⽤Java操作Excel,以及如何解决⼤⽂件读写时内存溢出的问题。

1、OpenXML标准Word、Excel、PPT是Office办公套件中最常⽤的三个组件。

早期的Office套件使⽤⼆进制格式,这⾥⾯包括以.doc、.xls、.ppt为后缀的⽂件;直到07这个划时代的版本将基于XML的压缩格式作为默认⽂件格式,也就是相应以.docx、.xlsx、.pptx为后缀的⽂件。

这个结合了XML与Zip压缩技术的新⽂件格式使⽤的是OpenXML标准。

微软从2000年开始酝酿这项技术标准,到2006年申请成为ECMA-376,然后在Office2007中⽤作默认的⽂件格式,再到08年成为了ISO / IEC 29500国际标准,后续每两三年就会发布⼀个新版本。

Office的⼀路凯歌⽆不彰显微软雄厚的实⼒。

所以说三流公司做产品,⼆流公司做平台,⼀流公司定标准。

微软的官⽅⽂档中详细介绍了WordprocessingML(Word)、SpreadsheetML(Excel)、PresentationML(PPT)三个标准,这⾥主要介绍Excel的部分内容。

⾸先Excel⼏个最基础的概念:⼀个Excel就是⼀个⼯作簿(Workbook)⼀个Sheet就是⼀张表格⼀个Workbook可以包含多个Sheet每⼀⾏Row的每⼀列就是⼀个单元格(Cell)因为07版后的.xlsx本质上就是⼀个压缩包,我们完全可以⽤解压⼯具打开它。

⼀个基础的Excel解压之后更典型的Excel还包括:数字、⽂本、公式、图表(Chart)、普通列表(Table)、数据透视表(Pivot Table)等内容。

Excel远⽐我们想象的复杂2、使⽤POI操作ExcelJava领域最常见的两个操作Excel的⼯具库分别是和Apache的。

poiexcel批量导入解决各类型的数据

poiexcel批量导入解决各类型的数据

poiexcel批量导入解决各类型的数据注意引入的都是poi的包,使用Cell,excel2003的.xls对应是HSSFCell,而之后的xlsx对应的则是XSSFCell,但是他们都继承于Cell,所以使用Cell就可以使用两种格式的excel导入了,下面解决excel中数据的各种格式[java] view plain copy1.//读取excel2.try {3.request.setCharacterEncoding("gbk");4.response.setContentType("text/html;charset=gbk");5.// 1. 创建工厂类6.DiskFileItemFactory factory = new DiskFileItemFactory();7.// 2. 创建FileUpload对象8.ServletFileUpload upload = new ServletFileUpload(factor y);9.10.// 3. 判断是否是上传表单11.// boolean b = upload.isMultipartContent(request);12.// 设置上传文件最大值13.upload.setSizeMax(25 * 1024 * 1024);14.// 是文件上传表单15.// 4. 解析request,获得FileItem项16.List<FileItem> fileitems = upload.parseRequest(reque st);17.// 5. 遍历集合18.for (FileItem item : fileitems) {19.// 判断是不是普通字段20.if (!item.isFormField()) {21.// 获得流,读取数据写入文件22.InputStream in = item.getInputStream();23.Workbook book = createWorkBook(in,item.getName() );24.// 获得第一个工作表对象25.Sheet sheet = book.getSheetAt(0);26.if(0==sheet.getLastRowNum()){27.//如果没有数据28.request.setAttribute("message", "excel的sheet0中不存在数据");29.request.getRequestDispatcher("/cc/util/excelToData.js p").forward(request, response);30.}31.32.// 第一行为标题,从第二行开始录入33.for (int i = 1; i <= sheet.getLastRowNum(); i++) {34.//标题行,用来对比方便得到数据35.Row titleRow = sheet.getRow(0);36.//数据行37.Row row = sheet.getRow(i);38.//获得值39.String value_temp= this.getValue((Cell) row.getCell(2));40.}41.}42.}43.44.} catch (Exception e) {45. e.printStackTrace();46.message="导入失败<br/>"+message;47.request.setAttribute("message",message);48.request.getRequestDispatcher("/cc/util/excelToData.js p").forward(request, response);49.50.}数字类型时间类型字符串类型验证没问题,数字类型如果是1234.0会将其变成1234 如果是1234.5保存仍然保持小数位1234.5,用来解决电话号码和普通数字问题时间类型将其格式化成了2015-12-09 12:13:12这种格式便于保存数据库[java] view plain copy1.//解决excel类型问题,获得数值2.public String getValue(Cell cell) {3.String value = "";4.if(null==cell){5.return value;6.}7.switch (cell.getCellType()) {8.//数值型9.case Cell.CELL_TYPE_NUMERIC:10.if (HSSFDateUtil.isCellDateFormatted(cell)) {11.//如果是date类型则,获取该cell的date值12.Date date = HSSFDateUtil.getJavaDate(cell.getNumeri cCellValue());13.SimpleDateFormat format = new SimpleDateFormat(" yyyy-MM-dd HH:mm:ss");14.value = format.format(date);;15.}else {// 纯数字16.BigDecimal big=new BigDecimal(cell.getNumericCellV alue());17.value = big.toString();18.//解决1234.0 去掉后面的.019.if(null!=value&&!"".equals(value.trim())){20.String[] item = value.split("[.]");21.if(1<item.length&&"0".equals(item[1])){22.value=item[0];23.}24.}25.}26.break;27.//字符串类型28.case Cell.CELL_TYPE_STRING:29.value = cell.getStringCellValue().toString();30.break;31.// 公式类型32.case Cell.CELL_TYPE_FORMULA:33.//读公式计算值34.value = String.valueOf(cell.getNumericCellValue());35.if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串36.value = cell.getStringCellValue().toString();37.}38.break;39.// 布尔类型40.case Cell.CELL_TYPE_BOOLEAN:41.value = " "+ cell.getBooleanCellValue();42.break;43.// 空值44.case Cell.CELL_TYPE_BLANK:45.value = "";46.LogUtil.getLogger().error("excel出现空值");47.break;48.// 故障49.case Cell.CELL_TYPE_ERROR:50.value = "";51.LogUtil.getLogger().error("excel出现故障");52.break;53.default:54.value = cell.getStringCellValue().toString();55.}56.if("null".endsWith(value.trim())){57.value="";58.}59.return value;60.}。

java的poi技术读取Excel数据

java的poi技术读取Excel数据

java的poi技术读取Excel数据这篇blog主要是讲述java中poi读取excel,⽽excel的版本包括:2003-2007和2010两个版本,即excel的后缀名为:xls和xlsx。

读取excel和MySQL相关:你也可以在:了解到写⼊Excel的⽅法信息使⽤JXL技术:下⾯是本⽂的项⽬结构:项⽬中所需要的jar⽂件:所⽤的Excel数据(2003-2007,2010都是⼀样的数据)运⾏效果:=================================================源码部分:================================================= /Excel2010/src/com/b510/common/Common.java1 /**2 *3 */4 package mon;56 /**7 * @author Hongten8 * @created 2014-5-219 */10 public class Common {1112 public static final String OFFICE_EXCEL_2003_POSTFIX = "xls";13 public static final String OFFICE_EXCEL_2010_POSTFIX = "xlsx";1415 public static final String EMPTY = "";16 public static final String POINT = ".";17 public static final String LIB_PATH = "lib";18 public static final String STUDENT_INFO_XLS_PATH = LIB_PATH + "/student_info" + POINT + OFFICE_EXCEL_2003_POSTFIX;19 public static final String STUDENT_INFO_XLSX_PATH = LIB_PATH + "/student_info" + POINT + OFFICE_EXCEL_2010_POSTFIX;20 public static final String NOT_EXCEL_FILE = " : Not the Excel file!";21 public static final String PROCESSING = "Processing...";2223 }/Excel2010/src/com/b510/excel/ReadExcel.java1 /**2 *3 */4 package com.b510.excel;56 import java.io.FileInputStream;7 import java.io.IOException;8 import java.io.InputStream;9 import java.util.ArrayList;10 import java.util.List;1112 import ermodel.HSSFCell;13 import ermodel.HSSFRow;14 import ermodel.HSSFSheet;15 import ermodel.HSSFWorkbook;16 import ermodel.XSSFCell;17 import ermodel.XSSFRow;18 import ermodel.XSSFSheet;19 import ermodel.XSSFWorkbook;2021 import mon;22 import com.b510.excel.util.Util;23 import com.b510.excel.vo.Student;2425 /**26 * @author Hongten27 * @created 2014-5-2028 */29 public class ReadExcel {3031 /**32 * read the Excel file33 * @param path the path of the Excel file34 * @return35 * @throws IOException36 */37 public List<Student> readExcel(String path) throws IOException {38 if (path == null || Common.EMPTY.equals(path)) {39 return null;40 } else {41 String postfix = Util.getPostfix(path);42 if (!Common.EMPTY.equals(postfix)) {43 if (Common.OFFICE_EXCEL_2003_POSTFIX.equals(postfix)) {44 return readXls(path);45 } else if (Common.OFFICE_EXCEL_2010_POSTFIX.equals(postfix)) {46 return readXlsx(path);47 }48 } else {49 System.out.println(path + Common.NOT_EXCEL_FILE);50 }51 }52 return null;53 }5455 /**56 * Read the Excel 201057 * @param path the path of the excel file58 * @return59 * @throws IOException60 */61 public List<Student> readXlsx(String path) throws IOException {62 System.out.println(Common.PROCESSING + path);63 InputStream is = new FileInputStream(path);64 XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);65 Student student = null;66 List<Student> list = new ArrayList<Student>();67 // Read the Sheet68 for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {69 XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);70 if (xssfSheet == null) {71 continue;72 }73 // Read the Row74 for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {75 XSSFRow xssfRow = xssfSheet.getRow(rowNum);76 if (xssfRow != null) {77 student = new Student();78 XSSFCell no = xssfRow.getCell(0);79 XSSFCell name = xssfRow.getCell(1);80 XSSFCell age = xssfRow.getCell(2);81 XSSFCell score = xssfRow.getCell(3);82 student.setNo(getValue(no));83 student.setName(getValue(name));84 student.setAge(getValue(age));85 student.setScore(Float.valueOf(getValue(score)));86 list.add(student);87 }88 }89 }90 return list;91 }9293 /**94 * Read the Excel 2003-200795 * @param path the path of the Excel96 * @return97 * @throws IOException98 */99 public List<Student> readXls(String path) throws IOException {100 System.out.println(Common.PROCESSING + path);101 InputStream is = new FileInputStream(path);102 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);103 Student student = null;104 List<Student> list = new ArrayList<Student>();105 // Read the Sheet106 for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) { 107 HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);108 if (hssfSheet == null) {109 continue;110 }111 // Read the Row112 for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {113 HSSFRow hssfRow = hssfSheet.getRow(rowNum);114 if (hssfRow != null) {115 student = new Student();116 HSSFCell no = hssfRow.getCell(0);117 HSSFCell name = hssfRow.getCell(1);118 HSSFCell age = hssfRow.getCell(2);119 HSSFCell score = hssfRow.getCell(3);120 student.setNo(getValue(no));121 student.setName(getValue(name));122 student.setAge(getValue(age));123 student.setScore(Float.valueOf(getValue(score)));124 list.add(student);125 }126 }127 }128 return list;129 }130131 @SuppressWarnings("static-access")132 private String getValue(XSSFCell xssfRow) {133 if (xssfRow.getCellType() == xssfRow.CELL_TYPE_BOOLEAN) {134 return String.valueOf(xssfRow.getBooleanCellValue());135 } else if (xssfRow.getCellType() == xssfRow.CELL_TYPE_NUMERIC) {136 return String.valueOf(xssfRow.getNumericCellValue());137 } else {138 return String.valueOf(xssfRow.getStringCellValue());139 }140 }141142 @SuppressWarnings("static-access")143 private String getValue(HSSFCell hssfCell) {144 if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {145 return String.valueOf(hssfCell.getBooleanCellValue());146 } else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {147 return String.valueOf(hssfCell.getNumericCellValue());148 } else {149 return String.valueOf(hssfCell.getStringCellValue());150 }151 }152 }/Excel2010/src/com/b510/excel/client/Client.java1 /**2 *3 */4 package com.b510.excel.client;56 import java.io.IOException;7 import java.util.List;89 import mon;10 import com.b510.excel.ReadExcel;11 import com.b510.excel.vo.Student;1213 /**14 * @author Hongten15 * @created 2014-5-2116 */17 public class Client {1819 public static void main(String[] args) throws IOException {20 String excel2003_2007 = Common.STUDENT_INFO_XLS_PATH;21 String excel2010 = Common.STUDENT_INFO_XLSX_PATH;22 // read the 2003-2007 excel23 List<Student> list = new ReadExcel().readExcel(excel2003_2007);24 if (list != null) {25 for (Student student : list) {26 System.out.println("No. : " + student.getNo() + ", name : " + student.getName() + ", age : " + student.getAge() + ", score : " + student.getScore());27 }28 }29 System.out.println("======================================");30 // read the 2010 excel31 List<Student> list1 = new ReadExcel().readExcel(excel2010);32 if (list1 != null) {33 for (Student student : list1) {34 System.out.println("No. : " + student.getNo() + ", name : " + student.getName() + ", age : " + student.getAge() + ", score : " + student.getScore());35 }36 }37 }38 }/Excel2010/src/com/b510/excel/util/Util.java1 /**2 *3 */4 package com.b510.excel.util;56 import mon;78 /**9 * @author Hongten10 * @created 2014-5-2111 */12 public class Util {1314 /**15 * get postfix of the path16 * @param path17 * @return18 */19 public static String getPostfix(String path) {20 if (path == null || Common.EMPTY.equals(path.trim())) {21 return Common.EMPTY;22 }23 if (path.contains(Common.POINT)) {24 return path.substring(stIndexOf(Common.POINT) + 1, path.length());25 }26 return Common.EMPTY;27 }28 }/Excel2010/src/com/b510/excel/vo/Student.java1 /**2 *3 */4 package com.b510.excel.vo;56 /**7 * Student8 *9 * @author Hongten10 * @created 2014-5-1811 */12 public class Student {13 /**14 * id15 */16 private Integer id;17 /**18 * 学号19 */20 private String no;21 /**22 * 姓名23 */24 private String name;25 /**26 * 学院27 */28 private String age;29 /**30 * 成绩31 */32 private float score;3334 public Integer getId() {35 return id;36 }3738 public void setId(Integer id) {39 this.id = id;40 }4142 public String getNo() {43 return no;44 }4546 public void setNo(String no) {47 this.no = no;48 }4950 public String getName() {51 return name;52 }5354 public void setName(String name) {55 = name;56 }5758 public String getAge() {59 return age;60 }6162 public void setAge(String age) {63 this.age = age;64 }6566 public float getScore() {67 return score;68 }6970 public void setScore(float score) {71 this.score = score;72 }7374 }。

poi 读取数据的正确方法

poi 读取数据的正确方法

poi 读取数据的正确方法POI是一个功能强大的Java库,可以用于读取、写入和操作Microsoft Office格式的文档,如Excel、Word和PowerPoint。

使用POI读取数据的正确方法如下:1. 导入POI库:首先,确保已经在项目中导入了POI库的jar文件。

你可以从Apache POI的官方网站上下载最新的POI库。

2. 创建工作簿:使用POI库的HSSFWorkbook类创建一个新的Excel工作簿对象。

工作簿是Excel文档的最高级别容器,可以包含多个工作表。

3. 打开工作表:使用工作簿对象的getSheet()方法打开特定的工作表。

在括号中传入工作表的名称或索引。

4. 读取单元格数据:使用工作表对象的getRow()和getCell()方法读取单元格中的数据。

getRow()方法根据行号获取行对象,getCell()方法根据列号或索引获取单元格对象。

使用单元格对象的getStringCellValue()、getNumericCellValue()或getDateCellValue()等方法获取特定类型的数据。

5. 遍历单元格数据:可以使用循环结构遍历工作表中所有单元格的数据。

首先使用工作表对象的getLastRowNum()方法获取最后一行的行号,然后使用getRow()和getCell()方法遍历每个单元格。

以下是一个简单的示例代码,演示如何使用POI读取Excel文件中的数据:```javaimport java.io.FileInputStream;import java.io.IOException;import ermodel.HSSFWorkbook;import ermodel.*;public class ExcelReader {public static void main(String[] args) {try {FileInputStream file = new FileInputStream("path/to/excel/file.xls"); Workbook workbook = new HSSFWorkbook(file);Sheet sheet = workbook.getSheet("Sheet1");// 遍历每一行和每一列,并读取数据for (Row row : sheet) {for (Cell cell : row) {if (cell.getCellType() == CellType.STRING) {System.out.print(cell.getStringCellValue() + "\t");} else if (cell.getCellType() == CellType.NUMERIC) {System.out.print(cell.getNumericCellValue() + "\t");} else if (cell.getCellType() == CellType.BOOLEAN) {System.out.print(cell.getBooleanCellValue() + "\t");}}System.out.println(); // 换行}workbook.close();file.close();} catch (IOException e) {e.printStackTrace();}}}```以上是使用POI读取数据的正确方法。

JAVA用POI读取和创建2003和2007版本Excel完美示例

JAVA用POI读取和创建2003和2007版本Excel完美示例

import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.Date;import java.util.LinkedList;import java.util.List;import ermodel.HSSFCell;import ermodel.HSSFCellStyle;import ermodel.HSSFDataFormat;import ermodel.HSSFDateUtil;import ermodel.HSSFFont;import ermodel.HSSFRow;import ermodel.HSSFSheet;import ermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor;import ermodel.XSSFCell;import ermodel.XSSFCellStyle;import ermodel.XSSFFont;import ermodel.XSSFRow;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;/*** 可以从bbb:/// 这里下载到POI的jar包POI创建和读取2003-2007版本Excel文件**/public class CreatAndReadExcel {public static void main(String[] args) throws Exception {creat2003Excel();// 创建2007版Excel文件creat2007Excel();// 创建2003版Excel文件//读取2003Excel文件String path2003 = System.getProperty("user.dir")+ System.getProperty("file.separator") + "style_2003.xls";// 获取项目文件路+2003版文件名System.out.println("路径:" + path2003);File f2003 = new File(path2003);try {readExcel(f2003);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}//读取2007Excel文件String path2007 = System.getProperty("user.dir")+ System.getProperty("file.separator") + "style_2007.xlsx";// 获取项目文件路径+2007版文件名System.out.println("路径:" + path2007);File f2007 = new File(path2007);try {readExcel(f2007);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 创建2007版Excel文件** @throws FileNotFoundException* @throws IOException*/private static void creat2007Excel() throws FileNotFoundException,IOException {// HSSFWorkbook workBook = new HSSFWorkbook();// 创建一个excel文档对象XSSFWorkbook workBook = new XSSFWorkbook();XSSFSheet sheet = workBook.createSheet();// 创建一个工作薄对象sheet.setColumnWidth(1, 10000);// 设置第二列的宽度为XSSFRow row = sheet.createRow(1);// 创建一个行对象row.setHeightInPoints(23);// 设置行高23像素XSSFCellStyle style = workBook.createCellStyle();// 创建样式对象// 设置字体XSSFFont font = workBook.createFont();// 创建字体对象font.setFontHeightInPoints((short) 15);// 设置字体大小font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置粗体font.setFontName("黑体");// 设置为黑体字style.setFont(font);// 将字体加入到样式对象// 设置对齐方式style.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);// 水平居中style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中// 设置边框style.setBorderTop(HSSFCellStyle.BORDER_THICK);// 顶部边框粗线style.setTopBorderColor(HSSFColor.RED.index);// 设置为红色style.setBorderBottom(HSSFCellStyle.BORDER_DOUBLE);// 底部边框双线style.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);// 左边边框style.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);// 右边边框// 格式化日期style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); XSSFCell cell = row.createCell(1);// 创建单元格cell.setCellValue(new Date());// 写入当前日期cell.setCellStyle(style);// 应用样式对象// 文件输出流FileOutputStream os = new FileOutputStream("style_2007.xlsx");workBook.write(os);// 将文档对象写入文件输出流os.close();// 关闭文件输出流System.out.println("创建成功office 2007 excel");}/*** 创建2003版本的Excel文件*/private static void creat2003Excel() throws FileNotFoundException,IOException {HSSFWorkbook workBook = new HSSFWorkbook();// 创建一个excel文档对象HSSFSheet sheet = workBook.createSheet();// 创建一个工作薄对象sheet.setColumnWidth(1, 10000);// 设置第二列的宽度为HSSFRow row = sheet.createRow(1);// 创建一个行对象row.setHeightInPoints(23);// 设置行高23像素HSSFCellStyle style = workBook.createCellStyle();// 创建样式对象// 设置字体HSSFFont font = workBook.createFont();// 创建字体对象font.setFontHeightInPoints((short) 15);// 设置字体大小font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 设置粗体font.setFontName("黑体");// 设置为黑体字style.setFont(font);// 将字体加入到样式对象// 设置对齐方式style.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);// 水平居中style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中// 设置边框style.setBorderTop(HSSFCellStyle.BORDER_THICK);// 顶部边框粗线style.setTopBorderColor(HSSFColor.RED.index);// 设置为红色style.setBorderBottom(HSSFCellStyle.BORDER_DOUBLE);// 底部边框双线style.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);// 左边边框style.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);// 右边边框// 格式化日期style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));HSSFCell cell = row.createCell(1);// 创建单元格cell.setCellValue(new Date());// 写入当前日期cell.setCellStyle(style);// 应用样式对象// 文件输出流FileOutputStream os = new FileOutputStream("style_2003.xls");workBook.write(os);// 将文档对象写入文件输出流os.close();// 关闭文件输出流System.out.println("创建成功office 2003 excel");}/*** 对外提供读取excel 的方法*/public static List<List<Object>> readExcel(File file) throws IOException { String fileName = file.getName();String extension = stIndexOf(".") == -1 ? "" : fileName.substring(stIndexOf(".") + 1);if ("xls".equals(extension)) {return read2003Excel(file);} else if ("xlsx".equals(extension)) {return read2007Excel(file);} else {throw new IOException("不支持的文件类型");}}/*** 读取office 2003 excel** @throws IOException* @throws FileNotFoundException*/private static List<List<Object>> read2003Excel(File file)throws IOException {List<List<Object>> list = new LinkedList<List<Object>>();HSSFWorkbook hwb = new HSSFWorkbook(new FileInputStream(file));HSSFSheet sheet = hwb.getSheetAt(0);Object value = null;HSSFRow row = null;HSSFCell cell = null;System.out.println("读取office 2003 excel内容如下:");for (int i = sheet.getFirstRowNum(); i <= sheet.getPhysicalNumberOfRows(); i++) {row = sheet.getRow(i);if (row == null) {continue;}List<Object> linked = new LinkedList<Object>();for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {cell = row.getCell(j);if (cell == null) {continue;}DecimalFormat df = new DecimalFormat("0");// 格式化number String// 字符SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串DecimalFormat nf = new DecimalFormat("0.00");// 格式化数字switch (cell.getCellType()) {case XSSFCell.CELL_TYPE_STRING:// System.out.println(i + "行" + j + " 列is String type");value = cell.getStringCellValue();System.out.print(" " + value + " ");break;case XSSFCell.CELL_TYPE_NUMERIC:// System.out.println(i + "行" + j// + " 列is Number type ; DateFormt:"// + cell.getCellStyle().getDataFormatString());if ("@".equals(cell.getCellStyle().getDataFormatString())) {value = df.format(cell.getNumericCellValue());} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {value = nf.format(cell.getNumericCellValue());} else {value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));}System.out.print(" " + value + " ");break;case XSSFCell.CELL_TYPE_BOOLEAN:// System.out.println(i + "行" + j + " 列is Boolean type");value = cell.getBooleanCellValue();System.out.print(" " + value + " ");break;case XSSFCell.CELL_TYPE_BLANK:// System.out.println(i + "行" + j + " 列is Blank type");value = "";System.out.print(" " + value + " ");break;default:// System.out.println(i + "行" + j + " 列is default type");value = cell.toString();System.out.print(" " + value + " ");}if (value == null || "".equals(value)) {continue;}linked.add(value);}System.out.println("");list.add(linked);}return list;}/*** 读取Office 2007 excel*/private static List<List<Object>> read2007Excel(File file)throws IOException {List<List<Object>> list = new LinkedList<List<Object>>();// String path = System.getProperty("user.dir") +// System.getProperty("file.separator")+"dd.xlsx";// System.out.println("路径:"+path);// 构造XSSFWorkbook 对象,strPath 传入文件路径XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));// 读取第一章表格内容XSSFSheet sheet = xwb.getSheetAt(0);Object value = null;XSSFRow row = null;XSSFCell cell = null;System.out.println("读取office 2007 excel内容如下:");for (int i = sheet.getFirstRowNum(); i <= sheet.getPhysicalNumberOfRows(); i++) {row = sheet.getRow(i);if (row == null) {continue;}List<Object> linked = new LinkedList<Object>();for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {cell = row.getCell(j);if (cell == null) {continue;}DecimalFormat df = new DecimalFormat("0");// 格式化number String// 字符SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串DecimalFormat nf = new DecimalFormat("0.00");// 格式化数字switch (cell.getCellType()) {case XSSFCell.CELL_TYPE_STRING:// System.out.println(i + "行" + j + " 列is String type");value = cell.getStringCellValue();System.out.print(" " + value + " ");break;case XSSFCell.CELL_TYPE_NUMERIC:// System.out.println(i + "行" + j// + " 列is Number type ; DateFormt:"// + cell.getCellStyle().getDataFormatString());if ("@".equals(cell.getCellStyle().getDataFormatString())) {value = df.format(cell.getNumericCellValue());} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {value = nf.format(cell.getNumericCellValue());} else {value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));}System.out.print(" " + value + " ");break;case XSSFCell.CELL_TYPE_BOOLEAN:// System.out.println(i + "行" + j + " 列is Boolean type");value = cell.getBooleanCellValue();System.out.print(" " + value + " ");break;case XSSFCell.CELL_TYPE_BLANK:// System.out.println(i + "行" + j + " 列is Blank type");value = "";// System.out.println(value);break;default:// System.out.println(i + "行" + j + " 列is default type");value = cell.toString();System.out.print(" " + value + " ");}if (value == null || "".equals(value)) {continue;}linked.add(value);}System.out.println("");list.add(linked);}return list;}}[文档可能无法思考全面,请浏览后下载,另外祝您生活愉快,工作顺利,万事如意!]。

JavaPOI读取excel支持xls、xlsx

JavaPOI读取excel支持xls、xlsx

JavaPOI读取excel支持xls、xlsxJava POI读取excel 支持xls、xlsximport java.io.File;import java.io.FileInputStream;import java .util.List;import ermodel.HSSFPicture;import o ermodel.HSSFPictureData;import org.apach ermodel.HSSFShape;import er model.HSSFSheet;import ermodel.HSSFW orkbook;import ermodel.Cell;import org.ap ermodel.DateUtil;import ermo del.Row;public final class T estImportExcel {public static void main(String[] args) throws Exception {File excelFile = new File("test.xls"); HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(excelFile)); HSS FSheet sheet = wb.getSheetAt(0);for (Row row : sheet) { for (Cell cell : row) { s witch (cell.getCellType()) { case Cell.CELL_TYPE_STRING: System.out.print(cell.getRichStringCellValue().getString());break; case Cell.CELL_TYPE_NUMERIC: if (DateUtil.isCellDateFormatted(cell)) {System.out.print(String.valueOf(cell.getDateCellValue()));} else {System.out.print(cell.getNumericCellValue());} break; case Cell.CELL_TYPE_BOOLEAN: System.out.print(cell.getBooleanCellValue()); bre ak; default:}}System.out.println();}//读取图片List<HSSFPictureData> pictures = wb.getAllPictures();for (HSSFShape shape : sheet.getDrawingPatriarch().getChil dren()) {if (shape instanceof HSSFPicture) { HSSFPicture pic = (HSSFPicture) shape;int pictureIndex = pic.getPictureIndex()-1;HSSFPictureData picData = pictures.get(pictureIndex);System.out.println("image-size:" + picData.getData().length);}}System.out.println(wb.getSheetName(0));}}。

JavaPoi读取excel对所有类型进行处理

JavaPoi读取excel对所有类型进行处理

JavaPoi读取excel对所有类型进⾏处理1、最近做了⼀个批量导⼊功能 , 发现poi读取excel的⽇期类型会出现问题,源于⽇期类型分为以下⼏种:①、yyyy/MM/dd②、HH:mm:ss③、yyyy/MM/dd HH:mm:ss2、解决思路:⽇期,数字的类型都是数值的, 所有需要对每⼀个进⾏区分,根据cell.getCellStyle().getDataFormat() ⽅法可以得到excel 格⼦中的short类型的值 ,从断点中得知 yyyy/MM/dd 格式的值是 14HH:mm:ss 格式的值是 21yyyy/MM/dd HH:mm:ss 格式的值是 22double 和 Int 都是 0 (我都转成转成String 再去做进⼀步处理)3、java代码如下:1public static String getCellValue(Cell cell) {2 String cellValue = "";3if (cell == null) {4return cellValue;5 }6// 判断数据的类型7switch (cell.getCellType()) {8case Cell.CELL_TYPE_NUMERIC: // 数字9//short s = cell.getCellStyle().getDataFormat();10if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理⽇期格式、时间格式11 SimpleDateFormat sdf = null;12// 验证short值13if (cell.getCellStyle().getDataFormat() == 14) {14 sdf = new SimpleDateFormat("yyyy/MM/dd");15 } else if (cell.getCellStyle().getDataFormat() == 21) {16 sdf = new SimpleDateFormat("HH:mm:ss");17 } else if (cell.getCellStyle().getDataFormat() == 22) {18 sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");19 } else {20throw new RuntimeException("⽇期格式错误");21 }22 Date date = cell.getDateCellValue();23 cellValue = sdf.format(date);24 } else if (cell.getCellStyle().getDataFormat() == 0) {//处理数值格式25 cell.setCellType(Cell.CELL_TYPE_STRING);26 cellValue = String.valueOf(cell.getRichStringCellValue().getString());27 }28break;29case Cell.CELL_TYPE_STRING: // 字符串30 cellValue = String.valueOf(cell.getStringCellValue());31break;32case Cell.CELL_TYPE_BOOLEAN: // Boolean33 cellValue = String.valueOf(cell.getBooleanCellValue());34break;35case Cell.CELL_TYPE_FORMULA: // 公式36 cellValue = String.valueOf(cell.getCellFormula());37break;38case Cell.CELL_TYPE_BLANK: // 空值39 cellValue = null;40break;41case Cell.CELL_TYPE_ERROR: // 故障42 cellValue = "⾮法字符";43break;44default:45 cellValue = "未知类型";46break;47 }48return cellValue;49 }注:本⽂部分内容转载暂时先标记,⽇后有完善会更新。

POI读取excel简介

POI读取excel简介

POI读取excel简介什么是Apache POI?Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件。

这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Office文件的开源库。

它包含类和方法对用户输入数据或文件到MS Office文档进行解码。

Apache POI组件Apache POI包含类和方法,来将MS Office所有OLE 2文档复合。

此API组件的列表如下。

∙POIFS (较差混淆技术实现文件系统) : 此组件是所有其他POI元件的基本因素。

它被用来明确地读取不同的文件。

∙HSSF (可怕的电子表格格式) : 它被用来读取和写入MS-Excel文件的xls格式。

∙XSSF (XML格式) : 它是用于MS-Excel中XLSX文件格式。

∙HPSF (可怕的属性设置格式) : 它用来提取MS-Office文件属性设置。

∙HWPF (可怕的字处理器格式) :它是用来读取和写入MS-Word的文档扩展名的文件。

∙XWPF (XML字处理器格式) :它是用来读取和写入MS-Word的docx扩展名的文件。

∙HSLF (可怕的幻灯片版式格式) : 它是用于读取,创建和编辑PowerPoint演示文稿。

∙HDGF (可怕的图表格式) : 它包含类和方法为MS-Visio的二进制文件。

∙HPBF (可怕的出版商格式) : 它被用来读取和写入MS-Publisher文件。

本教程将指导使用Java Excel文件完成工作过程。

因此,本教程仅限于HSSF和XSSF组件。

注:旧版本的POI支持二进制文件格式,如DOC,XLS,PPT等从版本3.5起,POI支持微软Office的OOXML文件格式,如DOCX,XLSX,PPTX等。

如Apache POI,还有由不同的供应商为Excel文件的生成提供的其他库。

这些措施包括Aspose面向Java的Aspose,JXL 通过共享库由JExcel团队开发。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import java.text.SimpleDateFormat;
import ermodel.HSSFWorkbook;
import ermodel.Cell;
import ermodel.DateUtil;
private static final String EXTENSION_XLS = "xls";
private static final String EXTENSION_XLSX = "xlsx";
/**
*判断EXCEL版本
* @param in
* @param filename
* @return
//读取数据行
for (int rowIndex = 0; rowIndex <= lastRowIndex; rowIndex++) {
Row currentRow = sheet.getRow(rowIndex);//当前行
int firstColumnIndex = currentRow.getFirstCellNum(); //首列
String currentCellValue = this.getCellValue(currentCell, true);//当前单元格的值
System.out.print(currentCellValue + "\t");
}
System.out.println("");
}
System.out.println("\t");
break;
case Cell.CELL_TYPE_BLANK: //空白
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_ERROR: //错误
cellValue = "错误";
break;
case Cell.CELL_TYPE_FORMULA: //公式
String cellValue = null;
int cellType = cell.getCellType();
switch (cellType) {
case Cell.CELL_TYPE_STRING: //文本
cellValue = cell.getStringCellValue();
break;
int lastColumnIndex = currentRow.getLastCellNum();//最后一列
for (int columnIndex = firstColumnIndex; columnIndex <= lastColumnIndex; columnIndex++) {
Cell currentCell = currentRow.getCell(columnIndex);//当前单元格
*/
public void readExcel(String filePath) throws FileNotFoundException,FileFormatException {
//检查
preReadCheck(filePath);
//获取workbook对象
Workbook workbook = null;
FileFormatException {
//常规检查
File file = new File(filePath);
if (!file.exists()) {
throw new FileNotFoundException("传入的文件不存在:" + filePath);
}
if (!(filePath.endsWith(EXTENSION_XLS) || filePath
* @param filePath
* @throws FileNotFoundException
* @throws FileFormatException
*/
private void preReadCheck(String filePath) throws FileNotFoundException,
//if (workbook != null) {
//try {
//workbook.close();
//} catch (IOException e) {
//e.printStackTrace();
//}
//}
}
}
/**
*取单元格的值
*
* @param cell
*单元格对象
* @param treatAsStr
.endsWith(EXTENSION_XLSX))) {
throw new FileFormatException("传入的文件不是excel");
}
}
/**
*读取EXCEL
* @param filePath
* @throws FileNotFoundException
* @throws FileFormatException
FileFormatException {
TestReadExcelAll e3 = new TestReadExcelAll();
e3.readExcel("D://1.xls");
e3.readExcel("D://2.xlsx");
}
}
cellValue = "错误";
break;
default:
cellValue = "错误";
}
return cellValue;
}
/**
*测试
* @param args
* @throws FileNotFoundException
* @throws FileFormatException
*/
public static void main(String[] args) throws FileNotFoundException,
int lastRowIndex = sheet.getLastRowNum();
if (firstRowIndex != lastRowIndex && lastRowIndex != 0) {
System.out.println("======================="+ sheet.getSheetName()+ "=========================");
wb = new HSSFWorkbook(in);//Excel 2003
} else if(filename.endsWith(EXTENSION_XLSX)){
wb = new XSSFWorkbook(in);//Excel 2007
}
return wb;
}
/**
*文件校验是否是excel
*
*为true时,当做文本来取值(取到的是文本,不会把“1”取成“1.0”)
ring getCellValue(Cell cell, boolean treatAsStr) {
if (cell == null) {
return "";
}
if (treatAsStr) {
import ermodel.XSSFWorkbook;
import org.apache.xmlbeans.impl.piccolo.io.FileFormatException;
/**
*读取EXCEL内容
* @author lxr
*
*/
public class TestReadExcelAll {
* @throws IOException
*/
public static Workbook getWorkbook(InputStream in,String filename)throws IOException
{
Workbook wb = null;
if(filename.endsWith(EXTENSION_XLS)){
package com.excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
case Cell.CELL_TYPE_NUMERIC: //数字、日期
if (DateUtil.isCellDateFormatted(cell)) {
cellValue = fmt.format(cell.getDateCellValue()); //日期型
} else {
cell.setCellType(Cell.CELL_TYPE_STRING);
cellValue = String.valueOf(cell.getNumericCellValue()); //数字
}
break;
case Cell.CELL_TYPE_BOOLEAN: //布尔型
cellValue = String.valueOf(cell.getBooleanCellValue());
for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {
相关文档
最新文档