有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在没有身份验证的情况下使用Google电子表格API Java库获取公共Google电子表格数据

-我想做什么

我想使用Google电子表格API Java库从Google电子表格中获取数据,无需验证。 谷歌电子表格是公开发布的。 我想使用以下方法: 通用域名格式。谷歌。格达塔。数据电子表格CustomElementCollection

-发行

CustomElementCollection返回使用身份验证收集数据。 但是CustomElementCollection在没有身份验证的情况下返回null

作为听众。getPlainTextContent()显示数据,因此我认为我应该能够以任何方式获取数据

-附加源代码

使用身份验证:Auth。爪哇

import java.net.URL;
import java.util.List;
import com.google.gdata.client.spreadsheet.ListQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.CustomElementCollection;
import com.google.gdata.data.spreadsheet.ListEntry;
import com.google.gdata.data.spreadsheet.ListFeed;
import com.google.gdata.data.spreadsheet.SpreadsheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetEntry;

public class Auth {
    public static void main(String[] args) throws Exception{
        String applicationName = "AppName";
        String user = args[0];
        String pass = args[1];
        String key = args[2];
        String query = args[3];

        SpreadsheetService service = new SpreadsheetService(applicationName);
        service.setUserCredentials(user, pass); //set client auth 

        URL entryUrl = new URL("http://spreadsheets.google.com/feeds/spreadsheets/" + key);
        SpreadsheetEntry spreadsheetEntry = service.getEntry(entryUrl, SpreadsheetEntry.class);
        WorksheetEntry worksheetEntry = spreadsheetEntry.getDefaultWorksheet();

        ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl());
        listQuery.setSpreadsheetQuery( query );

        ListFeed listFeed = service.query(listQuery, ListFeed.class);
        List<ListEntry> list = listFeed.getEntries();
        for( ListEntry listEntry : list )
        {
            System.out.println( "content=[" + listEntry.getPlainTextContent() + "]");
            CustomElementCollection elements = listEntry.getCustomElements();
            System.out.println(
                    " name=" + elements.getValue("name") + 
                    " age="  + elements.getValue("age") );
        }
    }
}

没有身份验证:NoAuth。爪哇

import java.net.URL;
import java.util.List;
import com.google.gdata.client.spreadsheet.FeedURLFactory;
import com.google.gdata.client.spreadsheet.ListQuery;
import com.google.gdata.client.spreadsheet.SpreadsheetService;
import com.google.gdata.data.spreadsheet.CustomElementCollection;
import com.google.gdata.data.spreadsheet.ListEntry;
import com.google.gdata.data.spreadsheet.ListFeed;
import com.google.gdata.data.spreadsheet.WorksheetEntry;
import com.google.gdata.data.spreadsheet.WorksheetFeed;

public class NoAuth {
    public static void main(String[] args) throws Exception{
        String applicationName = "AppName";
        String key = args[0];
        String query = args[1];

        SpreadsheetService service = new SpreadsheetService(applicationName);

        URL url = FeedURLFactory.getDefault().getWorksheetFeedUrl(key, "public", "basic");

        WorksheetFeed feed = service.getFeed(url, WorksheetFeed.class);
        List<WorksheetEntry> worksheetList = feed.getEntries();
        WorksheetEntry worksheetEntry = worksheetList.get(0);

        ListQuery listQuery = new ListQuery(worksheetEntry.getListFeedUrl());
        listQuery.setSpreadsheetQuery( query );

        ListFeed listFeed = service.query( listQuery, ListFeed.class );
        List<ListEntry> list = listFeed.getEntries();
        for( ListEntry listEntry : list )
        {
            System.out.println( "content=[" + listEntry.getPlainTextContent() + "]");
            CustomElementCollection elements = listEntry.getCustomElements();
            System.out.println(
                    " name=" + elements.getValue("name") + 
                    " age="  + elements.getValue("age") );
        }
    }
}

谷歌电子表格:

https://docs.google.com/spreadsheet/pub?key=0Ajawooo6A9OldHV0VHYzVVhTZlB6SHRjbGc5MG1CakE&output=html

-结果

未经认证

   内容=[年龄:23]    name=null年龄=null

通过身份验证

   内容=[年龄:23]    姓名=芋头年龄=23

请让我知道有用的信息,以避免这个问题


共 (3) 个答案

  1. # 1 楼答案

    我认为问题在于,您正在使用"basic"投影作为电子表格。如果使用"values"投影,一切都应该按预期进行

  2. # 2 楼答案

    我也在想这件事。我看了看输入的提要(只需将工作表的URL粘贴到Chrome中),似乎没有XML标记,并且都在<;内容>;标签因此,解析器将其全部集中到BaseEntry的文本内容中(而不是进行ListEntry)是有意义的

  3. # 3 楼答案

    我不知道为什么会这样,但当您不使用凭据访问请求时,您无法通过以下方式检索单元格:

    CustomElementCollection elements = listEntry.getCustomElements();
    System.out.println(" name=" + elements.getValue("name") + " age="  + elements.getValue("age") );
    

    我已经对其进行了测试,发现只有这种方法可以检索数据:

    List<ListEntry> list = listFeed.getEntries();
    for (ListEntry row : list) {
        System.out.println(row.getTitle().getPlainText() + "\t"
                + row.getPlainTextContent());
    }
    

    它打印:

    Taro    age: 23
    Hanako  age: 16
    

    如您所见,您应该解析文本并从原始String检索年龄