Используйте функции Azure для автоматизации сохранения Excel в CSV - PullRequest
1 голос
/ 12 июня 2019

Попытка использовать функции Azure для автоматизации сохранения файла Excel в блоб как CSV-файл, чтобы я мог использовать его в приложениях логики или на фабрике данных Azure. Ищу использовать библиотеку ExcelDataReader C #, и я могу получить пакет NuGet для загрузки в мою функцию, но я застрял после этого.

В настоящее время кажется, что я застрял, потому что команда File.Open ищет файл по локальному пути, и я получаю следующую ошибку:

с использованием (var stream = File.Open (filePath, FileMode.Open, FileAccess.Read))

Неверный синтаксис имени файла, имени каталога или метки тома: 'D: \ Program Files (x86) \ SiteExtensions \ Functions \ 2.0.12507 \ 64bit ....' *

Есть ли у вас какие-либо предложения по сохранению XLSX с помощью функций Azure?

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Вам не нужно открывать поток вручную, привязка функций Azure может сделать это для вас как для чтения, так и для записи.

например:

[FunctionName("ConvertExcelToCSV")]
    public static async Task RunAsync(
        [BlobTrigger("excel-files/{blobName}")] Stream excelFileInput,
        [Blob("csv-files/{blobName}", FileAccess.Write)] Stream csvFileOutput,
        CancellationToken token,
        ILogger log)
    {
        log.LogInformation($"Do your processing on the excelFileInput file here.");
        //Do your processing on another steam. Maybe, MemoryStream
        await memoryStream.CopyToAsync(csvFileOutput, 4096, token);
    }
0 голосов
/ 12 июня 2019

Если вы используете Environment.CurrentDirectory, чтобы получить исполняемый каталог, он ответит на каталог, который вы отображаете. И этот каталог в лазурном куду не позволяет создавать файлы, поэтому вашего файла Excel там нет. Вы можете использовать context.FunctionDirectory, чтобы получить текущий каталог функций (например, при работе в Azure)

например:

public static void Run([TimerTrigger("0 */1 * * * *")]TimerInfo myTimer, ILogger log, ExecutionContext context)
        {
            var excelFilePath = context.FunctionDirectory + @"\Book.xlsx";
            var destinationCsvFilePath = context.FunctionDirectory + @"\test.csv";

            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

            var stream = new FileStream(excelFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

            IExcelDataReader reader = null;

            reader = ExcelReaderFactory.CreateOpenXmlReader(stream);

            var ds = reader.AsDataSet(new ExcelDataSetConfiguration()
            {
                ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
                {
                    UseHeaderRow = false
                }
            });

            var csvContent = string.Empty;
            int row_no = 0;
            while (row_no < ds.Tables[0].Rows.Count)
            {
                var arr = new List<string>();
                for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
                {
                    arr.Add(ds.Tables[0].Rows[row_no][i].ToString());
                }
                row_no++;
                csvContent += string.Join(",", arr) + "\n";
            }
            StreamWriter csv = new StreamWriter(destinationCsvFilePath, false);
            csv.Write(csvContent);
            csv.Close();

            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
        }

И просто обновите свой Excel здесь:

enter image description here

...