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