我在Google Spreadsheets中将一些信息作为单页提供。 有什么办法可以通过提供谷歌凭据和电子表格地址从.NET读取这些信息。是否可以使用Google Data API。 最后,我需要从DataTable中获取Google电子表格中的信息。 我该怎么做?如果有人尝试过,请分享一些信息。
答案 0 :(得分:172)
使用以下语句添加:
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);
}
答案 1 :(得分:22)
Google's .Net client library,它提供了一个更简单的类似数据库的接口,具有强类型的记录类型。这是一些示例代码:
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提供商转换为谷歌的structured query operators:
var q = from r in table.AsQueryable()
where r.IntProp > -1000 && r.StringProp == "hello"
orderby r.IntProp
select r;
答案 2 :(得分:14)
(2016年6月至11月)问题及其答案现已过时:1)keys()是上一代Google API。虽然并非所有GData API都已弃用,但GData APIs 不使用all the latest Google APIs; 2)有the Google Data Protocol(也不是GData)。
从此处开始,您需要获取new Google Sheets API v4并使用最新的the Google APIs Client Library for .NET,这比以前的API更强大,更灵活。这里有一个Sheets API来帮助您入门。另请查看C# code sample和.NET reference docs for the Sheets API。
如果您对Python不过敏(如果您是,只是假装它的伪代码;)),我制作了几个视频,其中包含更长,更真实的视频和#34;使用您可以学习的API的示例,并根据需要迁移到C#:
答案 3 :(得分:3)
你可以用几种方式做你想要的事情:
使用Google的电子表格C#库(如Tacoman667的答案)来获取ListFeed,它可以返回行列表(Google用法中的ListEntry),每个行都有一个名称 - 值对列表。 Google电子表格API(http://code.google.com/apis/spreadsheets/code.html)文档提供了足够的信息,可帮助您入门。
使用Google可视化API,您可以提交更复杂(几乎类似于SQL)的查询,以仅提取您需要的行/列。
电子表格内容作为Atom订阅源返回,因此您可以使用XPath或SAX解析来提取列表订阅源的内容。有一个例子就是在http://gqlx.twyst.co.za以这种方式(在Java和Javascript中,虽然我很害怕)。
答案 4 :(得分:2)
我很确定Google Code上会有一些C#SDK /工具包。我找到了this one,但可能还有其他人因此值得浏览一下。
答案 5 :(得分:2)
http://code.google.com/apis/gdata/articles/dotnet_client_lib.html
这应该让你开始。我最近没有玩过它,但我一段时间后下载了一个非常旧的版本,看起来非常稳固。这个更新到Visual Studio 2008,所以请查看文档!
答案 6 :(得分:1)
2017年3月24日由Marcos Placona撰写的Twilio博客页面可能会有所帮助。
答案 7 :(得分:0)
如@wescpy所说,@ Kelly最受欢迎的答案不再有效。但是,在2020-03-03之后,由于使用的库使用Google Sheets v3 API
,因此将完全无法使用。
Google Sheets v3 API将于2020年3月3日关闭
https://developers.google.com/sheets/api/v3
这是Google在2019年9月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.v4
NuGet并尝试以下示例:
请注意,示例代码但我的电子表格出现错误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();
}
}
}