`
gaozzsoft
  • 浏览: 431461 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

java poi 读取excel各种数据

阅读更多
Microsoft的Office系列产品拥有大 量的用户,Word、Excel也成为办公文件的首选。在Java中,已经有很多对于Word、Excel的开源的解决方案,其中比较出色的是 Apache的Jakata项目的POI子项目。该项目的官方网站是http://jakarta.apache.org/poi/。
POI 包括一系列的API,它们可以操作基于MicroSoft OLE 2 Compound Document Format的各种格式文件,可以通过这些API在Java中读写Excel、Word等文件。POI是完全的Java Excel和Java Word解决方案。POI子项目包括:POIFS、HSSF、HDF、HPSF。表7-2对它们进行了简要介绍。
表7-2  POI子项目介绍
子项目名 说明
POIFS(POI File System) POIFS是POI项目中最早的最基础的一个模块,是Java到OLE 2 Compound Document Format的接口,支持读写功能,所有的其他项目都依赖与该项目。
HSSF(Horrible Spreadsheet Format) HSSF是Java到Microsoft Excel 97(-2002)文件的接口,支持读写功能
HWPF(Horrible Word Processing Format) HWPF是Java到Microsoft Word 97文件的接口,支持读写功能,但目前该模块还处于刚开始开发阶段,只能实现一些简单文件的操作,在后续版本中,会提供更强大的支持
HPSF(Horrible Property Set Format) HPSF 是Java到OLE 2 Compound Document Format文件的属性设置的接口,属性设置通常用来设置文档的属性(标题,作者,最后修改日期等),还可以设置用户定义的属性。HPSF支持读写功能,当前发布版本中直支持读功能。

7.3.1  对Excel的处理类
下 面通过HSSF提供的接口对Excel文件经行处理。首先需要下载POI的包,可以到apache的官方网站下载,地址为:http: //apache.justdn.org/jakarta/poi/,本书采用的是poi-2.5.1-final-20040804.jar,读者可以 下载当前的稳定版本。把下载的包按照前面介绍的方式加入Build Path,然后新建一个ch7.poi包,并创建一个ExcelReader类。
ExcelReader类可以读取一个XLS文件,然后将其内容逐行提取出来,写入文本文件。其代码如下。

java 代码
public class ExcelReader{  
  
   // 创建文件输入流  
  
   private BufferedReader reader = null;  
  
   // 文件类型  
  
   private String filetype;  
  
   // 文件二进制输入流  
  
   private InputStream is = null;  
  
   // 当前的Sheet  
  
   private int currSheet;  
  
   // 当前位置  
  
   private int currPosition;  
  
   // Sheet数量  
  
   private int numOfSheets;  
  
   // HSSFWorkbook  
  
   HSSFWorkbook workbook = null;  
  
   // 设置Cell之间以空格分割  
  
   private static String EXCEL_LINE_DELIMITER = " ";  
  
   // 设置最大列数  
  
   private static int MAX_EXCEL_COLUMNS = 64;  
  
   // 构造函数创建一个ExcelReader  
  
   public ExcelReader(String inputfile) throws IOException, Exception{  
  
      // 判断参数是否为空或没有意义  
  
      if (inputfile == null || inputfile.trim().equals("")){  
  
         throw new IOException("no input file specified");  
  
      }  
  
      // 取得文件名的后缀名赋值给filetype  
  
      this.filetype = inputfile.substring(inputfile.lastIndexOf(".") + 1);  
  
      // 设置开始行为0  
  
      currPosition = 0;  
  
      // 设置当前位置为0  
  
      currSheet = 0;  
  
      // 创建文件输入流  
  
      is = new FileInputStream(inputfile);  
  
      // 判断文件格式  
  
      if (filetype.equalsIgnoreCase("txt")){  
  
         // 如果是txt则直接创建BufferedReader读取  
  
         reader = new BufferedReader(new InputStreamReader(is));  
  
      }  
  
else if (filetype.equalsIgnoreCase("xls")){  
  
         // 如果是Excel文件则创建HSSFWorkbook读取  
  
         workbook = new HSSFWorkbook(is);  
  
         // 设置Sheet数  
  
         numOfSheets = workbook.getNumberOfSheets();  
  
      }  
  
else{  
  
         throw new Exception("File Type Not Supported");  
  
      }  
  
   }  
  
   // 函数readLine读取文件的一行  
  
   public String readLine() throws IOException{  
  
      // 如果是txt文件则通过reader读取  
  
      if (filetype.equalsIgnoreCase("txt")){  
  
         String str = reader.readLine();  
  
         // 空行则略去,直接读取下一行  
  
         while (str.trim().equals("")){  
  
            str = reader.readLine();  
  
         }  
  
         return str;  
  
      }  
  
      // 如果是XLS文件则通过POI提供的API读取文件  
  
      else if (filetype.equalsIgnoreCase("xls")){  
  
         // 根据currSheet值获得当前的sheet  
  
         HSSFSheet sheet = workbook.getSheetAt(currSheet);  
  
         // 判断当前行是否到但前Sheet的结尾  
  
         if (currPosition > sheet.getLastRowNum()){  
  
            // 当前行位置清零  
  
            currPosition = 0;  
  
            // 判断是否还有Sheet  
  
            while (currSheet != numOfSheets - 1){  
  
               // 得到下一张Sheet  
  
               sheet = workbook.getSheetAt(currSheet + 1);  
  
               // 当前行数是否已经到达文件末尾  
  
               if (currPosition == sheet.getLastRowNum()){  
  
                  // 当前Sheet指向下一张Sheet  
  
                  currSheet++;  
  
                  continue;  
  
               } else{  
  
                  // 获取当前行数  
  
                  int row = currPosition;  
  
                  currPosition++;  
  
                  // 读取当前行数据  
  
                  return getLine(sheet, row);  
  
               }  
  
            }  
  
            return null;  
  
         }  
  
         // 获取当前行数  
  
         int row = currPosition;  
  
         currPosition++;  
  
         // 读取当前行数据  
  
         return getLine(sheet, row);  
  
      }  
  
      return null;  
  
   }  
  
   // 函数getLine返回Sheet的一行数据  
  
   private String getLine(HSSFSheet sheet, int row){  
  
      // 根据行数取得Sheet的一行  
  
      HSSFRow rowline = sheet.getRow(row);  
  
      // 创建字符创缓冲区  
  
      StringBuffer buffer = new StringBuffer();  
  
      // 获取当前行的列数  
  
      int filledColumns = rowline.getLastCellNum();  
  
      HSSFCell cell = null;  
  
      // 循环遍历所有列  
  
      for (int i = 0; i < filledColumns; i++){  
  
         // 取得当前Cell  
  
         cell = rowline.getCell((short) i);  
  
         String cellvalue = null;  
  
         if (cell != null){  
  
            // 判断当前Cell的Type  
  
            switch (cell.getCellType()){  
  
            // 如果当前Cell的Type为NUMERIC  
  
            case HSSFCell.CELL_TYPE_NUMERIC:{  
  
               // 判断当前的cell是否为Date  
  
               if (HSSFDateUtil.isCellDateFormatted(cell)){  
  
                  // 如果是Date类型则,取得该Cell的Date值  
  
                  Date date = cell.getDateCellValue();  
  
                  // 把Date转换成本地格式的字符串  
  
                  cellvalue = cell.getDateCellValue().toLocaleString();  
  
               }  
  
               // 如果是纯数字  
  
               else{  
  
                  // 取得当前Cell的数值  
  
                  Integer num = new Integer((int) cell  
  
                        .getNumericCellValue());  
  
                  cellvalue = String.valueOf(num);  
  
               }  
  
               break;  
  
            }  
  
            // 如果当前Cell的Type为STRIN  
  
            case HSSFCell.CELL_TYPE_STRING:  
  
               // 取得当前的Cell字符串  
  
               cellvalue = cell.getStringCellValue().replaceAll("'", "''");  
  
               break;  
  
            // 默认的Cell值  
  
            default:  
  
               cellvalue = " ";  
  
            }  
  
         } else{  
  
            cellvalue = "";  
  
         }  
  
         // 在每个字段之间插入分割符  
  
         buffer.append(cellvalue).append(EXCEL_LINE_DELIMITER);  
  
      }  
  
      // 以字符串返回该行的数据  
  
      return buffer.toString();  
  
   }  
  
   // close函数执行流的关闭操作  
  
   public void close(){  
  
      // 如果is不为空,则关闭InputSteam文件输入流  
  
      if (is != null){  
  
         try{  
  
            is.close();  
  
         } catch (IOException e){  
  
            is = null;  
  
         }  
  
      }  
  
      // 如果reader不为空则关闭BufferedReader文件输入流  
  
      if (reader != null){  
  
         try{  
  
            reader.close();  
  
         } catch (IOException e){  
  
            reader = null;  
  
         }  
  
      }  
  
   }  
  
}  
7.3.2  ExcelReader的运行效果
下面创建一个main函数,用来测试上面的ExcelReader类,代码如下。

java 代码
public static void main(String[] args){  
      try{  
          ExcelReader er=new ExcelReader("c:\xp.xls");     
          String line=er.readLine();  
          while(line != null){  
              System.out.println(line);  
              line=er.readLine();  
          }  
          er.close();  
      }catch(Exception e){  
          e.printStackTrace();  
      }  
  }  
main函数先创建一个ExcelReader类,然后调用它提供的接口readLine,对XLS文件进行读取,打印到控制台,处理前的XLS文件如图7-12所示。

图7-12  处理前的XLS文件内容
运行main函数进行内容提取后,Eclipse的控制台输出如图7-13所示。

图7-13  输出结果
可以看到,Excel文件中的内容已经被成功的输出了出来。


7.3.3  POI中Excel文件Cell的类型
在读取每一个Cell的值的时候,通过getCellType方法获得当前Cell的类型,在Excel中Cell有6种类型,如表7-3所示。
表7-3  Cell的类型
CellType 说明
CELL_TYPE_BLANK 空值
CELL_TYPE_BOOLEAN 布尔型
CELL_TYPE_ERROR 错误
CELL_TYPE_FORMULA 公式型
CELL_TYPE_STRING 字符串型
CELL_TYPE_NUMERIC 数值型

本 例采用了CELL_TYPE_STRING和CELL_TYPE_NUMERIC类型,因为在Excel文件中只有字符串和数字。如果Cell的Type 为CELL_TYPE_NUMERIC时,还需要进一步判断该Cell的数据格式,因为它有可能是Date类型,在Excel中的Date类型也是以 Double类型的数字存储的。Excel中的Date表示当前时间与1900年1月1日相隔的天数,所以需要调用HSSFDateUtil的 isCellDateFormatted方法,判断该Cell的数据格式是否是Excel Date类型。如果是,则调用getDateCellValue方法,返回一个Java类型的Date。
实际上Excel的数据格式有很多,还支持用户自定义的类型,在Excel中,选择一个单元格然后右键选择“设置单元格格式”,在弹出的单元格格式中选中“数字”,如图7-14所示。

图7-14  Excel的单元格格式
图中的数据有数值、货币、时间、日期、文本等格式。这些数据格式在POI中的HSSFDataFormat类里都有相应的定义。
HSSFDataFormat 是HSSF子项目里面定义的一个类。类HSSFDataFormat允许用户新建数据格式类型。HSSFDataFormat类包含静态方法 static java.lang.String getBuiltinFormat(short index),它可以根据编号返回内置数据类型。另外static short getBuiltinFormat(java.lang.String format)方法则可以根据数据类型返回其编号, static java.util.List getBuiltinFormats()可以返回整个内置的数据格式列表。
在HSSFDataFormat里一共定义了49种内置的数据格式,如表7-4所示。


表7-4  HSSFDataFormat的数据格式
内置数据类型 编号
"General" 0
"0" 1
"0.00" 2
"#,##0" 3
"#,##0.00" 4
"($#,##0_);($#,##0)" 5
"($#,##0_);[Red]($#,##0)" 6
"($#,##0.00);($#,##0.00)" 7
"($#,##0.00_);[Red]($#,##0.00)" 8
"0%" 9
"0.00%" 0xa
"0.00E+00" 0xb
"# ?/?" 0xc
分享到:
评论

相关推荐

    java POI读取excel文件数据

    在这个场景中,我们将详细探讨如何使用Java POI读取Excel文件中的数据,包括获取总行数、列数、单元格内容、合并单元格、行高、列宽以及图片等信息。 首先,确保在项目中已经引入了Apache POI的依赖库。如果你使用...

    Java通过POI读取Excel遍历数据,批量生成word文档

    本教程将重点讲解如何使用Apache POI库来读取Excel数据,并基于这些数据批量生成Word文档。Apache POI是一个开源项目,它允许Java开发者处理Microsoft Office格式的文件,如Excel(.xlsx或.xls)和Word(.docx)。 ...

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 ...在本文中,我们已经详细介绍了如何使用 Java POI 实现 Excel 导入导出功能,包括读取和写入 Excel 文件。

    java poi处理excel数据

    在Java开发中,当你需要处理Excel数据时,POI库是一个强大的工具。本压缩包包含了一些关键资源,帮助你理解和使用Java POI处理Excel数据。 首先,`问题.docx`可能是你在使用POI过程中遇到的问题汇总,它可能包含了...

    java 读取excel表格数据 poi

    java读取excel 表格数据。 public static void main(String[] args) { String[][] content=POIExcelUtils.read("E:\\1.xlsx"); for(int i=0;i;i++) { if(content[i]!=null){ for(int j=0;j[i].length;j...

    Java Poi 解析EXCEL数据

    Poi库支持这两种格式,并提供了丰富的API来读取、写入和修改Excel数据。 **解析Excel数据的基本步骤如下:** 1. **添加依赖**:首先,在你的项目中引入Poi库。如果你使用Maven,可以在pom.xml文件中添加以下依赖:...

    Java 使用poi导入excel 并使用xml做数据验证

    使用POI读取Excel数据的基本步骤如下: 1. 加载Excel文件:使用`WorkbookFactory.create()`方法创建一个`Workbook`实例。 2. 获取工作表:通过`Workbook`对象的`getSheetAt()`或`createSheet()`方法获取或创建工作...

    java的poi生成excel图表demo

    Java的Apache POI库是一个强大的工具,用于读取、创建和修改Microsoft Office格式的文件,尤其是Excel(.xlsx)文档。在本示例中,我们将深入探讨如何利用POI库来生成Excel中的图表曲线,这对于数据可视化和报告生成...

    使用POI解析excel文件并写入数据库

    使用poi解析excel文件,并将数据写入到数据库 项目说明 这个项目实现的功能是读取excel文件中的数据,解析并写入数据库。 读取的excel文件位于项目目录下的 excel\0805.xlsx 使用IntelliJ IDEA开发此项目 使用MYSQL...

    利用POI读取excel写入到word

    以上就是使用Apache POI读取Excel数据并写入Word的基本流程。在实际应用中,你可能需要处理更复杂的情况,比如合并单元格、处理公式、格式转换等,这都需要对POI API有更深入的理解。同时,为了提高性能,可以考虑...

    java poi 读取excel 2007

    以上就是使用Java POI读取Excel 2007文件并将内容存储到List的基本过程。这个过程可以根据实际需求进行调整,比如处理表头、忽略空行、处理特殊格式的单元格等。在处理大数据量时,还需要考虑性能优化,例如使用迭代...

    java poi读取excel表格数据专用jar包 包括(dom4j和xmlbeans包)

    5. **读取Excel数据**:使用POI读取Excel数据的基本步骤包括: - 加载工作簿:创建HSSFWorkbook对象(.xls)或XSSFWorkbook对象(.xlsx)。 - 访问工作表:通过工作簿对象获取Sheet对象,代表Excel中的工作表。 -...

    JAVA poi 做EXCEL导出(包含图片) 完整版

    在Java编程环境中,Apache POI库是一个非常实用的工具,用于读取、写入和修改Microsoft Office格式的文件,特别是Excel(.xlsx 和 .xls)文件。本教程将详细介绍如何使用JAVA POI库来创建一个包含图片的完整Excel...

    Java POI读取excel中数值精度损失问题解决

    Java POI 读取 Excel 中数值精度损失问题解决 Java POI 读取 Excel 中数值精度损失问题解决是指在使用 Java POI 读取 Excel 文件时,遇到数值精度损失的问题。这种问题的出现是因为 Excel 中的数值单元格在读取时,...

    POI读取Excel合并单元格并储存

    本文将深入探讨如何使用Java的Apache POI库来读取Excel文件,并处理其中合并单元格的数据,同时将这些数据存储到实体类中以供后续使用。 Apache POI是一个强大的库,允许程序员使用Java来创建、修改和显示Microsoft...

    java读写Excel,POI.JAR,Word内容读取

    java读写Excel,POI.JAR,Word内容读取

    Java用poi读取excel文件

    有时候,我们需要在 Java 程序中读取 Excel 文件的内容,例如将 Excel 表格中的数据导入到数据库中或者进行数据分析。这时候,我们可以使用 Apache 的 POI 工具包来读取 Excel 文件。 POI(Poor Obfuscation ...

    java poi 导入大数据量Excel数据 防止内存溢出处理.zip

    Java中的Apache POI库是用于读取和写入Microsoft Office格式文件,特别是Excel文档的流行工具。然而,当处理大数据量的Excel文件时,POI可能会导致内存溢出(Out of Memory, OOM),因为默认情况下它会将整个工作簿...

    java poi导出图片到excel示例代码

    首先,需要创建一个Workbook对象,然后使用Workbook对象的getSheet方法获取Excel文件的Sheet对象,最后使用Sheet对象的getRow方法读取Excel文件的数据。 总结 本文详细介绍了如何使用Java POI将图片导出到Excel中,...

    java poi读取Excel需要导入的所有包

    在使用Java POI进行Excel读取操作时,需要导入一系列的库文件,以确保程序能够正确解析和操作Excel数据。这里提到的文件是Java POI库的不同组件和依赖,它们在处理不同版本的Excel文件时起着关键作用。 1. **poi-...

Global site tag (gtag.js) - Google Analytics