在Java中使用 Apache POI 处理Excel 文档详解

Apache POI是一个用于处理Microsoft Office格式文件的Java库,包括Excel、Word等。本文详细介绍了如何使用POI API,特别是HSSFWorkbook和XSSFWorkbook类来创建、读取Excel文档,以及Sheet、Row、Cell的使用方法。还提供了基础示例和数据读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POI简介

        Apache POI 是Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁的模糊实现”。

官方主页: http://poi.apache.org/index.html 

API文档: http://poi.apache.org/apidocs/index.html


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格式档案的功能。


处理Excel文档常用的类和方法

Workbook 
Workbook是所有用来创建或维护excel文件的类所要实现的接口,这个接口在 
org.apache.poi.ss.usermodel下。实现这个接口的类包括。

  • HSSFWorkbook:这个类包含了读取或写入.xls格式文件的方法。能处理的版本包括 97-2003.
  • XSSFWorkbook:这个类包含了读取或写入.xlsx或.xls文件格式的方法,能够处理2007及以后版本的文档。

这两个类用来创建Excel文件,因此对应于Excel文件。

HSSFWorkbook 
这个是org.apache.poi.hssf.usermodel包下的一个类,实现了Workbook接口,用来处理.xls格式的文件。HSSFWorkbook类包含许多方法,然而仅能处理xls格式的文档。

XSSFWorkbook 
这个类即能处理低版本也能处理高版本Excel文件的格式。该类在org.apache.xssf.usemodel包下,并且实现了Workbook接口。

Sheet 
Sheet是org.apache.poi.ss.usermodel包下的一个接口,该接口是所有用来创建指定名称电子表格的类所需要实现的接口。 
两个实现类包括。

  • XSSFSheet
  • HSSFSheet

这两个类用来创建电子表格,当通过XSSFWorkbook创建好Excel文件后,需要使用XSSFSheet来创建电子表格,HSSFWorkbook创建的Excel文件则是通过HSSFSheet来创建电子表格。下面的行,单元格同理。

Row 
这个接口在org.apache.poi.ss.usermodel包下,用来表示电子表单中的行,所有用来创建行对象的类都要实现这个接口。 
实现类包括

  • XSSFRow
  • HSSFRow

Cell 
这个接口在org.apache.poi.ss.usermodel包下。所以用来处理单元格的类都要实现该接口。单元格可以有不同的属性,如blank,numeric,date,error等。每个单元格都有一个编号。 
实现类包括

  • XSSFCell
  • HSSFCell
注意:Excel中的工作簿、工作表、行、单元格中的关系:
一个Excel文件对应于一个workbook(HSSFWorkbook、XSSFWorkbook),
一个workbook可以有多个sheet(HSSFSheet、XSSFSheet)组成,
一个sheet是由多个row(HSSFRow、XSSFRow)组成,

一个row是由多个cell(HSSFCell、XSSFCell)组成


接下来的类主要是完成属性,样式等的设置。

XSSFCellStyle 
这个类在org.apache.poi.xssf.usermodel包下,提供了电子表单中与单元格内容格式相关的信息。

HSSFColor 
这个类在org.apache.poi.hssf.util包下。用来处理颜色。

XSSFColor 
这个类在org.apache.poi.xssf.usermodel包下。用来描述XSSFWorkbook中单元格颜色。

XSSFFont 
这个类在org.apache.poi.xssf.usermodel包下。实现了Font接口,用来处理字体。

XSSFHyperlink 
这个类在org.apache.poi.xssf.usermodel包下。实现了Hyperlink接口,用来设置超链接。

XSSFPrintSetup 
这个类在org.apache.poi.xsssf.usermodel包下。实现了PrintSetup接口。用来设置与打印相关的属性。

其它的不再赘述,使用时请查阅API文档即可。


基础示例

workbook的创建与打开:这里workbook的含义是Excel文件。下面的代码创建了一个空的工作簿。

import java.io.*;
import org.apache.poi.xssf.usermodel.*;
public class CreateWorkBook 
{
   public static void main(String[] args)throws Exception 
   {
      //Create Blank workbook
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      //Create file system using specific name
      FileOutputStream out = new FileOutputStream(
      new File("D:\\createworkbook.xlsx"));
      //write operation workbook using file out object 
      workbook.write(out);
      out.close();
      System.out.println("
      createworkbook.xlsx written successfully");
   }
}

//执行后会在D:\\下创建Excel文件名为createworkbook

//打开已存在的工作簿
import java.io.*;
import org.apache.poi.xssf.usermodel.*;
public class OpenWorkBook
{
   public static void main(String args[])throws Exception
   { 
      File file = new File("D:\\workbook.xlsx");
      FileInputStream fIP = new FileInputStream(file);
      //Get the workbook instance for XLSX file 
      XSSFWorkbook workbook = new XSSFWorkbook(fIP);
      if(file.isFile() && file.exists())
      {
         System.out.println(
         "openworkbook.xlsx file open successfully.");
      }
      else
      {
         System.out.println(
         "Error to open workbook.xlsx file.");
      }
   }
}

SpreadSheets(电子表格)的操作

本节将演示如何通过Java创建电子表格。电子表格是Excel文件中的一个页面,并包含行以及列。下图的excel文件中包含两个Spreadsheet,名字分别为Sheet name与Sheet1。

这里写图片描述

创建字典表格 
//创建空的工作簿 
XSSFWorkbook workbook = new XSSFWorkbook(); 
//创建空的电子表格 
XSSFSheet spreadsheet = workbook.createSheet(“Sheet Name”);

电子表格中的行 
电子表格采用的是网格布局。行与列是通过具体的名称来标识。列是通过字母标识行是通过数字标识。下面的代码在电子表单中创建了一行。 
XSSFRow row = spreadsheet.createRow((short)1);

向电子表单中写入数据

现有一个表格,接下来将表格中的数据写入Excel中。 
这里写图片描述

import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Writesheet 
{
   public static void main(String[] args) throws Exception 
   {
      //Create blank workbook
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      //Create a blank sheet
      XSSFSheet spreadsheet = workbook.createSheet( 
      " Employee Info ");
      //Create row object
      XSSFRow row;
      //This data needs to be written (Object[])
      Map < String, Object[] > empinfo = 
      new TreeMap < String, Object[] >();
      empinfo.put( "1", new Object[] { 
      "EMP ID", "EMP NAME", "DESIGNATION" });
      empinfo.put( "2", new Object[] { 
      "tp01", "Gopal", "Technical Manager" });
      empinfo.put( "3", new Object[] { 
      "tp02", "Manisha", "Proof Reader" });
      empinfo.put( "4", new Object[] { 
      "tp03", "Masthan", "Technical Writer" });
      empinfo.put( "5", new Object[] { 
      "tp04", "Satish", "Technical Writer" });
      empinfo.put( "6", new Object[] { 
      "tp05", "Krishna", "Technical Writer" });
      //Iterate over data and write to sheet
      Set < String > keyid = empinfo.keySet();
      int rowid = 0;
      for (String key : keyid)
      {
         row = spreadsheet.createRow(rowid++);
         Object [] objectArr = empinfo.get(key);
         int cellid = 0;
         for (Object obj : objectArr)
         {
            Cell cell = row.createCell(cellid++);
            cell.setCellValue((String)obj);
         }
      }
      //Write the workbook in file system
      FileOutputStream out = new FileOutputStream( 
      new File("Writesheet.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println( 
      "Writesheet.xlsx written successfully" );
   }
}

执行后的数据写入Excel文件中。

这里写图片描述

:可以看到,数据写入Excel中就是创建Excel文件(WorkBook),行(Row),单元格(Cell),最后将数据写入单元格。而这些对象Excel文件(WorkBook),行(Row),单元格(Cell)构成一个父子关系(树形结构)。每个对象通过父对象创建。而workbook是根,通过new操作符来创建。

从电子表格中读取数据

import java.io.File;
import java.io.FileInputStream;
import java.util.Iterator;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Readsheet 
{
   static XSSFRow row;
   public static void main(String[] args) throws Exception 
   {
      FileInputStream fis = new FileInputStream(
      new File("WriteSheet.xlsx"));
      XSSFWorkbook workbook = new XSSFWorkbook(fis);
      XSSFSheet spreadsheet = workbook.getSheetAt(0);
      Iterator < Row > rowIterator = spreadsheet.iterator();
      while (rowIterator.hasNext()) 
      {
         row = (XSSFRow) rowIterator.next();
         Iterator < Cell > cellIterator = row.cellIterator();
         while ( cellIterator.hasNext()) 
         {
            Cell cell = cellIterator.next();
            switch (cell.getCellType()) 
            {
               case Cell.CELL_TYPE_NUMERIC:
               System.out.print( 
               cell.getNumericCellValue() + " \t\t " );
               break;
               case Cell.CELL_TYPE_STRING:
               System.out.print(
               cell.getStringCellValue() + " \t\t " );
               break;
            }
         }
         System.out.println();
      }
      fis.close();
   }
}

单元格的操作

单元格的类型指定了一个单元格是否能够包含字符串,数字,或公式。字符串单元格不能存放数字,同理数字单元格也不能存放字符串。

这里写图片描述

下面代码演示了在电子表格中创建不同类型的单元格。

import java.io.File;
import java.io.FileOutputStream;
import java.util.Date;
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 TypesofCells 
{
   public static void main(String[] args)throws Exception 
   {
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      XSSFSheet spreadsheet = workbook.createSheet("cell types");
      XSSFRow row = spreadsheet.createRow((short) 2);
      row.createCell(0).setCellValue("Type of Cell");
      row.createCell(1).setCellValue("cell value");
      row = spreadsheet.createRow((short) 3);
      row.createCell(0).setCellValue("set cell type BLANK");
      row.createCell(1);
      row = spreadsheet.createRow((short) 4);
      row.createCell(0).setCellValue("set cell type BOOLEAN");
      row.createCell(1).setCellValue(true);
      row = spreadsheet.createRow((short) 5);
      row.createCell(0).setCellValue("set cell type ERROR");
      row.createCell(1).setCellValue(XSSFCell.CELL_TYPE_ERROR );
      row = spreadsheet.createRow((short) 6);
      row.createCell(0).setCellValue("set cell type date");
      row.createCell(1).setCellValue(new Date());
      row = spreadsheet.createRow((short) 7);
      row.createCell(0).setCellValue("set cell type numeric" );
      row.createCell(1).setCellValue(20 );
      row = spreadsheet.createRow((short) 8);
      row.createCell(0).setCellValue("set cell type string");
      row.createCell(1).setCellValue("A String");
      FileOutputStream out = new FileOutputStream(
      new File("typesofcells.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println(
      "typesofcells.xlsx written successfully");
   }
}

执行后生成的文件如下。

这里写图片描述


参考:

https://blog.youkuaiyun.com/Revivedsun/article/details/53982574

https://blog.youkuaiyun.com/vbirdbest/article/details/72870714

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值