【问题标题】:How to parse Excel spreadsheets in Azure Logic Apps如何在 Azure 逻辑应用中解析 Excel 电子表格
【发布时间】:2019-06-25 19:58:22
【问题描述】:

我需要使用 Azure Logic Apps 从 Excel 电子表格中解析和提取列信息

我已经为我的逻辑应用设置了从 Outlook 中检索最新未读电子邮件的功能。此外,我的逻辑应用程序执行 FOR EACH 来读取所有附件(来自未读电子邮件)并确保它们是 Excel 文件(基于文件扩展名)。

我有一个包含 3 列“产品、描述、价格”的基本 Excel 文件,我需要解析每一行(仅产品和价格)列。

我将添加将解析后的内容存储到托管在 Azure 上的 SQL 表中的功能。

【问题讨论】:

    标签: excel azure parsing


    【解决方案1】:

    在这里,您也可以使用 HTTP 请求。

    using ExcelDataReader;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Extensions.Http;
    using Microsoft.Extensions.Logging;
    using Microsoft.WindowsAzure.Storage;
    using Microsoft.WindowsAzure.Storage.Blob;
    using Nancy.Json;
    using Newtonsoft.Json;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace ConvertExcelToJSon
    {
        public static class Function1
        {
            [FunctionName("ConvertToJson")]
            public static async Task<IActionResult> Run(
                [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req,
                ILogger log)
            {
                log.LogInformation("C# HTTP trigger function processed a request.");
    
    
                string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
                dynamic data = JsonConvert.DeserializeObject(requestBody);
                string blobName = data?.blobName;
    
                string[] splitBlob = blobName.Split('/');
    
                Stream blob = await GetBlobStreamAsync(splitBlob[1], splitBlob[2] + "/" + splitBlob[3]);
                DataSet ds = CreateDataSet(blob);
                List<Simple> simpleList = new List<Simple>();
                foreach (DataTable table in ds.Tables)
                {
    
                    return (ActionResult)new OkObjectResult(DataTableToJSON(table));
    
                }
    
    
                return blobName != null
                ? (ActionResult)new OkObjectResult($"Hello, {blobName}")
                : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
            }
    
    
    
            public static string DataTableToJSON(DataTable table)
            {
                List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();
    
                foreach (DataRow row in table.Rows)
                {
                    Dictionary<string, object> dict = new Dictionary<string, object>();
    
                    foreach (DataColumn col in table.Columns)
                    {
                        dict[col.ColumnName] = (Convert.ToString(row[col]));
                    }
                    list.Add(dict);
                }
                JavaScriptSerializer serializer = new JavaScriptSerializer();
    
                return serializer.Serialize(list);
            }
    
            public static string AppSetting(this string Key)
            {
                string ret = string.Empty;
                if (Environment.GetEnvironmentVariable(Key) != null)
                {
                    ret = Environment.GetEnvironmentVariable(Key);
                }
                return ret;
            }
    
            public static async Task<Stream> GetBlobStreamAsync(string containerName, string blobName)
            {
                Stream myBlob = new MemoryStream();
                if (CloudStorageAccount.TryParse("AzureWebJobsStorage".AppSetting(), out CloudStorageAccount storageAccount))
                {
                    CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
                    CloudBlobContainer container = cloudBlobClient.GetContainerReference(containerName);
                    CloudBlob myBloab = container.GetBlobReference(blobName);
                    await myBloab.DownloadToStreamAsync(myBlob);
                    myBlob.Seek(0, SeekOrigin.Begin);
                }
                return myBlob;
            }
            public static DataSet CreateDataSet(Stream stream)
            {
                DataSet ds;
                System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
                IExcelDataReader reader = null;
                reader = ExcelReaderFactory.CreateOpenXmlReader(stream);
                ds = reader.AsDataSet(new ExcelDataSetConfiguration()
                {
                    ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
                    {
                        UseHeaderRow = true,
                    }
                });
                return ds;
            }
        }
    }
    

    【讨论】:

    • 非常感谢您。我的 Azure 逻辑应用技能非常环保。我知道要创建 Azure 函数,我必须使用 Visual Studio 在我的 PC 上本地执行此操作。这样做时,我是否创建一个空触发器,一个blob触发器,一个http触发器......基本上它是在要求我选择一个触发器。
    【解决方案2】:

    我建议您从逻辑应用程序中调用 Azure 函数,并使用该函数将 Excel 转换为 JSON 对象。 (我目前这样做非常成功)我使用 ExcelDataReader 解析来解析逻辑应用创建的 Blob。在请求中发送 blob 位置并使用 JSON 进行响应。

    【讨论】:

    • 您能否分享来自设计师的逻辑应用流程的屏幕截图?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2020-04-02
    • 2018-06-27
    • 2021-02-28
    • 1970-01-01
    相关资源
    最近更新 更多