【问题标题】:NPOI writing XLS file converting to Azure BlobNPOI 写入 XLS 文件转换为 Azure Blob
【发布时间】:2014-06-13 12:50:37
【问题描述】:

我正在尝试将使用 NPOI 在服务器上创建 xls 文档的当前应用程序转换为 Azure 托管应用程序。我对 NPOI 和 Azure 的经验很少,所以 2 次就在那里。我有应用程序将 xls 上传到 Blob 容器,但它始终为空白(9 个字节)。据我了解,NPOI 使用文件流写入文件,所以我只是将其更改为写入 blob 容器。

以下是我认为的相关部分:

   internal void GenerateExcel(DataSet ds, int QuoteID, string ReportFileName)
{
    string ExcelFileName = string.Format("{0}_{1}.xls",ReportFileName,QuoteID);       

    try
    {


        //these 2 strings will get deleted but left here for now to run side by side at the moment

        string ReportDirectoryPath = HttpContext.Current.Server.MapPath(".") + "\\Reports";
        if (!Directory.Exists(ReportDirectoryPath))
        {
            Directory.CreateDirectory(ReportDirectoryPath);
        }

        string ExcelReportFullPath = ReportDirectoryPath + "\\" + ExcelFileName;

        if (File.Exists(ExcelReportFullPath))
        {
            File.Delete(ExcelReportFullPath);
        }

        // Create a new workbook.
        var workbook = new HSSFWorkbook();

        //Rest of the NPOI XLS rows cells etc. etc. all works fine when writing to disk////////////////

        // Retrieve storage account from connection string.
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));

        // Create the blob client.
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve a reference to a container. 
        CloudBlobContainer container = blobClient.GetContainerReference("pricingappreports");
        // Create the container if it doesn't already exist.
        if (container.CreateIfNotExists())
        {
            container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob });
        }
        // Retrieve reference to a blob with the same name.
        CloudBlockBlob blockBlob = container.GetBlockBlobReference(ExcelFileName);



        // Write the output to a file on the server
        String file = ExcelReportFullPath;
        using (FileStream fs = new FileStream(file, FileMode.Create))
        {
            workbook.Write(fs);
            fs.Close();
        }
        // Write the output to a file on Azure Storage
        String Blobfile = ExcelFileName;
        using (FileStream fs = new FileStream(Blobfile, FileMode.Create))
        {
            workbook.Write(fs);
            blockBlob.UploadFromStream(fs);
            fs.Close();
        }                
    }

我正在上传到 Blob 并且文件存在,为什么数据没有写入 xls? 任何帮助,将不胜感激。

更新:我想我找到了问题所在。看起来您无法写入 Blob 存储中的文件。发现这个博客几乎回答了我的问题:它不使用 NPOI,但概念是相同的。 http://debugmode.net/2011/08/28/creating-and-updating-excel-file-in-windows-azure-web-role-using-open-xml-sdk/ 谢谢

【问题讨论】:

    标签: excel azure azure-blob-storage npoi


    【解决方案1】:

    你能安装 fiddler 并检查请求和响应数据包吗?您可能还需要在两次写入之间回溯到 0。因此,这里的正确代码可能是在尝试将流写入 blob 之前添加以下代码。

    workbook.Write(fs);
    fs.Seek(0, SeekOrigin.Begin);
    blockBlob.UploadFromStream(fs);
    fs.Close();
    

    我还注意到您使用的是 String Blobfile = ExcelFileName 而不是 String Blobfile = ExcelReportFullPath。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多