Java 读取Google Sheet

前言

在这里插入图片描述

我亲爱的领导又又给我安排了一项任务,
希望开发一个功能将我们数据库中数据,上传到Google Sheets,随时读取变更内容后更新回数据库。
这个Google Sheets可以理解为在线Excel。

接收到任务的我之前没有开发过在Google 开发平台上集成api。

我只能硬着头皮开发,顺便说说我的开发思路,
第一步:我需要先找开发者文档
第二步:理解文档,
第三部:写一个简单的例子

Sheets Api开发文档

历经千辛万苦,我终于找到了这个开发文档:(需要翻墙)
https://developers.google.com/sheets/api/quickstart/java

在这里插入图片描述
在这里插入图片描述
英文文档,说实话就很棒,我一遍猜测一遍使用谷歌翻译理解文档内容

1.需要java1.8以上版本(没关系,我的就是1.8)
2.需要Gradle (实验后发现Maven也可以)
3.创建一个项目 和 开启Api
4.创建一个凭证

创建项目,开启Api

创建说明:
https://developers.google.com/workspace/guides/create-project

点击这里先创建一个项目,
在这里插入图片描述
再进入Api设置
在这里插入图片描述
选择你要使用的API,我们当然是Googel sheets
在这里插入图片描述
在这里插入图片描述
最后开启这个api
在这里插入图片描述

创建凭据

在这里插入图片描述
这里根据各自的业务需求选择
在这里插入图片描述
这里需要注意一个问题:如果选择OAuth需要设定一个回调地址
因为第一次请求会做一个校验,googel会返回给你一个code。

在这里插入图片描述
最后我再下载创建好的凭据
在这里插入图片描述

这样我们的前期准备工作就完成了

代码

首先我们可以根据下面给的例子搭建一个demo

maven

        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client</artifactId>
            <version>1.30.4</version>
        </dependency>
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client-jetty</artifactId>
            <version>1.30.6</version>
        </dependency>
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-sheets</artifactId>
            <version>v4-rev581-1.25.0</version>
        </dependency>

demo

这里是只是将api 文档中SheetsQuickstart 改为GoogleSheetsUtil

import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.ValueRange;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;

public class GoogleSheetsUtil {
    private static final String APPLICATION_NAME = "invault";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
    private static final String TOKENS_DIRECTORY_PATH = "tokens";

    /**
     * Global instance of the scopes required by this quickstart.
     * If modifying these scopes, delete your previously saved tokens/ folder.
     */
    private static final List<String> SCOPES = Collections.singletonList(SheetsScopes.SPREADSHEETS_READONLY);
    private static final String CREDENTIALS_FILE_PATH = "/credentials.json";

    /**
     * Creates an authorized Credential object.
     * @param HTTP_TRANSPORT The network HTTP Transport.
     * @return An authorized Credential object.
     * @throws IOException If the credentials.json file cannot be found.
     */
    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
        // Load client secrets.
        InputStream in = GoogleSheetsUtil.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
            throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
                .setAccessType("offline")
                .build();
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
        return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
    }

    /**
     * Prints the names and majors of students in a sample spreadsheet:
     * https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
     */
    public static void main(String... args) throws IOException, GeneralSecurityException {
        // Build a new authorized API client service.
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        final String spreadsheetId = "1CJ9oaHk_gzKrEcSyYrzXUddrY3pYC15rmZkBoh0N5Gw";
        final String range = "Sheet1!A2:F10";
        Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
                .setApplicationName(APPLICATION_NAME)
                .build();
        ValueRange response = service.spreadsheets().values()
                .get(spreadsheetId, range)
                .execute();
        List<List<Object>> values = response.getValues();
        if (values == null || values.isEmpty()) {
            System.out.println("No data found.");
        } else {
            System.out.println("Name, Major");
            for (List row : values) {
                // Print columns A and E, which correspond to indices 0 and 4.
                System.out.printf("%s, %s\n", row.get(0), row.get(4));
            }
        }
    }
}

凭据

按照代码中的InputStream的路劲,我将下载后的凭据,改名为credentials.json然后放入
在这里插入图片描述

选择文档

最后我们选择要读取的文档id-即spreadsheetId
例如我创建的文档
在这里插入图片描述
接着选择读取范围
range这里改成你表格名称,例如我的就是原始的Sheet1
A2:F10 代表你要读取的范围

运行结果

在这里插入图片描述

最后

在这里插入图片描述

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
要在 Java读取指定的 Excel 工作表(sheet)的数据,您可以使用 Apache POI 库。以下是一个示例代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.IOException; public class ExcelReader { public static void main(String[] args) { String filePath = "path/to/your/excel/file.xlsx"; String sheetName = "Sheet1"; try (FileInputStream fis = new FileInputStream(filePath); Workbook workbook = new XSSFWorkbook(fis)) { Sheet sheet = workbook.getSheet(sheetName); if (sheet == null) { System.out.println("Sheet not found: " + sheetName); return; } for (Row row : sheet) { for (Cell cell : row) { CellType cellType = cell.getCellType(); if (cellType == CellType.STRING) { System.out.print(cell.getStringCellValue() + "\t"); } else if (cellType == CellType.NUMERIC) { System.out.print(cell.getNumericCellValue() + "\t"); } else if (cellType == CellType.BOOLEAN) { System.out.print(cell.getBooleanCellValue() + "\t"); } else if (cellType == CellType.BLANK) { System.out.print("\t"); } } System.out.println(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 您需要将 `filePath` 替换为您的 Excel 文件路径,`sheetName` 替换为您要读取的工作表名称。上述代码使用 `XSSFWorkbook` 类来读取 `.xlsx` 格式的文件,如果您要读取 `.xls` 格式的文件,可以使用 `HSSFWorkbook` 类。 代码将逐行打印工作表中的数据,每个单元格之间用制表符分隔。您可以根据需要对代码进行修改,以满足您的具体要求。 希望这个示例代码能帮助到您。如果您有其他问题,请随时提问。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值