Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# FileInfo而不是文件路径要提供blobstorage url_C#_Url_Epplus_Azure Blob Storage_System.io.fileinfo - Fatal编程技术网

C# FileInfo而不是文件路径要提供blobstorage url

C# FileInfo而不是文件路径要提供blobstorage url,c#,url,epplus,azure-blob-storage,system.io.fileinfo,C#,Url,Epplus,Azure Blob Storage,System.io.fileinfo,我正在使用EPPlus从现有模板创建excel工作表 我的代码上载到azure blob存储。Azure数据工厂自定义活动使用的 对于此活动,我需要使用azure blob中的模板excel文件 我想给模板文件的URL var newFile = new FileInfo("Report_Template.xlsx"); 有什么解决方案或替代方案吗 由于这种情况太罕见,我无法从web搜索中获得解决方案。文件信息用于磁盘文件,而不是URL。无论如何,您不需要一个来与EPPlus一起工作。正如所示

我正在使用EPPlus从现有模板创建excel工作表

我的代码上载到azure blob存储。Azure数据工厂自定义活动使用的

对于此活动,我需要使用azure blob中的模板excel文件

我想给模板文件的URL

var newFile = new FileInfo("Report_Template.xlsx");
有什么解决方案或替代方案吗


由于这种情况太罕见,我无法从web搜索中获得解决方案。

文件信息用于磁盘文件,而不是URL。无论如何,您不需要一个来与EPPlus一起工作。正如所示,您可以将包直接保存到流:

ExcelPackage pck = new ExcelPackage();
var ws = pck.Workbook.Worksheets.Add("Sample1");

ws.Cells["A1"].Value = "Sample 1";
ws.Cells["A1"].Style.Font.Bold = true;
var shape = ws.Drawings.AddShape("Shape1", eShapeStyle.Rect);
shape.SetPosition(50, 200);
shape.SetSize(200, 100);
shape.Text = "Sample 1 saves to the Response.OutputStream";

pck.SaveAs(Response.OutputStream);
您可以使用类似的代码写入blob的流。您可以使用或等效的异步方法OpenWriteAsync打开要写入blob的流:

ExcelPackage pck = new ExcelPackage();
var ws = pck.Workbook.Worksheets.Add("Sample1");

// Build the sheet then ...
var blockBlob = container.GetBlockBlobReference("somefile.xlsx");
using(var stream=blockBlob.OpenWrite())
{
    pck.SaveAs(stream);
}

昨天,当我想从SharePoint库加载Excel模板、更改数据并将更改保存为新的Excel文件返回SharePoint时,我无意中遇到了这个问题。因此,这可能回答了一个基本问题:如何通过url而不是FileInfo打开

我做了以下工作,效果很好:

public string CreateSheet()
    {
        string siteUrl = SPContext.Current.Site.Url;
        string retval = string.Empty;

        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            using (SPSite sc = new SPSite(siteUrl))
            {
                using (SPWeb web = sc.OpenWeb())
                {
                    SPFile spFile = web.GetFile("SiteCollectionDocuments/Template.xlsx");
                    Stream stream = spFile.OpenBinaryStream();

                    using (ExcelPackage p = new ExcelPackage(stream))
                    {
                        ExcelWorksheet sheetRoles = p.Workbook.Worksheets["Roles"];
                        sheetRoles.Cells[2, 1].Value = "Today: " + DateTime.Now.ToString("dd.MM.yyyy");

                        byte[] data = p.GetAsByteArray();
                        stream.Close();

                        web.AllowUnsafeUpdates = true;
                        SPDocumentLibrary lib = web.Lists.TryGetList("Site Collection Documents") as SPDocumentLibrary;
                        string fileName = "TheNewFileNameToUse-" + DateTime.Now.ToString("dd.MM.yyyy") + ".xlsx";
                        lib.RootFolder.Files.Add("SiteCollectionDocuments/" + fileName, data, true);

                        retval = siteUrl + "/_layouts/15/WopiFrame.aspx?sourcedoc=/SiteCollectionDocuments/" + fileName + "&action=default";
                    }
                }
            }
        });

        return retval;
    }

正如您所见,您可以从一个流中创建一个ExcelPackage,该流是通过从某个url获取它而创建的。即使这个答案迟了,也可能对其他人有所帮助。

您可以将Azure存储中的blob读取到内存流中,然后直接读取。代码示例类似于:

        var storageAccount = CloudStorageAccount.Parse("Connection_String");
       
        string dataBlobPath = "path_to_blob.xlsx";
        var dataBlobUri = new Uri(storageAccount.BlobEndpoint,dataBlobPath);
        var sourceBlob = new CloudBlockBlob(dataBlobUri, storageAccount.Credentials);
        int worksheets;

        using (Stream str = new MemoryStream())
        {
            await sourceBlob.DownloadToStreamAsync(str);
            using (ExcelPackage p = new ExcelPackage(str))
            {
                worksheets = p.Workbook.Worksheets.Count;
            }

        }

嘿,谢谢你!我目前使用的是openwrite方法,但是当我保存文件时,我发现类型不匹配,唯一的区别是我使用的是excel互操作指令,而不是任何想法?@SemOne这一个区别是巨大的。互操作意味着您正在启动Excel,它不了解流。这还意味着您不能在任何服务器上使用代码,因为a需要安装Excel,b必须为每个请求创建一个实例。如果您有问题,请发布一个新问题,其中包含代码、错误和完整异常(如果有)