Как добавить изображение в файл XLSX из URL-адреса с помощью Syncfusion Xlsio in. NET Core - PullRequest
0 голосов
/ 31 марта 2020

У меня есть. NET Core 2.2 API, который мне нужен для заполнения файла XLSX данными и изображением. Я использую Syncfusion Xlsio 17.4.0.5 для этого. Файл заполняется отлично, за исключением изображения. Изображение доступно по ссылке, поэтому мне нужно скачать его с ссылки и вставить в файл. Вот моя текущая попытка сделать это:

HttpClient client = new HttpClient();
using (Stream stream = await client.GetStreamAsync(imageUrl))
{
    worksheet.Pictures.AddPicture(1, 1, stream);
}

Когда я запускаю это, я получаю следующую ошибку в строке AddPicture:

{System.ArgumentException: Stream
   at Syncfusion.Drawing.Image..ctor(Stream stream)
   at Syncfusion.XlsIO.Implementation.Collections.PicturesCollection.AddPicture(Int32 topRow, Int32 leftColumn, Stream stream, ExcelImageFormat imageFormat)
   at MyProject.App.Services.LadingService.PopulateForm(IWorksheet worksheet, Lading lading) in C:\Users\jlewi\Source\GIT\my-project-backend\src\MyProject.App\Services\LadingService.cs:line 94
   at MyProject.App.Services.LadingService.GetLadingExport(String ladingId) in C:\Users\jlewi\Source\GIT\my-project-backend\src\MyProject.App\Services\LadingService.cs:line 58
   at MyProject.Api.Controllers.LadingController.ExportLading(String id) in C:\Users\jlewi\Source\GIT\my-project-backend\src\MyProject.Api\Controllers\LadingController.cs:line 147
   at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
   at MyProject.Api.Middleware.UserBlockedMiddleware.InvokeAsync(HttpContext context, IUserRepository userRepository) in C:\Users\jlewi\Source\GIT\my-project-backend\src\MyProject.Api\Middleware\UserBlockedMiddleware.cs:line 72
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at AspNetCoreRateLimit.RateLimitMiddleware`1.Invoke(HttpContext context)
   at AspNetCoreRateLimit.RateLimitMiddleware`1.Invoke(HttpContext context)
   at IdentityServer4.Hosting.IdentityServerMiddleware.Invoke(HttpContext context, IEndpointRouter router, IUserSession session, IEventService events) in C:\local\identity\server4\IdentityServer4\src\IdentityServer4\src\Hosting\IdentityServerMiddleware.cs:line 72
   at IdentityServer4.Hosting.MutualTlsTokenEndpointMiddleware.Invoke(HttpContext context, IAuthenticationSchemeProvider schemes) in C:\local\identity\server4\IdentityServer4\src\IdentityServer4\src\Hosting\MtlsTokenEndpointMiddleware.cs:line 60
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at IdentityServer4.Hosting.BaseUrlMiddleware.Invoke(HttpContext context) in C:\local\identity\server4\IdentityServer4\src\IdentityServer4\src\Hosting\BaseUrlMiddleware.cs:line 36
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at VOGBackend.Core.Middleware.ApiExceptionHandlerMiddleware.InvokeAsync(HttpContext context, ILogger`1 logger, IHostingEnvironment hostingEnvironment) in C:\Users\jlewi\Source\GIT\sharedlibrary.core\src\Middleware\ApiExceptionHandlerMiddleware.cs:line 36}

Я пробовал это с другими URL-адресами изображений и никто не работает. Есть какие-нибудь мысли?

ОБНОВЛЕНИЕ Хорошо, следующее работает, но кажется немного хакерским. Может быть, AddPicture не нравится работать с чистыми объектами Stream?

HttpClient client = new HttpClient();
using (Stream stream = await client.GetStreamAsync(url))
{
    using (MemoryStream memStream = new MemoryStream())
    {
        stream.CopyTo(memStream);
        var shape = worksheet.Pictures.AddPicture(1, 1, memStream);
    }
}

1 Ответ

1 голос
/ 02 апреля 2020

Привет от Syncfusion.

Syncfusion XlsIO не поддерживает чтение HttpConnection.ContentLengthReadStream в методе AddPicture, в ASP. NET Базовая платформа.

Итак, мы просим вас скопировать его в MemoryStream, как вы упомянули, чтобы преодолеть исключение.

Примечание: Я работаю в Syncfusion.

С уважением, Мохан.

...