Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java到Google电子表格_Java_Google Sheets_Google Spreadsheet Api - Fatal编程技术网

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

我试图用Java编程,连接到Google电子表格,进行数据检索或修改单元格中的数据

我的谷歌电子表格链接是

我看了一下,它需要像这样的链接

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:临时移动
  • 我不知道如何使用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());
        }
    }
    
    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());
        }
    }