В этой статье рассказывается, как программно конвертировать MS Excel XLS или XLSX в Google Sheets на C# .NET.

Преобразование Excel XLS или XLSX в Google Sheets в C# .NET

Электронные таблицы обычно используются для хранения небольших или крупномасштабных данных в виде строк и столбцов. Для создания электронных таблиц и управления ими доступны различные приложения, среди которых популярным является MS Excel. Кроме того, Google предоставляет Google Таблицы, которые используются для создания и обновления электронных таблиц в Интернете. Кроме того, Google Sheets позволяет вам делиться электронными таблицами с несколькими людьми в режиме реального времени. В некоторых случаях вам может потребоваться программно экспортировать данные из файлов Excel XLS или XLSX в электронную таблицу в Google Sheets. Итак, давайте посмотрим, как вы можете считывать данные из файла Excel и записывать их в электронную таблицу Google Sheets на C# .NET.

Предварительные требования — преобразование файла Excel в таблицы Google на C#

Облачный проект Google

Для связи с Google Sheets нам нужно будет создать проект в Google Cloud и включить Google Sheets API. Ниже приведены шаги для создания проекта и включения API.

  1. Перейдите в консоль Google Cloud.
  2. Создайте новый проект на консоли.
    • Выберите только что созданный проект.
  3. В меню навигации выберите «API и службы», а затем «Панель мониторинга».
    • Нажмите кнопку «Включить API и службы» (см. подробности).
    • Найдите и включите Google Sheets API.
  4. Настроить экран согласия OAuth и установить области действия приложения.
    • Добавьте тестовых пользователей, которые используются, когда приложение не опубликовано.
  5. На странице API и службы перейдите в раздел Учетные данные.
    • Нажмите кнопку «Создать учетные данные» и выберите идентификатор клиента OAuth.
    • В типе приложения выберите Desktop App (поскольку в этой статье мы создаем консольное приложение).
    • Загрузите файл JSON.

C# .NET API для преобразования Excel в Google Sheets

Для экспорта данных из файлов Excel XLS/XLSX в Google Таблицы нам потребуются следующие API.

На момент написания этой статьи мы использовали Aspose.Cells для .NET 22.2 и Google.Apis.Sheets.v4 1.56.0.2608.

Экспорт данных из Excel XLSX в Google Таблицы на C#

Ниже приведено пошаговое руководство о том, как считывать данные из файла Excel XLSX и записывать их в Google Sheets в консольном приложении C#.

  1. Создайте новый проект консольного приложения в Visual Studio 2013 или более поздней версии.
Экспорт данных из Excel XLSX в Google Таблицы на C#
  1. Установите Aspose.Cells для .NET и API Google Sheets в проект.
PM> Install-Package Aspose.Cells
PM> Install-Package Google.Apis.Sheets.v4
  1. Скопируйте файл JSON (мы загрузили его после создания учетных данных в Google Cloud) и вставьте его в каталог проекта.

  2. Инициализируйте службу Google Таблиц, используя учетные данные (файл JSON) и определите области действия приложения. Области определяют права доступа к листам и их свойствам. Следующая функция инициализирует службу Google Sheets и возвращает объект SheetsService.

using Google.Apis.Auth.OAuth2;
using Google.Apis.Sheets.v4;
using Google.Apis.Services;
using Google.Apis.Util.Store;

public static SheetsService ConnectToGoogle()
{
    // При изменении этих областей удалите ранее сохраненные учетные данные.
    // в ~/.credentials/sheets.googleapis.com-dotnet-quickstart.json
    string[] Scopes = { SheetsService.Scope.Spreadsheets };
    string ApplicationName = "Excel to Google Sheet";

    UserCredential credential;

    using (var stream =
        new FileStream("credentials.json", FileMode.Open, FileAccess.Read))
    {
        // Файл token.json хранит токены доступа и обновления пользователя и создается
        // автоматически, когда поток авторизации завершается в первый раз.
        string credPath = "token.json";
        credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.FromStream(stream).Secrets,
            Scopes,
            "user",
            CancellationToken.None,
            new FileDataStore(credPath, true)).Result;
        Console.WriteLine("Credential file saved to: " + credPath);
    }

    // Создать службу API Google Таблиц
    var service = new SheetsService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = ApplicationName,
    });

    return service;
}
  1. Создайте функцию CreateSpreadsheet, которая создает новую электронную таблицу в Google Sheets, устанавливает имя листа по умолчанию и возвращает объект электронной таблицы.
using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using Google.Apis.Services;

public static Spreadsheet CreateSpreadsheet(SheetsService _sheetsService, string _spreadsheetName, string _defaultSheetName)
{
    // Создать новую таблицу
    var newSpreadSheet = new Google.Apis.Sheets.v4.Data.Spreadsheet();
    newSpreadSheet.Properties = new SpreadsheetProperties();
    newSpreadSheet.Properties.Title = _spreadsheetName;

    // Создать новый лист
    var sheet = new Sheet();
    sheet.Properties = new SheetProperties();
    sheet.Properties.Title = _defaultSheetName;
    newSpreadSheet.Sheets = new List<Sheet>() { sheet };

    // Выполнить запрос
    var newSheet = _sheetsService.Spreadsheets.Create(newSpreadSheet).Execute();

    return newSheet;
}
  1. Создайте функцию AddSheet, чтобы добавить новый лист в электронную таблицу Google.
public static void AddSheet(SheetsService _sheetsService, string _spreadSheetID, string _sheetName)
{
    // Добавить новый лист
    var addSheetRequest = new AddSheetRequest();
    addSheetRequest.Properties = new SheetProperties();
    addSheetRequest.Properties.Title = _sheetName;
    BatchUpdateSpreadsheetRequest batchUpdateSpreadsheetRequest = new BatchUpdateSpreadsheetRequest();
    batchUpdateSpreadsheetRequest.Requests = new List<Request>();
    batchUpdateSpreadsheetRequest.Requests.Add(new Request
    {
        AddSheet = addSheetRequest
    });

    // Создать запрос
    var batchUpdateRequest =
        _sheetsService.Spreadsheets.BatchUpdate(batchUpdateSpreadsheetRequest, _spreadSheetID);

    // Выполнить запрос
    var response = batchUpdateRequest.Execute();

}
  1. Теперь создайте новую функцию ExportDataFromExcelToGoogleSheet, которая считывает и экспортирует данные из файла Excel в Google Таблицы. В этой функции сначала загрузите файл Excel XLS/XLSX с помощью Aspose.Cells для .NET и получите имя первого листа в книге.
// Загрузите книгу Excel
Workbook wb = new Workbook(_excelFileName);

// Получить имя первого рабочего листа
string defaultWorksheetName = wb.Worksheets[0].Name;
  1. Затем вызовите функцию CreateSpreadsheet, чтобы создать новую электронную таблицу в Google Sheets.
// Создайте новую электронную таблицу Google с рабочим листом по умолчанию
Spreadsheet spreadhsheet = CreateSpreadsheet(_sheetService, wb.FileName, defaultWorksheetName);
  1. Прокрутите рабочие листы в файле Excel. На каждой итерации считывайте данные с рабочего листа и добавляйте их в список.
// Цикл по листам
foreach (var sheet in wb.Worksheets)
{
    if (sheet.Index == 0)
    {
        // Первый лист создается по умолчанию, поэтому задайте только диапазон
        range = $"{defaultWorksheetName}!A:Y";
    }
    else
    {
        // Добавить новый лист
        AddSheet(_sheetService, spreadhsheet.SpreadsheetId, sheet.Name);
        range = $"{sheet.Name}!A:Y";
    }

    // Получить количество строк и столбцов
    int rows = sheet.Cells.MaxDataRow;
    int cols = sheet.Cells.MaxDataColumn;

    IList<IList<Object>> list = new List<IList<Object>>() { };

    // Цикл по строкам
    for (int i = 0; i < rows; i++)
    {
        List<object> lists = new List<object>();

        // Перебрать каждый столбец в выбранной строке
        for (int j = 0; j < cols; j++)
        {
            lists.Add(sheet.Cells[i, j].Value);
        }
        list.Add(lists);
    }
}
  1. Для каждого рабочего листа в файле Excel создайте запрос на запись данных в электронную таблицу в Google Sheets.
// Определить диапазон
ValueRange VRange = new ValueRange();
VRange.Range = range;

// Установить значения
VRange.Values = list;

// Создать запрос
SpreadsheetsResource.ValuesResource.UpdateRequest upd = _sheetService.Spreadsheets.Values.Update(VRange, spreadhsheet.SpreadsheetId, range);
upd.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;

// Выполнить запрос
UpdateValuesResponse response = upd.Execute();

// Получить ответ
string responseString = JsonConvert.SerializeObject(response);

Полная функция экспорта данных из файла Excel в электронную таблицу в Google Таблицах приведена ниже.

using Google.Apis.Sheets.v4;
using Google.Apis.Sheets.v4.Data;
using Google.Apis.Services;
using Aspose.Cells;

public static void ExportDataFromExcelToGoogleSheet(SheetsService _sheetService, string _excelFileName)
{
    // Загрузите книгу Excel
    Workbook wb = new Workbook(_excelFileName);

    // Получить имя первого рабочего листа
    string defaultWorksheetName = wb.Worksheets[0].Name;

    // Создайте новую электронную таблицу Google с рабочим листом по умолчанию
    Spreadsheet spreadhsheet = CreateSpreadsheet(_sheetService, wb.FileName, defaultWorksheetName);

    Console.WriteLine("URL: " + spreadhsheet.SpreadsheetUrl);
    Console.WriteLine("ID: " + spreadhsheet.SpreadsheetId);

    // Определить диапазон
    String range;

    // Цикл по листам
    foreach (var sheet in wb.Worksheets)
    {
        if (sheet.Index == 0)
        {
            // Первый лист создается по умолчанию, поэтому задайте только диапазон
            range = $"{defaultWorksheetName}!A:Y";
        }
        else
        {
            // Добавить новый лист
            AddSheet(_sheetService, spreadhsheet.SpreadsheetId, sheet.Name);
            range = $"{sheet.Name}!A:Y";
        }

        // Получить количество строк и столбцов
        int rows = sheet.Cells.MaxDataRow;
        int cols = sheet.Cells.MaxDataColumn;

        IList<IList<Object>> list = new List<IList<Object>>() { };

        // Цикл по строкам
        for (int i = 0; i < rows; i++)
        {
            List<object> lists = new List<object>();

            // Перебрать каждый столбец в выбранной строке
            for (int j = 0; j < cols; j++)
            {
                lists.Add(sheet.Cells[i, j].Value);
            }
            list.Add(lists);
        }

        // Определить диапазон
        ValueRange VRange = new ValueRange();
        VRange.Range = range;

        // Установить значения
        VRange.Values = list;

        // Создать запрос
        SpreadsheetsResource.ValuesResource.UpdateRequest upd = _sheetService.Spreadsheets.Values.Update(VRange, spreadhsheet.SpreadsheetId, range);
        upd.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;

        // Выполнить запрос
        UpdateValuesResponse response = upd.Execute();

        // Получить ответ
        string responseString = JsonConvert.SerializeObject(response);
    }
}

Полный исходный код

Ниже приведен полный исходный код для преобразования файла Excel XLSX в Google Таблицы на C#.

using System;
using System.Collections.Generic;
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.IO;
using System.Threading;
using Newtonsoft.Json;
using Aspose.Cells;

namespace ExcelToGoogle
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключиться к Google
            SheetsService sheetService = ConnectToGoogle();

            // Экспорт данных из файла Excel в Google Таблицы
            ExportDataFromExcelToGoogleSheet(sheetService, "workbook.xlsx");

            Console.ReadKey();
        }
        public static SheetsService ConnectToGoogle()
        {
            // При изменении этих областей удалите ранее сохраненные учетные данные.
            // в ~/.credentials/sheets.googleapis.com-dotnet-quickstart.json
            string[] Scopes = { SheetsService.Scope.Spreadsheets };
            string ApplicationName = "Excel to Google Sheet";

            UserCredential credential;

            using (var stream =
                new FileStream("credentials1.json", FileMode.Open, FileAccess.Read))
            {
                // Файл token.json хранит токены доступа и обновления пользователя и создается
                // автоматически, когда поток авторизации завершается в первый раз.
                string credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.FromStream(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                Console.WriteLine("Credential file saved to: " + credPath);
            }

            // Создать службу API Google Таблиц
            var service = new SheetsService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = ApplicationName,
            });

            return service;
        }
        public static void ExportDataFromExcelToGoogleSheet(SheetsService _sheetService, string _excelFileName)
        {
            // Загрузите книгу Excel
            Workbook wb = new Workbook(_excelFileName);

            // Получить имя первого рабочего листа
            string defaultWorksheetName = wb.Worksheets[0].Name;

            // Создайте новую электронную таблицу Google с рабочим листом по умолчанию
            Spreadsheet spreadhsheet = CreateSpreadsheet(_sheetService, wb.FileName, defaultWorksheetName);

            Console.WriteLine("Spreadsheet URL: " + spreadhsheet.SpreadsheetUrl);
            Console.WriteLine("ID: " + spreadhsheet.SpreadsheetId);

            // Определить диапазон
            String range;

            // Цикл по листам
            foreach (var sheet in wb.Worksheets)
            {
                if (sheet.Index == 0)
                {
                    // Первый лист создается по умолчанию, поэтому задайте только диапазон
                    range = $"{defaultWorksheetName}!A:Y";
                }
                else
                {
                    // Добавить новый лист
                    AddSheet(_sheetService, spreadhsheet.SpreadsheetId, sheet.Name);
                    range = $"{sheet.Name}!A:Y";
                }

                // Получить количество строк и столбцов
                int rows = sheet.Cells.MaxDataRow;
                int cols = sheet.Cells.MaxDataColumn;

                IList<IList<Object>> list = new List<IList<Object>>() { };

                // Цикл по строкам
                for (int i = 0; i < rows; i++)
                {
                    List<object> lists = new List<object>();

                    // Перебрать каждый столбец в выбранной строке
                    for (int j = 0; j < cols; j++)
                    {
                        lists.Add(sheet.Cells[i, j].Value);
                    }
                    list.Add(lists);
                }

                // Определить диапазон
                ValueRange VRange = new ValueRange();
                VRange.Range = range;

                // Установить значения
                VRange.Values = list;

                // Создать запрос
                SpreadsheetsResource.ValuesResource.UpdateRequest upd = _sheetService.Spreadsheets.Values.Update(VRange, spreadhsheet.SpreadsheetId, range);
                upd.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.USERENTERED;

                // Выполнить запрос
                UpdateValuesResponse response = upd.Execute();

                // Получить ответ
                string responseString = JsonConvert.SerializeObject(response);
            }

        }
        public static Spreadsheet CreateSpreadsheet(SheetsService _sheetsService, string _spreadsheetName, string _defaultSheetName)
        {
            // Создать новую таблицу
            var newSpreadSheet = new Google.Apis.Sheets.v4.Data.Spreadsheet();
            newSpreadSheet.Properties = new SpreadsheetProperties();
            newSpreadSheet.Properties.Title = _spreadsheetName;

            // Создать новый лист
            var sheet = new Sheet();
            sheet.Properties = new SheetProperties();
            sheet.Properties.Title = _defaultSheetName;
            newSpreadSheet.Sheets = new List<Sheet>() { sheet };

            // Выполнить запрос
            var newSheet = _sheetsService.Spreadsheets.Create(newSpreadSheet).Execute();

            return newSheet;

        }
        public static void AddSheet(SheetsService _sheetsService, string _spreadSheetID, string _sheetName)
        {
            // Добавить новый лист
            var addSheetRequest = new AddSheetRequest();
            addSheetRequest.Properties = new SheetProperties();
            addSheetRequest.Properties.Title = _sheetName;
            BatchUpdateSpreadsheetRequest batchUpdateSpreadsheetRequest = new BatchUpdateSpreadsheetRequest();
            batchUpdateSpreadsheetRequest.Requests = new List<Request>();
            batchUpdateSpreadsheetRequest.Requests.Add(new Request
            {
                AddSheet = addSheetRequest
            });

            // Создать запрос
            var batchUpdateRequest =
                _sheetsService.Spreadsheets.BatchUpdate(batchUpdateSpreadsheetRequest, _spreadSheetID);

            // Выполнить запрос
            var response = batchUpdateRequest.Execute();
        }
    }
}

Демонстрация. Преобразование Excel в Google Таблицы на C#

Получите бесплатную лицензию Aspose.Cells

Вы можете получить бесплатную временную лицензию и использовать Aspose.Cells для .NET без ограничений на пробную версию.

Вывод

В этой статье вы узнали, как конвертировать файлы Excel XLS или XLSX в Google Таблицы на C#. Мы рассмотрели, как создать проект в Google Cloud, включить API Google Таблиц, прочитать файлы Excel и экспортировать данные из файлов Excel в Google Таблицы. Кроме того, вы можете изучить другие возможности Aspose.Cells для .NET с помощью документации. Также вы можете задать свои вопросы на нашем форуме.

Смотрите также