【问题标题】:Write data into Google Spreadsheet w/ Java使用 Java 将数据写入 Google 电子表格
【发布时间】:2016-07-20 16:45:09
【问题描述】:

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

谁能提供一个完整示例(包含必要的导入和所有内容),说明如何将非常简单的数据输入到 Google 电子表格中(例如,在 A1 单元格中输入“asdf” Sheet1)?

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

非常感谢, Zsolt

【问题讨论】:

  • First result 我发现似乎有关于如何写出单元格的信息。
  • 只需探索 API/Java 文档。你也许能弄清楚
  • CodeChimp,您正在链接到旧代码。我会对当前最新版本的工作示例感兴趣。谢谢

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


【解决方案1】:

好的,我花了好几个小时才最终弄清楚,结果证明比从头开始构建 Ajax 请求更容易。希望为他人节省时间和时间,这是对我有用的解决方案。

先决条件:我使用 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

希望对你有帮助, 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 添加到我的项目中。

    【讨论】:

      【解决方案3】:

      利用XmlHttpRequest请求。

      我将为您提供一个快速演示,您将在其中实际在 google 电子表格上进行书写。然后,您将使用您的首选语言 Java 应用此处的概念。

      1. 打开一个 google 电子表格进行书写。获取它的电子表格 ID
      2. 转到 oauth playground 并导航到 Google Sheets API v4
      3. 选择https://www.googleapis.com/auth/drive 权限。单击授权 API。允许权限。
      4. 在第 2 步中,按兑换令牌的授权码按钮。
      5. 在第 3 步,将其粘贴到请求 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 单元格。 你可以阅读更多关于writing data in Sheets v4 here的信息。

      如何在 Java 中做到这一点?了解 Java 中的 AJAX 或 XHR 实现。请查看this tutorial 以帮助您入门。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多