Java到Google Spreadsheet
我正在尝试使用Java进行编程,以连接到Google Spreadsheet来执行数据检索或修改单元格中的数据。
我的Google电子表格链接是https://docs.google.com/spreadsheets/d/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA
我查看了Sheets API,它需要链接
https://spreadsheets.google.com/feeds/worksheets/key/private/full
我尝试过不同形式的链接,例如:
https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/private/full
https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/private/full
他们分别给了我不同的错误:
com.google.gdata.util.ParseException: Unrecognized content type:application/binary
com.google.gdata.util.RedirectRequiredException: Moved Temporarily
我不知道如何使用Java连接到Googl电子表格。 请帮助我,如果你有这方面的经验。
import com.google.gdata.client.authn.oauth.*;
import com.google.gdata.client.spreadsheet.*;
import com.google.gdata.data.*;
import com.google.gdata.data.batch.*;
import com.google.gdata.data.spreadsheet.*;
import com.google.gdata.util.*;
import org.testng.annotations.Test;
import java.io.IOException;
import java.net.*;
import java.util.*;
public class TestGoogleSheetsAPI {
@Test
public void testConnectToSpreadSheet() throws ServiceException, IOException {
SpreadsheetService service = new SpreadsheetService("google-spreadsheet");
URL SPREADSHEET_FEED_URL = new URL("https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/public/full");
SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL, SpreadsheetFeed.class);
List<SpreadsheetEntry> spreadsheets = feed.getEntries();
if (spreadsheets.size() == 0) {
// TODO: There were no spreadsheets, act accordingly.
}
SpreadsheetEntry spreadsheet = spreadsheets.get(0);
System.out.println(spreadsheet.getTitle().getPlainText());
}
}
我没有使用service.setUserCredentials("xxx@gmail", "password")
因为我将发生另一个错误,即com.google.gdata.util.AuthenticationException: Error authenticating (check service name)
您正在获得重定向,因为访问电子表格需要先进行身份验证。 Google表格使用旧的gdata API,但要求您使用OAuth 2.0进行身份验证。 因此,您需要导入gdata和Google API库,如下所示:
<dependencies>
<dependency>
<groupId>com.google.gdata</groupId>
<artifactId>core</artifactId>
<version>1.47.1</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client-java6</artifactId>
<version>1.20.0</version>
</dependency>
</dependencies>
下面的代码显示了您如何使用OAuth对Google进行身份验证。 您需要按照说明创建服务帐户并首先下载P12密钥。 创建您的服务帐户后,将电子邮件地址复制到下面的CLIENT_ID字段中,将P12文件添加到您的类路径中,并将P12FILE添加到您的P12文件中。
我可以通过以下SPREADSHEET_FEED_URL“https://spreadsheets.google.com/feeds/worksheets/:worksheetId/private/basic”获得此工作,其中“:worksheetId”是您的工作表ID。 这与你使用的稍有不同。
请务必确保您的服务帐户有权先阅读或写入电子表格,方法是先与服务帐户电子邮件地址共享。
public class GoogleSheetsApiTest {
// Generate a service account and P12 key:
// https://developers.google.com/identity/protocols/OAuth2ServiceAccount
private final String CLIENT_ID = "<your service account email address>";
// Add requested scopes.
private final List<String> SCOPES = Arrays
.asList("https://spreadsheets.google.com/feeds");
// The name of the p12 file you created when obtaining the service account
private final String P12FILE = "/<your p12 file name>.p12";
@Test
public void testConnectToSpreadSheet() throws GeneralSecurityException,
IOException, ServiceException, URISyntaxException {
SpreadsheetService service = new SpreadsheetService(
"google-spreadsheet");
GoogleCredential credential = getCredentials();
service.setOAuth2Credentials(credential);
URL SPREADSHEET_FEED_URL = new URL(
"https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/private/basic");
SpreadsheetFeed feed = service.getFeed(SPREADSHEET_FEED_URL,
SpreadsheetFeed.class);
List<SpreadsheetEntry> spreadsheets = feed.getEntries();
if (spreadsheets.size() == 0) {
// // TODO: There were no spreadsheets, act accordingly.
}
//
SpreadsheetEntry spreadsheet = spreadsheets.get(0);
System.out.println(spreadsheet.getTitle().getPlainText());
}
private GoogleCredential getCredentials() throws GeneralSecurityException,
IOException, URISyntaxException {
JacksonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
HttpTransport httpTransport = GoogleNetHttpTransport
.newTrustedTransport();
URL fileUrl = this.getClass().getResource(P12FILE);
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(CLIENT_ID)
.setServiceAccountPrivateKeyFromP12File(
new File(fileUrl.toURI()))
.setServiceAccountScopes(SCOPES).build();
return credential;
}
}
我也遇到了com.google.gdata.util.ParseException: Unrecognized content type:application/binary
错误,但我似乎偶然发现了这个奇怪的错误的解决方法。 Alex R的答案中的代码可以用作起点。
首先,我尝试将可见性更改为"public"
,以查看会发生什么。 由于文档没有发布,我得到了预期的错误响应,其中包含:
我们很抱歉。 本文档未刊发。
所以我将能见度改回"private"
,并且为了好玩而再次尝试......
瞧,瞧! 有效!
它适用于Drive或Spreadsheets Feed范围(如果您愿意,可以包含这两个范围):
我不确定它是否是一个因素,但我没有使用OAuth 2.0,而是使用PrivateKey
(PKCS12文件)创建的Credential
,就像Brian Chapman的回答一样。
结论
所以,尽管它很笨拙,但我已经修改了我的应用程序,以便在发出"private"
请求之前始终发出"public"
请求(包含在try
块中以吸收所产生的Exception
)。 这是我能够确定性地获得正确结果的唯一途径。
您从该网址获得的Feed是一个WorksheetFeed
,而不是一个SpreadsheetFeed
。 尝试这个:
SpreadsheetService service = new SpreadsheetService("google-spreadsheet");
FeedURLFactory urlFactory = FeedURLFactory.getDefault();
WorksheetFeed worksheetFeed = service.getFeed(urlFactory.getWorksheetFeedUrl("1V4jT4vSqmY4YNY1VJhariLRLbxfFWf5z8bSTpDcSBPE", "public", "full"), WorksheetFeed.class);
List<WorksheetEntry> worksheets = worksheetFeed.getEntries();
WorksheetEntry worksheet = worksheets.get(0);
System.out.println(worksheet.getTitle().getPlainText());
链接地址: http://www.djcxy.com/p/86771.html
上一篇: Java to Google Spreadsheet
下一篇: How to use multiple res.srcDirs and override some resources with gradle