отправьте таблицу результатов в функцию azure для обработки - PullRequest
0 голосов
/ 16 февраля 2020

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

Эта функциональность раньше была в бэкэнде нашего проекта * Net Core MVC с использованием метода Task<IActionResult> post, который принимал параметр IFormFile. Лист обработан (чтение всех строк).

Однако функции Azure, похоже, не принимают параметр IFormFile. У меня вопрос, как я могу добавить эти данные таблицы в запрос?

Это метод post, который из веб-приложения активирует функцию azure:

[HttpPost]
public async Task<ActionResult> Bulkimport(IFormFile excelsheet)
    {

        string azFunctionUri = "https://azfunctionsUri.azurewebsites.net";
        if (customerExists)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                 await excelsheet.CopyToAsync(ms).ConfigureAwait(false);
                 string content = Encoding.ASCII.GetString(ms.ToArray());
                 // use content as parameter in api builder method
                 IApiBuilder apiBuilder = new ApiBuilder();
                 HttpResponseMessage buildRequest = await apiBuilder.BuildFileRequest(azFunctionUri, content); // This builds the request and sends it to the azure function.
             }
         }
         return View();
      }

BuildFileRequest .cs (вспомогательный метод, который создает запрос):

public async Task<HttpResponseMessage> BuildFileRequest(string uri, string content)
{
     MultipartFormDataContent multiContent = new MultipartFormDataContent();

     byte[] payload = Encoding.UTF8.GetBytes(content);
     multiContent.Add(new ByteArrayContent(payload), "files"); // name must be "files"
     HttpResponseMessage response = await httpClient.PostAsync($"{uri}", multiContent).ConfigureAwait(false);

     return response;
}

Я застрял на том, как получить этот запрос в функции и построить файл Excel из запроса, поэтому строки могут быть прочитаны и обработаны в база данных.

1 Ответ

1 голос
/ 17 февраля 2020

Согласно моему тесту, мы можем использовать следующий код для получения файла Excel.

  1. Код клиента. Это мой тест xlsx файл
using (var httpClient = new HttpClient())
            {
                using (var form = new MultipartFormDataContent())
                {
                    using (var fs = File.OpenRead(filePath))
                    {
                        using (var streamContent = new StreamContent(fs))
                        {
                            using (var fileContent = new ByteArrayContent(await streamContent.ReadAsByteArrayAsync()))
                            {
                                fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");

                                form.Add(fileContent, "file", Path.GetFileName(filePath));
                                HttpResponseMessage response = await httpClient.PostAsync(url, form);
                            }
                        }
                    }
                }
            }
Azure функция
 public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogInformation("C# HTTP trigger function processed a request.");
            foreach (var file in req.Form.Files) {
             //Process excel file
             /* For example  use sdk : DocumentFormat.OpenXml. 
For more details, please refer to https://docs.microsoft.com/en-us/office/open-xml/how-to-parse-and-read-a-large-spreadsheet

*/
                using (var stream = new MemoryStream()) {
                    await file.CopyToAsync(stream);
                    stream.Position = 0;
                    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(stream, false)) {
                        WorkbookPart workbookPart = doc.WorkbookPart;
                        SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
                        SharedStringTable sst = sstpart.SharedStringTable;

                        WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
                        Worksheet sheet = worksheetPart.Worksheet;

                        var cells = sheet.Descendants<Cell>();
                        var rows = sheet.Descendants<Row>();

                        log.LogInformation(string.Format("Row count = {0}", rows.LongCount()));
                        log.LogInformation(string.Format("Cell count = {0}", cells.LongCount()));



                    }



                }

            }
 return new OkObjectResult("Ok")
}

enter image description here

...