专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java读取xlsx文件的方法

Java读取xlsx文件的方法

更新时间:2022-12-09 11:28:32 来源:赢咖4 浏览2303次

在本文中,我们将学习如何从 java 代码读取和写入 excel 文件 (.xlsx)。由于 JDK 不提供直接的 API 来读写 XLSX 文件,我们将不得不依赖第三方库来完成这项工作。幸运的是,有很多库可供我们使用,比如可以使用Apache POI。

为什么选择 Apache?

Apache POI 是一种流行的 API,它 允许程序员使用 Java 程序创建、修改和显示 MS Office 文件。它是由 Apache 软件基金会开发和分发的开源库,用于使用 Java 程序设计或修改 Microsoft Office 文件。

不仅是excel文件,POI还能做很多事情:

XSSF (XML SpreadSheet Format) – 用于读写 Open Office XML (XLSX) 格式的文件。

HSSF (可怕的电子表格格式)——用于读取和写入 Microsoft Excel (XLS) 格式的文件。

HWPF (Horrible Word Processor Format) – 读写 Microsoft Word 97 (DOC) 格式文件。

HSMF (Horrible Stupid Mail Format)——Microsoft Outlook MSG 文件的纯 Java 实现

HDGF (可怕的图表格式)——Microsoft Visio 二进制文件的第一个纯 Java 实现之一。

HPSF (可怕的属性集格式)——用于从 Microsoft Office 文件中读取“文档摘要”信息。

HSLF (可怕的幻灯片布局格式)——Microsoft PowerPoint 文件的纯 Java 实现。

HPBF (可怕的 PuBlisher 格式)——Apache 的 Microsoft Publisher 文件的纯 Java 实现。

DDF (可怕的绘图格式)——用于解码 Microsoft Office 绘图格式的 Apache POI 包。

Apache POI 入门

以下步骤将指导您完成 excel(.XLSX) 文件的读写。

1.创建一个Spring Boot应用

您可以从创建它https://start.spring.io/或使用 IDE 创建应用程序,我们将随时添加依赖项。

2.添加必要的依赖

打开 pom.xml,然后添加以下依赖项:

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

如果您不使用 Maven,则将以下 JAR 文件添加到您的 Java 程序的类路径中

poi-3.11-beta2.jar

commons-codec-1.9.jar

poi-ooxml-3.11-beta2.jar

poi-ooxml-schemas-3.11-beta2.jar

xmlbeans-2.6.0.jar

stax-api-1.0.1.jar

3.如何在java中读取Excel文件(XLSX)

我们将阅读的内容:

在java中读取XLSX文件的方法:

public static void readXLSX() {
                File file  = new File("/home/auriga/Downloads/Read.xlsx");
                try {
                        FileInputStream fis = new FileInputStream(file);
                        // finds the workbook instance for xlsx file
                        XSSFWorkbook myWorkBook =  new XSSFWorkbook(fis);
                        // returns the first sheet
                        XSSFSheet mysheet = myWorkBook.getSheetAt(0);
                        Iterator<Row> rowIterator = mysheet.iterator();
                  while(rowIterator.hasNext()) {
                           Row row  = rowIterator.next();
                           // for each row iterate through each column
                           Iterator<Cell> cellIterator = row.cellIterator();
                      while (cellIterator.hasNext()) {
                           Cell cell = cellIterator.next();
                           switch (cell.getCellType()) {
                              case Cell.CELL_TYPE_STRING:
                                System.out.print(cell.getStringCellValue() + "\t");
                                break;
                              case Cell.CELL_TYPE_NUMERIC:
                                System.out.print(cell.getNumericCellValue() + "\t");
                                break;
                            }
                      }
                      System.out.println("");
                  }
            }catch(Exception e) {
                 e.printStackTrace();
         }
}

前两行很容易理解,它们是从系统读取文件,主要代码从第四行开始,我们传递一个二进制输入流来创建一个XSSFWorkBook类的实例,它代表一个 Excel 工作簿。

下一行给了我们一个工作表,我们从那里开始迭代每一行,然后是每一列。单元格代表工作表中的每个块。这是我们读取或写入数据的地方。

单元格可以是任何类型,例如字符串、数字、布尔值等,因此我们需要在读取之前检查单元格的类型,因为我们有一个 switch case,它通过调用 getStringValue() 在读取特定单元格值之前检查类型, getNumericValue() 等

这就是您可以在 java 中读取 XLSX 文件的确切方式。

4.如何写入XLSX文件

写作也类似于阅读,我创建了另一种写入 XLSX 文件的方法。工作簿和工作表类将保持不变。

写入XLSX文件的方法:

public static void writeXLSX() {
                File file  = new File("/home/auriga/Downloads/Read.xlsx");
                try {
                        FileInputStream fis = new FileInputStream(file);
                        // finds the workbook instance for xlsx file
                        XSSFWorkbook myWorkBook =  new XSSFWorkbook(fis);
                        // returns the first sheet
                        XSSFSheet mysheet = myWorkBook.getSheetAt(0);
                        Map<String, Object[]> data = new HashMap<String,Object[]>();
                        data.put("1", new Object[]{"User 4",13});
                        data.put("2", new Object[]{"User 5",14});
                        data.put("3", new Object[]{"USer 6",15});
                        Set<String> rows = data.keySet();
                        int rownum = mysheet.getLastRowNum();
                        for(String key : rows) {
                                  // Creating a new Row in existing XLSX sheet
                                  Row row = mysheet.createRow(++rownum);
                                  Object [] objArr = data.get(key);
                                  int cellnum = 0;
                                  for (Object obj : objArr) {
                                            Cell cell = row.createCell(cellnum++);
                                            if (obj instanceof String) {
                                                   cell.setCellValue((String) obj);
                                            } else if (obj instanceof Boolean) {
                                                   cell.setCellValue((Boolean) obj);
                                            } else if (obj instanceof Date) {
                                                   cell.setCellValue((Date) obj);
                                            } else if (obj instanceof Integer) {
                                                   cell.setCellValue((Integer) obj);
                                            }
                                 }
                        }
                        // open an OutputStream to save written data into XLSX file
                        FileOutputStream os = new FileOutputStream(file);
                        myWorkBook.write(os);
                        System.out.println("Writing on XLSX file Finished ...");
                }catch(Exception e) {
             e.printStackTrace();
                }
}

我们已经创建了一个地图来存储数据,我们需要将其写入 excel 文件。然后迭代地图,并开始借助 setCellValue 方法插入值,在此之前我们需要知道最后编辑的行号和单元格值的类型。

最后,我们需要打开一个输出流来将写入的数据保存到 XLSX 文件中。

输出:

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>