将数据写入带有Java的Google电子表格中

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

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

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

非常感谢,Zsolt


答案 1

好吧,我花了几个小时才最终弄清楚,结果比从头开始构建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


答案 2

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

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。


推荐