使用Google Data API通过C#访问Google Spreadsheets


104

我在Google Spreadsheets中有一些信息作为一个表格。有什么方法可以通过提供Google凭据和电子表格地址从.NET读取此信息。是否可以使用Google Data API。最终,我需要从DataTable中的Google电子表格中获取信息。我该怎么做?如果有人尝试过,请共享一些信息。


Answers:


176

根据.NET用户指南

下载.NET客户端库

添加以下using语句:

using Google.GData.Client;
using Google.GData.Extensions;
using Google.GData.Spreadsheets;

认证:

SpreadsheetsService myService = new SpreadsheetsService("exampleCo-exampleApp-1");
myService.setUserCredentials("jo@gmail.com", "mypassword");

获取电子表格列表:

SpreadsheetQuery query = new SpreadsheetQuery();
SpreadsheetFeed feed = myService.Query(query);

Console.WriteLine("Your spreadsheets: ");
foreach (SpreadsheetEntry entry in feed.Entries)
{
    Console.WriteLine(entry.Title.Text);
}

给定已经检索的SpreadsheetEntry,您可以按以下方式获取此电子表格中所有工作表的列表:

AtomLink link = entry.Links.FindService(GDataSpreadsheetsNameTable.WorksheetRel, null);

WorksheetQuery query = new WorksheetQuery(link.HRef.ToString());
WorksheetFeed feed = service.Query(query);

foreach (WorksheetEntry worksheet in feed.Entries)
{
    Console.WriteLine(worksheet.Title.Text);
}

并获取基于单元格的供稿:

AtomLink cellFeedLink = worksheetentry.Links.FindService(GDataSpreadsheetsNameTable.CellRel, null);

CellQuery query = new CellQuery(cellFeedLink.HRef.ToString());
CellFeed feed = service.Query(query);

Console.WriteLine("Cells in this worksheet:");
foreach (CellEntry curCell in feed.Entries)
{
    Console.WriteLine("Row {0}, column {1}: {2}", curCell.Cell.Row,
        curCell.Cell.Column, curCell.Cell.Value);
}

3
新的SpreadsheetsService(“ exampleCo-exampleApp-1”)的字符串值应使用什么?我放在那里有什么关系吗?谢谢!
伊恩·戴维斯

获取电子表格列表:“ SpreadsheetQuery查询= new SpreadsheetQuery();” 应该阅读“ SpreadsheetFeed feed = myService.Query(query);” 试图编辑的字符不足!
SQLBobScot

5
developers.google.com/google-apps/spreadsheets/authorize 重要提示:OAuth 1.0不再受支持,并将于2015年5月5日被禁用。如果您的应用程序使用OAuth 1.0,则必须迁移到OAuth 2.0,否则您的应用程序将停止运行。
Kiquenet

1
下面这个链接,从@wescpy,帮我找到更多的相关信息的中期2016年googleappsdeveloper.blogspot.com/2016/05/...

由于所使用的库使用Google表格v3 APIcloud.google.com/blog/products/g-suite/…
因此

22

围绕Google的.Net客户端库编写了一个简单的包装程序,它公开了一个具有强类型记录类型的更简单的类似于数据库的界面。这是一些示例代码:

public class Entity {
    public int IntProp { get; set; }
    public string StringProp { get; set; }
}

var e1 = new Entity { IntProp = 2 };
var e2 = new Entity { StringProp = "hello" };
var client = new DatabaseClient("you@gmail.com", "password");
const string dbName = "IntegrationTests";
Console.WriteLine("Opening or creating database");
db = client.GetDatabase(dbName) ?? client.CreateDatabase(dbName); // databases are spreadsheets
const string tableName = "IntegrationTests";
Console.WriteLine("Opening or creating table");
table = db.GetTable<Entity>(tableName) ?? db.CreateTable<Entity>(tableName); // tables are worksheets
table.DeleteAll();
table.Add(e1);
table.Add(e2);
var r1 = table.Get(1);

还有一个LINQ提供程序,可以转换为Google的结构化查询运算符

var q = from r in table.AsQueryable()
        where r.IntProp > -1000 && r.StringProp == "hello"
        orderby r.IntProp
        select r;

@Kiquenet是什么意思?我看到的Google.GData。*的最新版本是2.2.0 nuget.org/packages/Google.GData.Documents
Mauricio Scheffer


@Kiquenet请让我知道Google更新其.NET库的时间。但是我认为Google.GData。* 2.2.0已经使用API​​ v3。
Mauricio Scheffer 2014年

developers.google.com/google-apps/spreadsheets/authorize 重要提示:OAuth 1.0不再受支持,并将于2015年5月5日被禁用。如果您的应用程序使用OAuth 1.0,则必须迁移到OAuth 2.0,否则您的应用程序将无法运行。
Kiquenet

17

(2016年6月11日),该问题及其答案已过时,因为:1)GData API是上一代Google API。虽然不是所有的GData API与已弃用,所有最新的谷歌的API没有使用谷歌数据协议 ; 2)有一个新的Google Sheets API v4(也没有GData)。

从这里开始,您需要获取适用于.NET的Google API客户端库,并使用最新的Sheets API,该API比任何以前的API都要强大和灵活。这是一个C#代码示例,可帮助您入门。另请参阅.NET参考文档以获取Sheets API.NET Google API客户端库开发人员指南

如果您对Python不过敏(如果是,则假装它是伪代码;)),我制作了一些视频,它们使用API​​的时间稍长,更“真实”,您可以从中学习并迁移到C# :


这些工具也可以用于访问Microsoft Excel文件吗?
afr0

1
不幸的是,Microsoft和Google都在生产不符合通用标准的竞争产品,因此您必须找到自己的工具来访问Excel文件。如果您是Python开发人员,请查看python-excel.org。对于其他语言,您必须搜索其各自的社区。或者,您可以将Excel文件导入Google(使用Drive API),然后使用Sheets API执行所需的操作。Google API支持多种语言...请参阅developers.google.com/api-client-library
wescpy

3

您可以通过几种方式完成您要问的事情:

  1. 使用Google的电子表格C#库(如Tacoman667的回答)来获取ListFeed,该ListFeed可以返回行列表(在Google看来是ListEntry),每个行都有一个名称/值对列表。Google电子表格API(http://code.google.com/apis/spreadsheets/code.html)文档提供了足够的信息来帮助您入门。

  2. 使用Google可视化API,该API可让您提交更复杂的查询(几乎与SQL一样),以仅获取所需的行/列。

  3. 电子表格的内容作为Atom提要返回,因此您可以使用XPath或SAX解析来提取列表提要的内容。http://gqlx.twyst.co.za上有一个以这种方式进行操作的示例(尽管恐怕只有Java和Javascript)。


2

我敢肯定,Google Code上会为此提供一些C#SDK /工具包。我找到了这个,但是可能还有其他,所以值得一游。




2

正如@wescpy所说,@ Kelly提出的最不正确的答案不再有效。但是在2020-03-03之后,由于该库使用了use,因此它将完全无法使用Google Sheets v3 API

Google Sheets v3 API将于2020年3月3日关闭

https://developers.google.com/sheets/api/v3

这是Google在2019-09-10宣布的:

https://cloud.google.com/blog/products/g-suite/migrate-your-apps-use-latest-sheets-api

的新代码示例 Google Sheets v4 API

https://developers.google.com/sheets/api/quickstart/dotnet

并生成credentials.json。然后安装Google.Apis.Sheets.v4NuGet并尝试以下示例:

请注意,Unable to parse range: Class Data!A2:E示例代码但我的电子表格出现错误。Sheet1!A2:E但是由于我的工作表被命名为,所以更改为工作。也只适用于A2:E

using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;

namespace SheetsQuickstart
{
    class Program
    {
        // If modifying these scopes, delete your previously saved credentials
        // at ~/.credentials/sheets.googleapis.com-dotnet-quickstart.json
        static string[] Scopes = { SheetsService.Scope.SpreadsheetsReadonly };
        static string ApplicationName = "Google Sheets API .NET Quickstart";

        static void Main(string[] args)
        {
            UserCredential credential;

            using (var stream =
                new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
            {
                // The file token.json stores the user's access and refresh tokens, and is created
                // automatically when the authorization flow completes for the first time.
                string credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                Console.WriteLine("Credential file saved to: " + credPath);
            }

            // Create Google Sheets API service.
            var service = new SheetsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            // Define request parameters.
            String spreadsheetId = "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms";
            String range = "Class Data!A2:E";
            SpreadsheetsResource.ValuesResource.GetRequest request =
                    service.Spreadsheets.Values.Get(spreadsheetId, range);

            // Prints the names and majors of students in a sample spreadsheet:
            // https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
            ValueRange response = request.Execute();
            IList<IList<Object>> values = response.Values;
            if (values != null && values.Count > 0)
            {
                Console.WriteLine("Name, Major");
                foreach (var row in values)
                {
                    // Print columns A and E, which correspond to indices 0 and 4.
                    Console.WriteLine("{0}, {1}", row[0], row[4]);
                }
            }
            else
            {
                Console.WriteLine("No data found.");
            }
            Console.Read();
        }
    }
}

如何避免不必指定客户端ID /秘密和作用域?我已经完成了OAuth流程,并具有访问令牌和刷新令牌(请考虑脱机模式),并且我不需要这些多余的废话。我无法访问客户端ID和客户端密码,因为它们位于oauth中继服务器上,而我在后台服务中也无法访问。
Blake Niemyjski

@BlakeNiemyjski直接使用rest API,链接:developers.google.com/sheets/api/reference/rest
Ogglas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.