当前位置:Java -> 如何使用Java中的API从Excel电子表格中获取单元格数据

如何使用Java中的API从Excel电子表格中获取单元格数据

我们的Excel电子表格在成百上千个单元格和行中存储了大量宝贵的数据。随着如此多的干净、格式化的数字数据可供我们使用,我们需要找到编程方法来提取和共享这些数据,以及其他文件生态系统中的重要文档。

值得庆幸的是,微软在15年前将文件表示标准转换为OpenXML后,这一点变得非常容易。这种开源的基于XML的方法通过基于众所周知的技术——即Zip和XML——来构建文档结构,极大地改善了所有Office文档内容的可访问性,这些技术大多数软件开发人员都非常了解。在那之前,Excel(XLS)文件存储在一种名为BIFF(二进制交换文件格式)的二进制文件格式中,其他专有的二进制格式用于表示其他Office文件,比如Word(DOC)。

这种转换为开放文档标准使得开发人员能够构建应用程序,可以以意义非凡的方式直接与Office文档进行交互。例如,要获取特定Excel工作簿的结构信息,开发人员可以编写代码访问XLSX文件结构中的xl/workbook.xml,并获取他们需要的所有工作簿元数据。类似地,要获取特定工作表数据,他们可以访问xl/worksheets/(sheetname).xml,知道该工作表的每个单元格和值都将由简单的<c>和<v>元素表示,并且其中包含所有相关的数据。这有点过于简化了,但它能够指出浏览一系列压缩的XML文件路径的简便性。

鉴于Excel文件的全球流行,构建(或者简单扩展)可以无缝加载和操作XLSX文件的应用程序是理所当然的。现代应用程序有数十个例子可以无缝加载和操作XLSX文件,而且许多甚至提供以XLSX格式导出文件的选项。

当我们开始构建与Excel文件交互的应用程序时,我们有几种选择。我们可以选择编写代码来筛选OpenXML文档格式,或者可以下载专门的编程库,或者可以选择调用专门设计的Web API来代表我们处理特定的文档交互。前两种选择可以帮助我们保持我们的代码局部化,但它们会耗费大量的键盘时间并且成本更高。通过后一种选择,我们可以将我们的编码和处理开销转移到外部服务,从而以极少的麻烦收获所有的好处。也许最有益的是,我们可以使用API来节省时间,迅速让我们的应用程序原型开始。

演示

在本文的其余部分中,我将快速演示两个免费使用的Web API,它们可以稍微不同的方式获取我们在XLSX电子表格中特定单元格的内容。下面有现成的Java代码,可以帮助我们轻松构造我们的调用。

这两个api都将返回有关我们目标单元格的信息,包括单元格路径、单元格文本值、单元格标识符、单元格样式索引以及该单元格使用的公式(如果有)。借助我们的响应对象中的信息,我们随后可以要求我们的应用程序为各种目的在电子表格和其他开放标准文件之间共享数据。

方便的是,这两个API请求可以使用相同的免费API密钥进行授权。还需要注意的是,这两个API在内存中处理文件数据,并且在请求完成后释放这些数据。这使得这两个请求都非常快速和极其安全。

这两个API中的第一个解决方案将使用我们请求中的行索引和单元格索引来定位我们想要的数据。第二个解决方案将使用单元格标识符(即A1、B1、C1等)来达到相同的目的。虽然单元格索引和单元格标识符通常可以互换使用(都可以定位Excel工作表中特定位置的特定单元格),但使用单元格索引可以使我们的应用程序更容易地根据文档内的任何更改动态调整,而单元格标识符将始终保持不变。

为了使用这些API,我们首先需要使用Maven安装SDK。我们可以首先在pom.xml中添加到仓库的引用:

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

We can then add a reference to the dependency in pom.xml:

<dependencies>
<dependency>
    <groupId>com.github.Cloudmersive</groupId>
    <artifactId>Cloudmersive.APIClient.Java</artifactId>
    <version>v4.25</version>
</dependency>
</dependencies>

一旦安装完成,我们就可以构造我们的请求参数,并使用现成的Java代码示例来进行API调用。我们可以按照下面的application/JSON示例格式化我们的请求参数来使用行索引和单元格索引检索单元格数据:

{
  "InputFileBytes": "string",
  "InputFileUrl": "string",
  "WorksheetToQuery": {
    "Path": "string",
    "WorksheetName": "string"
  },
  "RowIndex": 0,
  "CellIndex": 0
}


确定参数后,我们可以使用下面的代码调用API:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.EditDocumentApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

EditDocumentApi apiInstance = new EditDocumentApi();
GetXlsxCellRequest input = new GetXlsxCellRequest(); // GetXlsxCellRequest | Document input request
try {
    GetXlsxCellResponse result = apiInstance.editDocumentXlsxGetCellByIndex(input);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling EditDocumentApi#editDocumentXlsxGetCellByIndex");
    e.printStackTrace();
}


为了使用单元格标识符检索单元格数据,我们可以按照下面的application/JSON示例格式化我们的请求参数:

{
  "InputFileBytes": "string",
  "InputFileUrl": "string",
  "WorksheetToQuery": {
    "Path": "string",
    "WorksheetName": "string"
  },
  "CellIdentifier": "string"
}


一旦参数设置好,我们可以使用下面的最终代码示例来构造我们的API调用:

// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.EditDocumentApi;

ApiClient defaultClient = Configuration.getDefaultApiClient();

// Configure API key authorization: Apikey
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
// Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
//Apikey.setApiKeyPrefix("Token");

EditDocumentApi apiInstance = new EditDocumentApi();
GetXlsxCellByIdentifierRequest input = new GetXlsxCellByIdentifierRequest(); // GetXlsxCellByIdentifierRequest | Document input request
try {
    GetXlsxCellByIdentifierResponse result = apiInstance.editDocumentXlsxGetCellByIdentifier(input);
    System.out.println(result);
} catch (ApiException e) {
    System.err.println("Exception when calling EditDocumentApi#editDocumentXlsxGetCellByIdentifier");
    e.printStackTrace();
}


这就是我们需要的全部代码。有了这些实用的API,我们的项目将很快启动并运行。

推荐阅读: 15.索引的设计原则?

本文链接: 如何使用Java中的API从Excel电子表格中获取单元格数据