【问题标题】:How do you upload a csv file to google sheets using the google sheets api with c#?如何使用带有 c# 的 google sheet api 将 csv 文件上传到 google sheet?
【发布时间】:2018-01-29 01:59:46
【问题描述】:

我有一种方法可以使用 restsharp 从网站中提取 csv。

 class ScheduledBilling
{

    public string Report()
    {
        var client = new RestClient("http://example.com");
        client.CookieContainer = new System.Net.CookieContainer();
        client.Authenticator = new SimpleAuthenticator("username", "xxx", "password", "xxx");
        var request = new RestRequest("/login", Method.POST);


        IRestResponse response = client.Execute(request);


        var ScheduledBilling = client.DownloadData(new RestRequest("/file));
        var csv = System.Text.Encoding.Default.GetString(ScheduledBilling);

        return(csv);

    }

}

主要是,我一直在使用教程和快速入门的组合,以便我可以将信息输入到谷歌表格中。

//ScheduledCRMBilling.Report();
            ScheduledCRMBilling obj = new ScheduledCRMBilling();
            string csv = obj.Report();

        String spreadsheetId2 = "xxx";
        String range1 = "Scheduled Billing";

        ValueRange valueRange1 = new ValueRange();   

        valueRange1.MajorDimension = "ROWS";//"ROWS";//COLUMNS

        var oblist1 = new List<object>() { csv };

        SpreadsheetsResource.ValuesResource.UpdateRequest update1 = service.Spreadsheets.Values.Update(valueRange1, spreadsheetId2, range1);

        update1.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;

        UpdateValuesResponse result1 = update1.Execute();

        Console.WriteLine("done!");

我已将范围设置为整个工作表(计划帐单)。发生的情况是第一个单元格填充了 csv 中的所有信息,而不是像您将 csv 导入谷歌表格一样。我应该如何进行? 我觉得好像我应该将 csv 变量作为字符串列表传递,这将在每个单元格中放置一个字符串。但是我不知道它是如何知道何时该换一条新线的。

【问题讨论】:

  • 查看此答案stackoverflow.com/a/42367466/5209435.The 问题是关于 python 但在链接的 google 参考文档中,您可以选择 .NET。
  • 我实际上只是在看那个。如果您有多个范围,我认为使用了 batchUpdate?在这种情况下,不是选择整个工作表一个范围吗?另外我不确定如何结合这两个来源,文档对初学者不是很友好......就像我不确定如何传递 pastedatarequest
  • 您可以使用 Google Drive API 代替 Sheets API 吗?
  • 如果我走那条路,我实际上会更加迷失。如何将 pastedatarequest 与批处理更新一起使用?文档似乎非常缺乏。
  • 由于您没有足够的代表聊天,请加入我discord.gg/cR3q5f。那我会尽力帮助你。完全披露我以前从未使用过 Google 表格或云端硬盘 API。

标签: c# csv restsharp google-sheets-api


【解决方案1】:

正如我在 OPs 问题上链接的答案中提到的,Sheets API 不提供上传工作表的功能,只能从头开始创建。

最终不得不使用 Drive API,因为这允许上传文件。特别相关的是关于uploading google docs types 的这一部分,因为它们将被转换为适当的类型。这样您的 CSV 文件就会变成 Google 表格。

如果您的电子表格在内存中,也就是存储在变量中,您可以替换这一行:

using (var stream = new System.IO.FileStream("files/report.csv",
                    System.IO.FileMode.Open))

以下内容:

using (var stream = new System.IO.MemoryStream(Encoding.ASCII.GetBytes(csv)))

在调用上传功能之前,您必须使用this guide 为您的应用程序创建凭据,您还必须将范围更改为Drive。下面是我整理的一个小应用程序,用于演示整个上传流程 - 假设您已经为 Drive API 创建了 OAuth 令牌并将密钥下载到您的项目中。

using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using System;
using System.IO;
using System.Text;
using System.Threading;

namespace ConsoleApp3
{
    internal class Program
    {
        // If modifying these scopes, delete your previously saved credentials
        // at ~/.credentials/sheets.googleapis.com-dotnet-quickstart.json
        private static string[] Scopes = { DriveService.Scope.Drive };

        private static string ApplicationName = "CsvTest";

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

            using (var stream =
                new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
            {
                string credPath = System.Environment.GetFolderPath(
                    System.Environment.SpecialFolder.Personal);
                credPath = Path.Combine(credPath, ".credentials/drive.googleapis.com1.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 DriveService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            var fileMetadata = new Google.Apis.Drive.v3.Data.File()
            {
                Name = "My Report",
                MimeType = "application/vnd.google-apps.spreadsheet"
            };

            var csv = "Heading1,Heading2,Heading3\r\nEntry1,Entry2,Entry3";

            FilesResource.CreateMediaUpload request;
            using (var stream = new System.IO.MemoryStream(Encoding.ASCII.GetBytes(csv)))
            {
                request = service.Files.Create(
                    fileMetadata, stream, "text/csv");
                request.Fields = "id";
                request.Upload();
            }
            var file = request.ResponseBody;

            Console.WriteLine("File ID: " + file.Id);

            Console.Read();
        }
    }
}

编辑

您可以将NameApplication 更改为您喜欢的任何名称,它们只是友好的名称。

编辑

编码愉快。

【讨论】:

    猜你喜欢
    • 2020-01-30
    • 1970-01-01
    • 2023-01-22
    • 2015-12-05
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多