【问题标题】:FileInfo instead of file path want to give blobstorage urlFileInfo 而不是文件路径想要给 blobstorage url
【发布时间】:2018-04-08 01:06:46
【问题描述】:

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

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

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

我想给出模板文件的 URL。

var newFile = new FileInfo("Report_Template.xlsx");

有什么解决方案或替代方案吗?

因为场景太少见,我没有通过网络搜索得到解决方案。

【问题讨论】:

    标签: c# url epplus azure-blob-storage system.io.fileinfo


    【解决方案1】:

    FileInfo 用于磁盘文件,而不是 URL。无论如何,您都不需要使用 EPPlus。作为Web sample shows,您可以将包直接保存到流中:

    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 的流。您可以使用 CloudBlockBlob.OpenWrite 或等效的异步方法 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);
    }
    

    【讨论】:

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

    昨天,当我想从 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;
        }
    

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

    【讨论】:

      【解决方案3】:

      您可以将 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;
                  }
      
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-27
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        • 2016-10-27
        • 2012-07-26
        • 1970-01-01
        相关资源
        最近更新 更多