使用java代码阅读项目中的谷歌演示表?

使用java代码阅读项目中的谷歌演示表?,java,google-sheets-api,Java,Google Sheets Api,在尝试过使用各种源代码和帖子中的代码片段之后,有人真的可以发布一个完整的(带有导入的)可用于项目中的起点工作java示例,以连接到演示Google工作表并(至少)读取数据吗?这将有利于那些寻找一个基本的工作机制,以发挥和定制进一步 例如,根据谷歌的样本: 其目的是从代码中注明的演示表中获取数据: https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit 从以下地点获得的罐子

在尝试过使用各种源代码和帖子中的代码片段之后,有人真的可以发布一个完整的(带有导入的)可用于项目中的起点工作java示例,以连接到演示Google工作表并(至少)读取数据吗?这将有利于那些寻找一个基本的工作机制,以发挥和定制进一步

例如,根据谷歌的样本:

其目的是从代码中注明的演示表中获取数据:

https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
从以下地点获得的罐子:

根据谷歌的指示,还需要生成一个“client_secret.json”文件,并提供给项目

我在GitHub上找到了迄今为止最全面的示例。(代码如下)感谢谷歌和jovito royeca/Hourlify。(它看起来还可以向工作表中添加数据,但可能需要跨越另一座桥)

对于我来说,在JAR和client_secret.json存在的情况下,运行代码时返回:

May 09, 2017 4:36:10 PM com.google.api.client.util.store.FileDataStoreFactory setPermissionsToOwnerOnly
WARNING: unable to change permissions for everybody: C:\Users\David\.credentials\sheets.googleapis.com-java-quickstart.json
May 09, 2017 4:36:10 PM com.google.api.client.util.store.FileDataStoreFactory setPermissionsToOwnerOnly
WARNING: unable to change permissions for owner: C:\Users\David\.credentials\sheets.googleapis.com-java-quickstart.json
Exception in thread "main" java.lang.NullPointerException
    at java.io.Reader.<init>(Unknown Source)
    at java.io.InputStreamReader.<init>(Unknown Source)
    at teamExample.SheetsQuickstart.authorize(SheetsQuickstart.java:70)
    at teamExample.SheetsQuickstart.getSheetsService(SheetsQuickstart.java:93)
    at teamExample.SheetsQuickstart.readSampleSpreadsheet(SheetsQuickstart.java:113)
    at teamExample.SheetsQuickstart.main(SheetsQuickstart.java:105)
2017年5月9日下午4:36:10 com.google.api.client.util.store.FileDataStoreFactory setpermissions远程
警告:无法更改每个人的权限:C:\Users\David\.credentials\sheets.googleapis.com-java-quickstart.json
2017年5月9日下午4:36:10 com.google.api.client.util.store.FileDataStoreFactory设置权限
警告:无法更改所有者的权限:C:\Users\David\.credentials\sheets.googleapis.com-java-quickstart.json
线程“main”java.lang.NullPointerException中出现异常
位于java.io.Reader。(未知源)
位于java.io.InputStreamReader。(未知源)
在teamExample.SheetsQuickstart.authorize(SheetsQuickstart.java:70)中
在teamExample.SheetsQuickstart.getSheetsService(SheetsQuickstart.java:93)中
在teamExample.SheetsQuickstart.readSampleSpreadsheet(SheetsQuickstart.java:113)中
位于teamExample.SheetsQuickstart.main(SheetsQuickstart.java:105)
完整代码,略微改编自GitHub repo:

/*
 * Sample java to access, read and write data in Google Sheets.
 */
package teamExample;

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.json.JsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.*;
import com.google.api.services.sheets.v4.Sheets;

import java.io.*;
import java.util.*;

public class SheetsQuickstart {
    /** Application name. */
    private static final String APPLICATION_NAME =
        "Google Sheets API Quickstart";

    /** Directory to store user credentials for this application. */
    private static final java.io.File DATA_STORE_DIR = new java.io.File(
        System.getProperty("user.home"), ".credentials/sheets.googleapis.com-java-quickstart.json");

    /** Global instance of the {@link FileDataStoreFactory}. */
    private static FileDataStoreFactory DATA_STORE_FACTORY;

    /** Global instance of the JSON factory. */
    private static final JsonFactory JSON_FACTORY =
        JacksonFactory.getDefaultInstance();

    /** Global instance of the HTTP transport. */
    private static HttpTransport HTTP_TRANSPORT;

    /** Global instance of the scopes required by this quickstart.
     *
     * If modifying these scopes, delete your previously saved credentials
     * at ~/.credentials/sheets.googleapis.com-java-quickstart.json
     */
    private static final List<String> SCOPES =
        Arrays.asList(SheetsScopes.SPREADSHEETS);

    static {
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {
            t.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * Creates an authorized Credential object.
     * @return an authorized Credential object.
     * @throws IOException
     */
    public static Credential authorize() throws IOException {
        // Load client secrets.
        InputStream in =
            SheetsQuickstartA.class.getResourceAsStream("/client_secret.json");
        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(DATA_STORE_FACTORY)
                .setAccessType("offline")
                .setApprovalPrompt("force")
                .build();
        Credential credential = new AuthorizationCodeInstalledApp(
            flow, new LocalServerReceiver()).authorize("user");
        System.out.println(
                "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
    }

    /**
     * Build and return an authorized Sheets API client service.
     * @return an authorized Sheets API client service
     * @throws IOException
     */
    public static Sheets getSheetsService() throws IOException {
        Credential credential = authorize();
        return new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }





    public static void main(String[] args) throws Exception {
        //createHourlifyEmployees();
        readSampleSpreadsheet();
    }




    public static void readSampleSpreadsheet() throws IOException {
        // Build a new authorized API client service.
        Sheets service = getSheetsService();

        // Prints the names and majors of students in a sample spreadsheet:
        // https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
        String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms";
        String range = "Class Data!A2:E";
        ValueRange response = service.spreadsheets().values()
            .get(spreadsheetId, range)
            .execute();
        List<List<Object>> values = response.getValues();
        if (values == null || values.size() == 0) {
            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));
          }
        }
    }

    public static void createHourlifyEmployees() throws Exception {
        String spreadsheetId = "14oUVpOkT_mcwOIvOn643g7Q_OktdCkdru4NpURMlUhU";
        int employeeCount = 200;
        ArrayList<ValueRange> values = new ArrayList<>();

        List lastNames = arrayFromFile("lastname.csv");
        List firstNames = arrayFromFile("firstname.csv");
        for (int i=0; i<employeeCount; i++) {
            Random rand1 = new Random();
            Random rand2 = new Random();

            ValueRange value = new ValueRange();

            ArrayList<Object> arrayList = new ArrayList();
            ArrayList<Object> row = new ArrayList();
            row.add(i+1000);
            row.add(lastNames.get(rand1.nextInt(lastNames.size()-1)));
            row.add(firstNames.get(rand2.nextInt(firstNames.size()-1)));
            arrayList.add(row);

            value.set("values", arrayList);
            value.setRange("Employees!A"+(i+2)+":C"+(i+2));
            values.add(value);
        }

        BatchUpdateValuesRequest request = new BatchUpdateValuesRequest();
        request.setValueInputOption("RAW");
        request.setData(values);
        Sheets service = getSheetsService();
        service.spreadsheets().values().batchUpdate(spreadsheetId, request).execute();
    }

    public static List<Map<String,String>> generateNames() {
//        List lastNames = arrayFromFile("lastname.csv");
//        List firstNames = arrayFromFile("firstname.csv");
        ArrayList<Map<String,String>> array = new ArrayList();
        int number = 150;

        for (int i=0; i<number; i++) {

        }

        return array;
    }

    public static List<String> arrayFromFile(String fileName) throws Exception {
        ArrayList<String> array = new ArrayList();
        InputStream in = SheetsQuickstartA.class.getClassLoader().getResourceAsStream(fileName);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));

        String line;
        while ((line = br.readLine()) != null) {
            array.add(line);
        }

        return array;
    }
}
/*
*示例java访问、读取和写入Google工作表中的数据。
*/
包实例;
导入com.google.api.client.auth.oauth2.Credential;
导入com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
导入com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
导入com.google.api.client.googleapis.auth.oauth2.googleaauthorizationcodeflow;
导入com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
导入com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
导入com.google.api.client.http.HttpTransport;
导入com.google.api.client.json.jackson2.JacksonFactory;
导入com.google.api.client.json.JsonFactory;
导入com.google.api.client.util.store.FileDataStoreFactory;
导入com.google.api.services.sheets.v4.SheetsScopes;
导入com.google.api.services.sheets.v4.model.*;
导入com.google.api.services.sheets.v4.sheets;
导入java.io.*;
导入java.util.*;
公共类SheetsQuickstart{
/**应用程序名称*/
私有静态最终字符串应用程序\u名称=
“Google Sheets API快速启动”;
/**用于存储此应用程序的用户凭据的目录*/
private static final java.io.File DATA_STORE_DIR=new java.io.File(
System.getProperty(“user.home”),“.credentials/sheets.googleapis.com java quickstart.json”);
/**{@link FileDataStoreFactory}的全局实例*/
私有静态文件数据存储工厂数据存储工厂;
/**JSON工厂的全局实例*/
私有静态最终JsonFactory JSON_工厂=
JacksonFactory.getDefaultInstance();
/**HTTP传输的全局实例*/
专用静态HttpTransport HTTP_传输;
/**此快速启动所需作用域的全局实例。
*
*如果修改这些作用域,请删除以前保存的凭据
*位于~/.credentials/sheets.googleapis.com-java-quickstart.json
*/
私有静态最终列表作用域=
数组.asList(表范围.电子表格);
静止的{
试一试{
HTTP_TRANSPORT=GoogleNetHttpTransport.newTrustedTransport();
DATA\u STORE\u FACTORY=新文件datastorefactory(DATA\u STORE\u DIR);
}捕获(可丢弃的t){
t、 printStackTrace();
系统出口(1);
}
}
/**
*创建授权凭据对象。
*@返回授权凭证对象。
*@抛出异常
*/
公共静态凭据授权()引发IOException{
//加载客户端机密。
输入流输入=
SheetsQuickstartA.class.getResourceAsStream(“/client_secret.json”);
谷歌客户机密=
load(JSON_工厂,新的InputStreamReader(in));
//生成流并触发用户授权请求。
GoogleAuthorizationCodeFlow=
新的GoogleAuthorizationCodeFlow.Builder(
HTTP_传输、JSON_工厂、客户端机密、作用域)
.setDataStoreFactory(数据存储工厂)
.setAccessType(“脱机”)
.setApprovalPrompt(“强制”)
.build();
凭证凭证=新授权代码已安装App(
流,新的LocalServerReceiver())。授权(“用户”);
System.out.println(
“凭证保存到”+数据存储\目录getAbsolutePath());
返回凭证;
}
/**
*生成并返回授权的API客户端服务。
*@返回授权的API客户端服务
*@抛出异常
*/
公共静态工作表getSheetsService()引发IOException{
凭证=授权();
返回新的Sheets.Builder(HTTP_传输、JSON_工厂、凭证)
.setApplicationName(应用程序名称)
.build();
}
公共静态void main(字符串[]args)引发异常{
//CreateHourlfyEmployees(