使用Java向Google电子表格写入数据

13

我有些迷茫。我试图将Java与Google电子表格连接起来,虽然API文档在检索数据方面非常完整(并且它也正常工作),但我无法弄清楚如何写入电子表格。

请问是否能提供一个完整的示例(包括必要的导入等全部内容),以便进行非常简单的数据输入到Google电子表格(比如,在Sheet1的A1单元格中输入" asdf ")?

如果这样的教程存在于某个地方,我找不到它 - 非常感谢任何指点。

非常感谢, Zsolt


我找到的第一个结果似乎有关于如何编写单元格的信息。 - CodeChimp
只需探索API/Java文档,你可能就能弄清楚。 - JavaHopper
CodeChimp,你正在链接到传统代码。我对使用最新版本的工作示例很感兴趣。谢谢。 - Zsolt Balla
3个回答

12

好的,我花了几个小时才最终搞清楚,答案竟然比从头构建Ajax请求还要简单。希望能为其他人节省数小时的时间,这是对我有用的解决方案。

先决条件:我使用了Google Sheets API的快速入门教程来读取一个相当复杂的表格,但对我而言非常有效。

教程后,我需要做一些修改:

1. 更改此行代码

private static final List<String> SCOPES =
        Arrays.asList(SheetsScopes.SPREADSHEETS_READONLY);

private static final List<String> SCOPES =
        Arrays.asList(SheetsScopes.SPREADSHEETS);

由于我们想要编写表格而不仅仅是读取它,因此需要进行明显的操作。

2、删除存储在用户目录中名为 /.credentials/ 的文件夹中的存储凭据。

还有一点需要注意:似乎有一个名为

的方法。

spreadsheets.values.update()

但我无法使它工作,因为它需要设置一个valueInputOption参数,几个小时的搜索也没能找到在哪里设置。

最终,我采用了一种称为

spreadsheets.values.batchUpdate()

这里是完整的代码方法,它成功地将"Hello World!"写入表格单元格中(至于导入,我使用了与上面的快速入门教程相同的导入):

void WriteExample() throws IOException {
    Sheets service = getSheetsService();
    List<Request> requests = new ArrayList<>();

      List<CellData> values = new ArrayList<>();


      values.add(new CellData()
                .setUserEnteredValue(new ExtendedValue()
                        .setStringValue("Hello World!")));
        requests.add(new Request()
                .setUpdateCells(new UpdateCellsRequest()
                        .setStart(new GridCoordinate()
                                .setSheetId(0)
                                .setRowIndex(0)
                                .setColumnIndex(0))
                        .setRows(Arrays.asList(
                                new RowData().setValues(values)))
                        .setFields("userEnteredValue,userEnteredFormat.backgroundColor")));

        BatchUpdateSpreadsheetRequest batchUpdateRequest = new BatchUpdateSpreadsheetRequest()
                .setRequests(requests);
        service.spreadsheets().batchUpdate(spreadsheetId, batchUpdateRequest)
                .execute();
    }

SheetId即你所编写的工作表的ID(对于某个电子表格中的第一个工作表,它始终为0,而对于其他工作表,可以从URL中获取:它是#gid=后面的部分)。

如果你想要进一步处理复杂的问题,比如格式或者使用公式,你可以使用此处提供的Java示例

希望能对您有所帮助, Zsolt


12

这里是快速入门教程代码的修改版,用于执行写入操作。

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.HttpTransport;
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.*;
import java.util.*;

public class SheetsIntegration {

    private static HttpTransport transport;
    private static JacksonFactory jsonFactory;
    private static FileDataStoreFactory dataStoreFactory;

我在这一行收到了权限警告,但它不是致命的

    private static final java.io.File DATA_STORE_DIR = new java.io.File(System.getProperty("user.home"), ".credentials/sheets.googleapis.com.json");

快速入门教程使用只读范围代替

    private static List<String> scopes = Arrays.asList(SheetsScopes.SPREADSHEETS);

    public SheetsIntegration() {
        try {
            transport = GoogleNetHttpTransport.newTrustedTransport();
            dataStoreFactory = new FileDataStoreFactory(DATA_STORE_DIR);
            jsonFactory = JacksonFactory.getDefaultInstance();

            service = getSheetsService();
        } catch (Exception e) {
            // handle exception
        }
    }

根据快速入门教程,您需要从谷歌下载证书文件。

public static Credential authorize() throws IOException {
    // Load client secrets.
    File cfile = new File("certs/cert.json");
    cfile.createNewFile();
    GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory, new InputStreamReader(new FileInputStream(cfile)));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow.Builder(
                    transport, jsonFactory, clientSecrets, scopes)
                    .setDataStoreFactory(dataStoreFactory)
                    .setAccessType("offline")
                    .build();
    Credential credential = new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    return credential;
}

public static Sheets getSheetsService() throws IOException {
    Credential credential = authorize();
    return new Sheets.Builder(transport, jsonFactory, credential)
            .setApplicationName("INSERT_YOUR_APPLICATION_NAME")
            .build();
}

public void writeSomething(List<Data> myData) {

    try {
        String id = "INSERT_SHEET_ID";
        String writeRange = "INSERT_SHEET_NAME!A3:E";

        List<List<Object>> writeData = new ArrayList<>();
        for (Data someData: myData) {
            List<Object> dataRow = new ArrayList<>();
            dataRow.add(someData.data1);
            dataRow.add(someData.data2);
            dataRow.add(someData.data3);
            dataRow.add(someData.data4);
            dataRow.add(someData.data5);
            writeData.add(dataRow);
        }

        ValueRange vr = new ValueRange().setValues(writeData).setMajorDimension("ROWS");
        service.spreadsheets().values()
                .update(id, writeRange, vr)
                .setValueInputOption("RAW")
                .execute();
    } catch (Exception e) {
        // handle exception
    }
}

还有一点需要注意 - 我不得不将servlet-api.jar添加到我的项目中。


2
利用 XmlHttpRequest 请求。
我将给你一个快速演示,你将在 Google 电子表格上实际写入。然后,您将使用您喜欢的语言 Java 应用这里的概念。
  1. 打开要写入的 Google 电子表格。获取它的 电子表格 ID
  2. 转到 oauth playground 并导航到 Google Sheets API v4
  3. 选择 https://www.googleapis.com/auth/drive 权限。单击授权 API。允许权限。
  4. 在第二步中,按下交换授权代码以获取令牌按钮。
  5. 在第三步中,在请求 URI 中粘贴以下内容:

    https://sheets.googleapis.com/v4/spreadsheets/{SpreadsheetID}/values/Sheet1!A1?valueInputOption=USER_ENTERED

HTTP 方法是 PUT
将此放入您的输入请求正文中。
{
  "range":"Sheet1!A1",
  "majorDimension": "ROWS",
  "values": [
    ["Hello World"]
  ],
}

点击 发送请求。如果您收到 200 OK 响应,则预计 "Hello World" 将被写入您电子表格的 A1 单元格中。 您可以在这里阅读更多关于 在 Sheets v4 中写入数据 的信息。
如何在 Java 中实现这个功能?了解 AJAX 或 XHR 在 Java 中的实现。查看 此教程 以帮助您入门。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接