使用Java将数据写入Google Spreadsheet

时间:2016-07-20 16:45:10

标签: java google-sheets google-drive-api google-spreadsheet-api

我迷失了这个。我正在尝试将Java与Google电子表格连接起来,尽管API的文档在检索数据方面已经完成(并且工作正常),但我无法弄清楚如何写入电子表格。

任何人都可以提供完整示例(包含必要的导入和所有内容),了解如何在Google电子表格中输入非常简单的数据(例如,在A1单元格中输入“asdf” Sheet1)?

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

非常感谢, 泽索特

3 个答案:

答案 0 :(得分:11)

好的,我花了好几个小时才弄明白,答案结果比从头开始构建Ajax请求更容易。为了节省其他人的时间和工作时间,这里有适合我的解决方案。

Prereqs:我使用Quickstart tutorial of the 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 example provided here

希望它有所帮助, 泽索特

答案 1 :(得分:11)

以下是快速入门教程代码的修改版本,用于执行写入。

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
        }
    }

根据快速入门教程,您需要从Google下载认证文件。

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 :(得分:2)

使用 XmlHttpRequest 请求。

我会给你一个快速演示,你将实际在google电子表格上写。然后,您将使用首选语言Java来应用这些概念。

  1. 打开谷歌电子表格进行写作。获取电子表格ID
  2. 转到oauth playground并导航至 Google表格API v4
  3. 选择https://www.googleapis.com/auth/drive权限。单击“授权API”。允许许可。
  4. 在步骤2中,按下令牌的Exchange授权码按钮。
  5. 在步骤3中,将其粘贴到请求URI:

    https://sheets.googleapis.com/v4/spreadsheets/ {SpreadsheetID} /值/ Sheet 1中!A1?valueInputOption = USER_ENTERED

  6. HTTP方法 PUT

    将其放入您的输入请求正文

    {
      "range":"Sheet1!A1",
      "majorDimension": "ROWS",
      "values": [
        ["Hello World"]
      ],
    }
    

    点击发送请求。如果您收到200 OK响应,请将“Hello World”写入电子表格的A1单元格中。 您可以阅读有关writing data in Sheets v4 here的更多信息。

    如何在Java中执行此操作?了解Java中的AJAX或XHR实现。检查this tutorial以帮助您入门。