Springboot 基于Apache POI的Excel导入导出

本文详细介绍了ApachePOI库中的关键组件,如HSSF和XSSF用于不同格式的Excel文件操作,以及如何创建、读取、写入工作簿和工作表,包括单元格、样式和字体管理。展示了如何用Java实现创建空白工作簿、打开现有工作簿、写入和读取电子表格数据,以及单元格的创建、类型和样式应用。
摘要由CSDN通过智能技术生成

1.Apache POI的组件

Apache POI包含用于处理了Office的所有OLE2符合文档的类和方法。该API的组件列表如下。

  • POIFS → 该组件时所有其他POI元素的基本要素。他用于显式读取不同的文件。
  • HSSF → 用于读写xls格式的excel文件
  • XSSF → 用于读写xlsx格式的excel文件
  • HPSF → 它用于提取Office文件的属性集
  • HWPF → 用于读写Word的doc扩展的文件。
  • XWPF → 用于读写Word的docx扩展的文件。
  • HSLF → 用户阅读,创建和编辑PowerPoint演示文稿。
  • HDGF →  他包含Ms-Visio二进制的类和方法
  • HPDF → 它用于读取和写入MS-Publisher文件。

 本文只介绍Java处理Excel文件的过程。因此,仅限于HSSF和XSSF组件。

2. POI的核心类

  2.1 Workbook

这是创建或维护Excel工作簿的所有类的超级接口。它属于org.apache.poi.ss.usermode包。实现这个接口的两个类如下:

  • HSSFWorkbook:此类具有读取和写入【xls】格式的excel文件的方法。
  • XSSFWorkbook:此类具有读取和写入【xls,xlsx】格式的文件的方法。

  2.2 HSSFWorkbook 

它是org.apache.poi.hssf.usermodel包下的高级类。它实现了Workbook接口,用于【xls】格式的excel文件。下面列出了该类下的一些方法和构造函数。

类构造函数:

序号类构造函数描述
1HSSFWorkbook()从头开始创建一个新的HSSFWorkbook对象。
2HSSFWorkbook(DirectoryNode directory, boolean preserverNodes)在特定目录中创建一个新的HSSFWorkbook对象。
3HSSFWorkbook(DirectoryNode directory, POIFSFileSystem fs, boolean preserveNodes)给定一个POIFSFileSystem对象和其中的特定目录,它会创建一个SSFWorkbook对象来读取指定的工作簿。
4HSSFWorkbook(InputStream s)使用输入流创建一个新的HSSFWorkbook对象。
5HSSFWorkbook(InputStream s, boolean preserveNodes)围绕输入流构建POI文件系统
6HSSFWorkbook(POIFSFileSystem fs)使用POIFSFile对象构造一个新的HSSFWorkbook对象
7HSSFWorkbook(POIFSFileSystem fs, boolean preserveNodes)给定一个POIFSFileSystem对象,它会创建一个新的HSSFWorkbook对象来读取指定的工作簿

这些构造函数中经常使用的参数:

directory:它是要处理的POI文件系统目录。

fs:它是包含工作簿的POI文件系统。

preservenodes:这是一个可选参数,决定是否保留其他节点,如宏。它消耗大量内存。

  2.3 XSSFWorkbook

它是一个用于表示高级和低级excel文件格式的类。它属于org.apache.xssf.usermodel包,实现了Workbook接口。下面列出了这个类下的方法和构造函数。

类构造函数

序号构造函数描述
1XSSFWorkbook()从头开始创建一个新的XSSFworkbook对象
2XSSFWorkbook(File file)从给定的文件构造一个XSSFWorkbook对象
3XSSFWorkbook(InputStream is)构造一个XSSFWorkbook对象,方法是将整个输入流缓冲到内存中,然后为其打开一个OPCPackage对象。
4XSSFWorkbook(String path)在给定的文件的完整路径的情况下构造一个XSSFWorkbook对象。

类方法

序号方法描述
1createSheet()为此工作簿创建一个XSSFSheet,将其添加到工作表中,并返回高级表示。
2createSheet(String sheetName)为此工作簿创建一个新工作表并返回高级表示。
3createFont()创建新字体并添加到工作簿的字体表中。
4createCellStyle()创建一个新的XSSFCellStyle并将其添加到工作簿的样式表中。
5setPrintArea(int sheetIndex, int startColumn, int endColumn, int startRow, int endRow)根据指定参数设置给定工作簿的打印区域。

   2.4 Sheet

Sheet是org.apache.poi.ss.usermodel包下的一个接口,它是创建具有特定名称的高级或低级电子表格的所有类的超级接口。最常见的电子表格类型是工作表,它表示为单元格网格。

  2.5 HSSFSheet

这是org.apache.poi.hssf.usermodel包下的一个类。它可以创建excel电子表格,并允许格式化工作表样式和工作表数据。

类构造函数

序号构造函数描述
1HSSFSheet(HSSFWorkbook workbook)创建由HSSFWorkbook调用的新HSSFSheet以从头开始创建工作表。
2HSSFSheet(HSSFWorkboot workbook, InternalSheet sheet)创建一个表示给定工作表对象的HSSFSheet。

  2.6 XSSFSheet

这是一个代表excel电子变革的高级表示的类。它在org.apache,poi,hssf.usermodel包下。

类构造函数

序号构造函数描述
1XSSFSheet()创建一个新的XSSFSheet对象由XSSFWorkbook调用以从头开始创建工作表。
2XSSFSheet(PaceagePart part, PackageRelationship rel)创建一个表示给定包部分和关系的XSSFSheet。

 类方法

序号方法描述
1addMergedRegion(CellRangeAddress region)添加单元格的合并区域
2autoSizeColumn(int column)调整列宽以适合内容
3iterator()此方法是rowIterator()的别名,以允许foreach循环
4addHyperlink(XSSFHyperlink hyperlink)在此工作表上的超链接结合中注册一个超链接。

  2.7 Row

这个是电子表格行的高级表示。它是POI库中行的所有类的超级接口

  2.8 XSSFRow

它实现了Row接口,因此它可以在电子表格中创建行。

类方法

序号方法描述
1createCell(int columnIndex)在行内创建新单元格并将其返回
2setHeight(short height)设置行高度

2.9 Cell

它是代表电子表格行中单元格的所有类的超级接口。单元格可以采用各种属性,例如空白,数字,日期,错误等。在添加到行之前,端元个应该有自己的数字(从0开始)。

2.10 XSSFCell

它实现了Cell接口。他是电子表格行中单元格的高级表示。

序号方法描述
1setCellStyle(CellStyle style)设置单元格的样式。
2setCellType(int cellType)设置单元格的类型(数字,公式或字符串)
3setCellValue(boolean value)为单元格设置一个布尔值
4setCellValue(Calendar value)设置单元格的日期值
5setCellValue(double value)设置单元格个的数值
6setCellValue(String str)为单元格设置一个字符串值
7setHyperlink(Hyperlink hyperlink)分配一个超链接到这个单元格

 2.11 XSSFCellStyle

 它将提供有关电子表格中内容格式的可能星系。它提供了用于修改该格式的选项。它实现了CellStyle接口。

类构造函数

序号构造函数        描述
1XSSFCellStyle(int cellXfId, int cellStyleXfId, StylesTable styleSource, ThemesTable theme)从提供的部件创建单元格样式。
2XSSFCellStyle(StylesTable stylesSource)创建一个空的单元格样式

类方法

序号方法描述
1setAlignment(short align)设置单元格的水平对齐类型
2setBorderBottom(short border)设置单元格个底部边框类型
3setBorderColor(BorderSide side, XSSFColor color)设置选定边框的颜色
4setBorderLeft(short border)设置单元格左边框的边框格式
5setBorderRight(short border)设置单元格有边框的边框格式
6setBorderTop(short border)设置单元格上边框的边框格式
7setFillBackgroundColor(XSSFColor color)设置表示为XSSFColor值得背景填充颜色
8setFillForegroundColor(XSSFColor color)设置表示为XSSFColor值得前景填充颜色
9setFillPattern(short fp)指定图案和纯色单元格填充得单元格填充信息
10setFont(Font font)设置此样式得字体
11setRotation(short rotation)设置单元格中文得旋转度数
12setVerticalAlignment(short align)设置单元格得垂直对齐格式

2.12 XSSFont

它实现了Font接口,因此它可以处理工作薄中得不同字体。

类构造函数

序号构造函数描述
1XSSFFont()创建一个字体对象

方法

序号方法描述
1setBold(boolean bold)设置字体是否为粗体
2setColor(short color)设置字体的索引颜色
3setColor(XSSFColor color)以标准RGB颜色设置字体颜色
4setFontHeight(short height)以磅为单位设置字体高度
5setFontName(String name)设置字体的名称
6setItalic(boolean italic)设置紫铜是否为斜体

3. POI工作薄

3.1 创建空白工作簿

import java.io.*;
import org.apache.poi.xssf.usermodel.*;

public class CreateWorkBook {
   public static void main(String[] args)throws Exception {
      //创建一个空的工作薄
      XSSFWorkbook workbook = new XSSFWorkbook(); 

      //创建一个的文件名称
      FileOutputStream out = new FileOutputStream(new File("createworkbook.xlsx"));

      //使用文件输出对象写入操作工作簿
      workbook.write(out);
      out.close();
      System.out.println("createworkbook.xlsx written successfully");
   }
}

3.2 打开现有的工作薄

import java.io.*;
import org.apache.poi.xssf.usermodel.*;

public class OpenWorkBook {
   public static void main(String args[])throws Exception { 
	   try {
         File file = new File("openworkbook.xlsx");
         FileInputStream fIP = new FileInputStream(file);

         //获取XLSX文件的工作簿实例 
         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 openworkbook.xlsx file.");
         }
      } catch(Exception e) {
         System.out.println("Error to open openworkbook.xlsx file." + e.getMessage());
      }
   }
}

4. POI电子表格

创建电子表格,先创建一个workbook,然后我们就可以继续创建sheet了。

以下是创建电子表格的代码段

//创建一个空的工作薄
XSSFWorkbook workbook = new XSSFWorkbook();

//创建一个空的sheet
XSSFSheet spreadsheet = workbook.createSheet("Sheet Name");

 4.1 写入电子表格

考虑一个员工数据的例子,

Emp IdEmp NameDesignation
Tp01GopalTechnical Manager
TP02ManishaProof Reader
Tp03MasthanTechnical Writer
Tp04SatishTechnical Writer
Tp05KrishnaTechnical Writer

 代码片段

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 {
      //创建一个新的工作薄
      XSSFWorkbook workbook = new XSSFWorkbook(); 

      //创建一个新的sheet
      XSSFSheet spreadsheet = workbook.createSheet(" Employee Info ");

      //创建一行
      XSSFRow row;

      //定义要输出的数据
      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" });
      
      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);
         }
      }
      
      FileOutputStream out = new FileOutputStream(new File("Writesheet.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("Writesheet.xlsx written successfully");
   }
}

 4.2 从电子表格中读取数据

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 NUMERIC:
                  System.out.print(cell.getNumericCellValue() + " \t\t ");
                  break;
               
               case STRING:
                  System.out.print(
                  cell.getStringCellValue() + " \t\t ");
                  break;
            }
         }
         System.out.println();
      }
      fis.close();
   }
}

5. POI单元格

5.1 创建一个单元格

//create new workbook
XSSFWorkbook workbook = new XSSFWorkbook(); 

//create spreadsheet with a name
XSSFSheet spreadsheet = workbook.createSheet("new sheet");

//create first row on a created spreadsheet
XSSFRow row = spreadsheet.createRow(0);

//create first cell on created row
XSSFCell cell = row.createCell(0);

5.2 单元格类型

单元格类型指定单元格是否可以包含字符串、数值或公式。 字符串单元格不能保存数值,数字单元格不能保存字符串。

以下代码用于在电子表格中创建不同类型的单元格。

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 date");
      row.createCell(1).setCellValue(new Date());
      
      row = spreadsheet.createRow((short) 6);
      row.createCell(0).setCellValue("set cell type numeric");
      row.createCell(1).setCellValue(20 );
      
      row = spreadsheet.createRow((short) 7);
      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");
   }
}

5.3 单元格样式

您可以在这里学习如何设置单元格格式并应用不同的样式,例如合并相邻单元格、添加边框、设置单元格对齐方式和填充颜色。

以下代码用于使用 Java 编程将不同的样式应用于单元格。

import java.io.File;
import java.io.FileOutputStream;

import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.Color;
import org.apache.poi.ss.usermodel.FillPatternType;

public class CellStyle {
   public static void main(String[] args)throws Exception {
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      XSSFSheet spreadsheet = workbook.createSheet("cellstyle");
      XSSFRow row = spreadsheet.createRow((short) 1);
      row.setHeight((short) 800);
      XSSFCell cell = (XSSFCell) row.createCell((short) 1);
      cell.setCellValue("test of merging");

      //MEARGING CELLS 
      //this statement for merging cells

      spreadsheet.addMergedRegion(
         new CellRangeAddress(
            1, //first row (0-based)
            1, //last row (0-based)
            1, //first column (0-based)
            4 //last column (0-based)
         )
      );
      
      //CELL Alignment
      row = spreadsheet.createRow(5); 
      cell = (XSSFCell) row.createCell(0);
      row.setHeight((short) 800);
      
      // Top Left alignment 
      XSSFCellStyle style1 = workbook.createCellStyle();
      spreadsheet.setColumnWidth(0, 8000);
      style1.setAlignment(HorizontalAlignment.LEFT);
      style1.setVerticalAlignment(VerticalAlignment.TOP);
      cell.setCellValue("Top Left");
      cell.setCellStyle(style1);
      row = spreadsheet.createRow(6); 
      cell = (XSSFCell) row.createCell(1);
      row.setHeight((short) 800);
      
      // Center Align Cell Contents 
      XSSFCellStyle style2 = workbook.createCellStyle();
      style2.setAlignment(HorizontalAlignment.CENTER);
      style2.setVerticalAlignment(VerticalAlignment.CENTER);
      cell.setCellValue("Center Aligned"); 
      cell.setCellStyle(style2);
      row = spreadsheet.createRow(7); 
      cell = (XSSFCell) row.createCell(2);
      row.setHeight((short) 800);
      
      // Bottom Right alignment 
      XSSFCellStyle style3 = workbook.createCellStyle();
      style3.setAlignment(HorizontalAlignment.RIGHT);
      style3.setVerticalAlignment(VerticalAlignment.BOTTOM);
      cell.setCellValue("Bottom Right");
      cell.setCellStyle(style3);
      row = spreadsheet.createRow(8);
      cell = (XSSFCell) row.createCell(3);
      
      // Justified Alignment 
      XSSFCellStyle style4 = workbook.createCellStyle();
      style4.setAlignment(HorizontalAlignment.JUSTIFY);
      style4.setVerticalAlignment(VerticalAlignment.JUSTIFY);
      cell.setCellValue("Contents are Justified in Alignment"); 
      cell.setCellStyle(style4);
      
      //CELL BORDER
      row = spreadsheet.createRow((short) 10);
      row.setHeight((short) 800);
      cell = (XSSFCell) row.createCell((short) 1);
      cell.setCellValue("BORDER");
      
      XSSFCellStyle style5 = workbook.createCellStyle();
      style5.setBorderBottom(BorderStyle.THICK);
      style5.setBottomBorderColor(IndexedColors.BLUE.getIndex());
      style5.setBorderLeft(BorderStyle.DOUBLE);
      style5.setLeftBorderColor(IndexedColors.GREEN.getIndex());
      style5.setBorderRight(BorderStyle.HAIR);
      style5.setRightBorderColor(IndexedColors.RED.getIndex());
      style5.setBorderTop(BorderStyle.DOTTED);
      style5.setTopBorderColor(IndexedColors.CORAL.getIndex());
      cell.setCellStyle(style5);
      
      //Fill Colors
      //background color
      row = spreadsheet.createRow((short) 10 );
      cell = (XSSFCell) row.createCell((short) 1);
      
      XSSFCellStyle style6 = workbook.createCellStyle();
      style6.setFillBackgroundColor(IndexedColors.LIME.index);
      style6.setFillPattern(FillPatternType.LESS_DOTS);
      style6.setAlignment(HorizontalAlignment.FILL);
      spreadsheet.setColumnWidth(1,8000);
      cell.setCellValue("FILL BACKGROUNG/FILL PATTERN");
      cell.setCellStyle(style6);
      
      //Foreground color
      row = spreadsheet.createRow((short) 12);
      cell = (XSSFCell) row.createCell((short) 1);
      
      XSSFCellStyle style7 = workbook.createCellStyle();
      style7.setFillForegroundColor(IndexedColors.BLUE.index);
      style7.setFillPattern( FillPatternType.LESS_DOTS);
      style7.setAlignment(HorizontalAlignment.FILL);
      cell.setCellValue("FILL FOREGROUND/FILL PATTERN");
      cell.setCellStyle(style7);

      FileOutputStream out = new FileOutputStream(new File("cellstyle.xlsx"));
      workbook.write(out);
      out.close();
      System.out.println("cellstyle.xlsx written successfully");
   }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钟小猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值