Java到Google电子表格
我试图用Java编程,连接到Google电子表格,进行数据检索或修改单元格中的数据 我的谷歌电子表格链接是 我看了一下,它需要像这样的链接Java到Google电子表格,java,google-sheets,google-spreadsheet-api,Java,Google Sheets,Google Spreadsheet Api,我试图用Java编程,连接到Google电子表格,进行数据检索或修改单元格中的数据 我的谷歌电子表格链接是 我看了一下,它需要像这样的链接 https://spreadsheets.google.com/feeds/worksheets/key/private/full 我尝试过不同形式的链接,例如: https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/priv
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:无法识别的内容类型:应用程序/二进制文件
com.google.gdata.util.RedirectRequiredException:临时移动
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());
}
}
import com.google.gdata.client.authn.oauth.*;
导入com.google.gdata.client.spreadsheet.*;
导入com.google.gdata.data.*;
导入com.google.gdata.data.batch.*;
导入com.google.gdata.data.spreadsheet.*;
导入com.google.gdata.util.*;
导入org.testng.annotations.Test;
导入java.io.IOException;
导入java.net。*;
导入java.util.*;
公共类TestGoogleSheetsAPI{
@试验
public void testConnectToSpreadSheet()引发ServiceException,IOException{
电子表格服务=新的电子表格服务(“谷歌电子表格”);
URL电子表格\u提要\u URL=新URL(“https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/public/full");
SpreadsheetFeed=service.getFeed(电子表格\u feed\u URL,SpreadsheetFeed.class);
列表电子表格=feed.getEntries();
如果(电子表格.size()==0){
//TODO:没有电子表格,请相应地采取行动。
}
电子表格输入电子表格=电子表格.get(0);
System.out.println(电子表格.getTitle().getPlainText());
}
}
我没有使用
service.setUserCredentials(“xxx@gmail“,“password”)
因为我将遇到另一个错误,那就是com.google.gdata.util.AuthenticationException:error authentication(检查服务名称)
从该URL获得的提要是工作表提要
,而不是电子表格提要
。
试试这个:
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());
SpreadsheetService服务=新的电子表格服务(“谷歌电子表格”);
FeedURLFactory urlFactory=FeedURLFactory.getDefault();
WorksheetFeed WorksheetFeed=service.getFeed(urlFactory.getWorksheetFeedUrl(“1V4jT4vSqmY4YNY1VJhariLRLbxfFWf5z8bSTpDcSBPE”,“public”,“full”),WorksheetFeed.class);
List worksheets=worksheetFeed.getEntries();
WorksheetEntry工作表=worksheets.get(0);
System.out.println(worksheet.getTitle().getPlainText());
您将获得重定向,因为访问电子表格需要首先进行身份验证。GoogleSheets使用的是旧的GDataAPI,但要求您使用OAuth2.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>
com.google.gdata
创建服务帐户后,将电子邮件地址复制到下面的CLIENT_ID字段中,将P12文件添加到类路径中,并唱诵P12文件以指向P12文件
我可以使用以下电子表格\u FEED\u URL“where”: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;
}
}
GoogleSheetsApiTest公共类{
//生成服务帐户和P12密钥:
// https://developers.google.com/identity/protocols/OAuth2ServiceAccount
私有最终字符串CLIENT_ID=“”;
//添加请求的作用域。
私有最终列表范围=数组
.asList(“https://spreadsheets.google.com/feeds");
//获取服务帐户时创建的p12文件的名称
私有最终字符串P12FILE=“/.p12”;
@试验
public void testConnectToSpreadSheet()引发GeneralSecurityException,
IOException、ServiceException、URISyntaxException{
电子表格服务=新电子表格服务(
“谷歌电子表格”);
GoogleCredential=getCredentials();
服务。设置OAuth2Credentials(凭证);
URL电子表格\u提要\u URL=新URL(
"https://spreadsheets.google.com/feeds/worksheets/1UXoGD2gowxZ2TY3gooI9y7rwWTPBOA0dnkeNYwUqQRA/private/basic");
SpreadsheetFeed=service.getFeed(电子表格\u feed\u URL,
电子表格feed.class);
列表电子表格=feed.getEntries();
如果(电子表格.size()==0){
////TODO:没有电子表格,请相应地采取行动。
}
//
电子表格输入电子表格=电子表格.get(0);
System.out.println(电子表格.getTitle().getPlainText());
}
私有GoogleCredential getCredentials()引发GeneralSecurityException,
IOException,URISyntaxException{
JacksonFactory JSON_FACTORY=JacksonFactory.getDefaultInstance();
HttpTransport HttpTransport=GoogleNetHttpTransport
.newTrustedTransport();
URL fileUrl=this.getClass().getResource(p12文件);
GoogleCredential credential=新建GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_工厂)
.setServiceAccountId(客户端ID)
.SetServiceAccountPrivateKeyfromP12文件(
新文件(fileUrl.toURI())
.setServiceAccountScopes(SCOPES.build();
返回凭证;
}
}
我觉得这是一个bug。作为一种解决方法,您可以首先调用下面的getfeed请求,然后feed请求将开始工作。
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");
//added new line *******************************
service.getFeed(new URL("https://spreadsheets.google.com/feeds/spreadsheets/private/full?xoauth_requestor_id=test"),WorksheetFeed.class);
//************************
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());
}
}