使用Apache POI用Java写入Excel文件

时间:2020-01-09 10:35:37  来源:igfitidea点击:

在本文中,我们将介绍如何使用Apache POI库以Java格式写入Excel文件。如果必须阅读Java中的Excel文件,则可以查看此文章使用Apache POI阅读Java中的Excel文件

Apache POI

Apache POI是用于Microsoft文档的Java API。使用Apache POI,我们可以使用Java读写MS Excel文件。此外,我们可以使用Java读写MS Word和MS PowerPoint文件。

Apache POI支持读取OLE2文件和Office Open XML标准(OOXML)文件。

  • OLE2文件包括大多数Microsoft Office文件,例如XLS,DOC和PPT以及基于MFC序列化API的文件格式。

  • Office OpenXML Format是在Microsoft Office 2007和2008中发现的基于新标准的XML文件格式。其中包括XLSX,DOCX和PPTX。

这意味着Apache POI支持编写.xls格式的excel文件以及.xlsx格式的excel文件。

Apache POI的Maven依赖关系

要使用Apache POI写入excel文件,我们需要添加以下依赖项。

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>4.0.1</version>
</dependency>

这种依赖性增加了以下罐子

poi-ooxml-4.0.1.jar
poi-4.0.1.jar
poi-ooxml-schemas-4.0.1.jar
curvesapi-1.05.jar
commons-compress-1.18.jar
commons-math3-3.6.1.jar
commons-collections4-4.2.jar
xmlbeans-3.0.2.jar

在这里请注意poi-4.0.1.jar具有用于处理旧Excel格式(.xls)的类
poi-ooxml-4.0.1.jar具有使用较新的excel格式(.xlsx)的类。 Apache POI 4.0.1需要Java 8或者更高版本。

用于编写Excel文件的Apache POI类

以下部分概述了用于使用Apache POI用Java写入excel文件的类。
Apache POI库为两种Excel电子表格格式提供了两种实现

  • HSSF –这是用于早期excel格式(.xls)的纯Java实现。此实现中的类通常具有HSSF前缀,例如HSSFWorkBook,HSSFSheet。

  • XSSF –它是xslx文件格式(OOXML)的纯Java实现。此实现中的类通常具有XSSF前缀,例如XSSFWorkBook,XSSFSheet。

SS –这是一个在HSSF和XSSF之上构建的程序包,它使用通用API为两种格式提供通用支持。我们应该尝试使用此程序包中的类以获得更好的兼容性。

使用excel文件时,通常的进度是

有与此进度相对应的界面

  • org.apache.poi.ss.usermodel.Workbook – Excel工作簿的高级表示形式。这是大多数用户正在阅读或者编写工作簿时构造的第一个对象。它也是创建新图纸的顶层对象。

  • org.apache.poi.ss.usermodel.Sheet-Excel工作表的高级表示。工作表是工作簿中的中心结构。

  • org.apache.poi.ss.usermodel.Row-电子表格行的高级表示。

  • org.apache.poi.ss.usermodel.Cell –电子表格行中单元格的高级表示形式。单元格可以是数字的,基于公式的或者基于字符串的(文本)。

为了创建工作簿,使用了WorkbookFactory类。

  • org.apache.poi.ss.usermodel.WorkbookFactory –用于通过从提供的输入中自动检测来创建适当种类的工作簿(HSSFWorkbook或者XSSFWorkbook)的工厂。

使用Apache POI示例以Java编写Excel文件

对于该示例,有一个Employee类,其字段为firstName,lastName,department和DOB。使用这些字段,数据每行4列写入excel文件。
员工阶层

public class Employee {
  private String firstName;
  private String lastName;
  private String department;
  private Date dob;

  public Employee(String firstName, String lastName, String department, Date dob) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.department = department;
    this.dob = dob;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  }
  public String getDepartment() {
    return department;
  }
  public void setDepartment(String department) {
    this.department = department;
  }
  public Date getDob() {
    return dob;
  }
  public void setDob(Date dob) {
    this.dob = dob;
  }	

  @Override
  public String toString() {    
    return getFirstName() + " " + getLastName() + " " + getDepartment() + " " + getDob();
  }
}

跟随Java类从Employee对象的字段中检索数据,并将其写入Excel工作表。

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class WriteExcel {
  private static final String EXCEL_FILE_PATH="F:\theitroad\Java\Java Programs\Java IO\Employee.xlsx";
  public static void main(String[] args) {
    WriteExcel writeExcel = new WriteExcel();		
    writeExcel.writeExcelFile(EXCEL_FILE_PATH, WriteExcel.getEmployees());
  }
	
  public void writeExcelFile(String excelFilePath, List<Employee> employees) {
    final String[] header= {"First Name", "Last Name", "Department", "DOB"};
    Workbook workbook = null;
    // Excel with .xslx extension
    workbook = new XSSFWorkbook();
    // For .xls extension HSSF workbook can be created
    //workbook = new HSSFWorkbook();

    // Creating sheet with in the workbook
    Sheet sheet = workbook.createSheet("Employees");
    /*Font and style For Header*/
    Font font = workbook.createFont();
    font.setFontName("VERDANA");
    font.setColor(IndexedColors.CORNFLOWER_BLUE.getIndex());
    font.setBold(true);
         
    CellStyle style = workbook.createCellStyle();
    style.setFont(font);
    style.setWrapText(true);
    style.setAlignment(HorizontalAlignment.CENTER);
    style.setVerticalAlignment(VerticalAlignment.CENTER);
    style.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE.getIndex());
    style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
    style.setBorderRight(BorderStyle.THIN);
    style.setRightBorderColor(IndexedColors.BLACK.getIndex());
    style.setBorderLeft(BorderStyle.THIN);
    style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
    style.setBorderTop(BorderStyle.THIN);
    style.setTopBorderColor(IndexedColors.BLACK.getIndex());
    style.setBorderBottom(BorderStyle.THIN);
    style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
         
    Row row = sheet.createRow(0);
    // Writing header to excel
    for(int i = 0; i < header.length; i++) {
       // each column 20 characters wide
       sheet.setColumnWidth(i, 20*256);
       Cell cell = row.createCell(i);
       cell.setCellValue(header[i]);
       cell.setCellStyle(style);
    }   
    // Header styling ends
    //Preparing column data for each row
    CellStyle dateStyle = workbook.createCellStyle();
    // Setting format For the date column
    dateStyle.setDataFormat(workbook.getCreationHelper()
                                    .createDataFormat().getFormat("dd/MM/yyyy"));
    int rowNum = 1;
    for(Employee emp : employees) {
      // create new row
      row = sheet.createRow(rowNum++);
      row.createCell(0).setCellValue(emp.getFirstName());
      row.createCell(1).setCellValue(emp.getLastName());
      row.createCell(2).setCellValue(emp.getDepartment());            
      Cell cell = row.createCell(3);
      cell.setCellValue(emp.getDob());
      cell.setCellStyle(dateStyle);
    }
        
    FileOutputStream outputStream = null;
    try {
     outputStream = new FileOutputStream(excelFilePath);
     // Writing to excel sheet
     workbook.write(outputStream);
    } catch (IOException exp) {
     // TODO Auto-generated catch block
     exp.printStackTrace();
    }finally {
      if(outputStream != null) {
        try {
          outputStream.close();
          workbook.close();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
      }
    }   
  }
	
  // Method to get list of employees
  private static List<Employee> getEmployees(){
    List<Employee> employees = new ArrayList<Employee>();
    Calendar dob = Calendar.getInstance();
    // Month is 0 based
    dob.set(1990,10,12); //12-Nov-1990
    employees.add(new Employee("John", "Emerson", "Technology", dob.getTime()));
    dob.set(1960, 04, 07);
    employees.add(new Employee("Shelly", "Mcarthy", "HR", dob.getTime()));
    dob.set(1992, 02, 03);
    employees.add(new Employee("Tom", "Cevor", "Finance", dob.getTime()));
    return employees;
  }
}

运行此程序将创建excel表格。