1. 程式人生 > 實用技巧 >上傳下載Azure Blob裡的Excel檔案

上傳下載Azure Blob裡的Excel檔案

本文內容如下:

  1. 上傳Excel檔案到Azure Blob
  2. 在Azure Blob中下載Excel檔案的兩種方式
  3. 在Azure Blob中下載Excel檔案直接儲存到DataTable
  4. AzureHelp.cs附件

1. 上傳Excel檔案到Azure-Blob

新增引用:Microsoft.WindowsAzure.Storage.dll

前臺程式碼:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width
" /> <title>Index</title> </head> <body> <script src="~/lib/jquery/dist/jquery.min.js"></script> <form class="form-horizontal" method="post" id="ExcelFile" action="File/UploadFile" enctype="multipart/form-data"> <label class="margin-top:8px">Excel上傳:</label> &nbsp;
<input class="form-control" id="excelfile" name="excelfile" type="file"> &nbsp; <input id="BtnUpload" class="btn btn-primary" type="submit" value="上傳" style="text-align:center" /> <div id="box-footer" class="box-footer">@ViewBag.Result</div> </form> <script type="
text/javascript"> $("#BtnUpload").click(function () { App.blockUI(); $("#ExcelFile").submit(); return false; }); </script> </body> </html>
View Code

後臺程式碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace WebApplication1.Controllers
{
    public class FileController : Controller
    {
        private static string StorageConnectionstring { get; set; }
        private static string ContainerName { get; set; }
        public FileController(IOptions<AppSettings> setting)
        {
            StorageConnectionstring = setting.Value.StorageConnectionstring;
            ContainerName = setting.Value.ContainerName;
        }

        public IActionResult UploadFile()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> UploadFile(IFormFile excelFile)
        {
            try
            {
                string responMsg = "";
                string oFileName = Path.GetFileName(excelFile.FileName);
                string fileExtension = Path.GetExtension(oFileName).ToLower();//獲取副檔名
                string AzureFilePath = $"{DateTime.Now.ToString("yyyyMMddHHmmssfff")}" + fileExtension;
                responMsg = await AzureHelp.FileUploadAsync(AzureFilePath, excelFile.OpenReadStream(), StorageConnectionstring, ContainerName);
                if (!string.IsNullOrEmpty(responMsg))
                {
                    throw new Exception("上傳成功!");
                }
                else
                {
                    throw new Exception("上傳失敗!");
                }
            }
            catch (Exception ex)
            {
                ViewBag.Result = ex.Message;
            }
            return View();
        }
    }
}
View Code

執行效果

上傳名為Test的Excel檔案

上傳成功

在Azure Blob中能看見上傳的Excel檔案

2. 在Azure Blob中下載Excel檔案的兩種方式

方式一:使用程式碼

新增引用:Microsoft.WindowsAzure.Storage.dll

前臺程式碼:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ExportExcel</title>
</head>
<body>
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <input type="button" onclick="ExportExcel()" value="下載" />

    <script type="text/javascript">
        function ExportExcel() {
            var url = "File/DownExcel";
            var form = $("<form>");//定義一個form表單
            form.attr("style", "display:none");
            form.attr("target", "");
            form.attr("method", "post");//請求型別
            form.attr("action", url);//請求地址
            $("body").append(form);//將表單放置在web中
            form.submit();
        }
    </script>
</body>
</html>
View Code

後臺程式碼:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace WebApplication1.Controllers
{
    public class FileController : Controller
    {
        private static string StorageConnectionstring { get; set; }
        private static string ContainerName { get; set; }
        public FileController(IOptions<AppSettings> setting)
        {
            StorageConnectionstring = setting.Value.StorageConnectionstring;
            ContainerName = setting.Value.ContainerName;
        }
public IActionResult ExportExcel()
        {
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> DownExcel()
        {
            //要下載檔案的路徑
            string AzureFilePath = "https://accazchannel.blob.core.chinacloudapi.cn/test/20200901172136443.xlsx";
            string fileName = "Test" + DateTime.Now.ToFileTime().ToString() + ".xlsx";
            string filePath = AzureFilePath.Replace("https://accazchannel.blob.core.chinacloudapi.cn/test/", "");
            MemoryStream stream = (MemoryStream)AzureHelp.FileDownloadAsync(filePath, StorageConnectionstring, ContainerName).Result;
            return File(stream.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
        }
    }
}
View Code

執行結果:

點選下載便可下載Excel

方式二:設定Blob Containers中某個容器的屬性

選中Blob Containers中某個容器-------------->滑鼠右鍵,選擇設定容器公共訪問級別---------------------->選擇第二個“容器和Blob的公共讀取訪問許可權”

3.在Azure Blob中下載Excel檔案直接儲存到DataTable

新增引用ExcelDataReader.dll

ExcelDataReader.DataSet.dll

Microsoft.WindowsAzure.Storage.dll

System.Text.Encoding.CodePages.dll

.NET Core 在預設情況下是沒有註冊EncodeProvider,需要我們們手動自己去註冊。
在NuGet包新增System.Text.Encoding.CodePages

前臺程式碼:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>ExportExcelToDataTable</title>
</head>
<body>
    <input type="button" onclick="ExportExcel()" value="下載Excel儲存到DataTable" />
    <br />
    <table id="table" style="display:none;">
        <thead><tr style="border: 1px solid grey;"><td>A</td><td>B</td><td>C</td><td>D</td></tr></thead>
        <tbody id="tableBody"></tbody>
    </table>

    <script src="~/lib/jquery/dist/jquery.min.js"></script>

    <script type="text/javascript">
        function ExportExcel() {
            $.ajax({
                type: "Get",
                async: false,//同步請求
                url: "File/DownExcelToDataTable", //獲取資料的ajax請求地址
                success: function (data) {
                    if (data.result == "T") {
                        alert("Excel讀取成功");
                        $("#table").css({ "display": "block" });
                        $.each(data.rows, function (i, item) {
                            var tr = "<tr style='border: 1px solid grey;'>";
                            tr += "<td>" + item.cloumn1 + "</td>";
                            tr += "<td>" + item.cloumn2 + "</td>";
                            tr += "<td>" + item.cloumn3 + "</td>";
                            tr += "<td>" + item.cloumn4 + "</td>";
                            tr += "</tr>";
                            $("#tableBody").append(tr);
                        });
                    } else {
                        alert("失敗。");
                    }
                }
            });
        }
    </script>
</body>
</html>
View Code

後臺程式碼:

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace WebApplication1.Controllers
{
    public class FileController : Controller
    {
        private static string StorageConnectionstring { get; set; }
        private static string ContainerName { get; set; }
        public FileController(IOptions<AppSettings> setting)
        {
            StorageConnectionstring = setting.Value.StorageConnectionstring;
            ContainerName = setting.Value.ContainerName;
        }
public IActionResult ExportExcelToDataTable()
        {
            return View();
        }

        public IActionResult DownExcelToDataTable()
        {
            try
            {
                //要下載檔案的路徑
                string AzureFilePath = "https://accazchannel.blob.core.chinacloudapi.cn/test/20200901172136443.xlsx";
                string filePath = AzureFilePath.Replace("https://accazchannel.blob.core.chinacloudapi.cn/test/", "");
                DataTable dt = AzureHelp.GetExcelBlobData(filePath, StorageConnectionstring, ContainerName);
                List<ExcelColumn> lexcel = new List<ExcelColumn>();
                if (dt != null && dt.Rows.Count > 0)
                {
                    for (int i = 1; i < dt.Rows.Count; i++)
                    {
                        ExcelColumn excel = new ExcelColumn();
                        excel.Cloumn1 = dt.Rows[i][0].ToString();
                        excel.Cloumn2 = dt.Rows[i][1].ToString();
                        excel.Cloumn3 = dt.Rows[i][2].ToString();
                        excel.Cloumn4 = dt.Rows[i][3].ToString();
                        lexcel.Add(excel);
                    }
                }
                return Json(new
                {
                    result ="T",
                    rows = lexcel
                });
            }
            catch (Exception ex)
            {
                return null;
            }
        }


        public class ExcelColumn
        {
            public string Cloumn1 { set; get; }
            public string Cloumn2 { set; get; }
            public string Cloumn3 { set; get; }
            public string Cloumn4 { set; get; }
        }

    }
}
View Code

執行效果:

4.AzureHelp.cs附件程式碼

using ExcelDataReader;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace WebApplication1
{
    public class AzureHelp
    {
        /// <summary>
        /// 上傳檔案到Azure
        /// </summary>
        /// <param name="fileName">檔名</param>
        /// <param name="stream">檔案流</param>
        /// <returns></returns>
        public static async Task<string> FileUploadAsync(string fileName, Stream stream,string StorageConnectionstring,string containerName)
        {
                CloudBlobContainer cloudBlobContainer = null;
                CloudStorageAccount storageAccount = null;
            if (CloudStorageAccount.TryParse(StorageConnectionstring, out storageAccount))
            {
                CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
                cloudBlobContainer = cloudBlobClient.GetContainerReference(containerName);
                CloudBlockBlob blob = cloudBlobContainer.GetBlockBlobReference(fileName);
                await blob.UploadFromStreamAsync(stream);
                return blob.Uri.AbsoluteUri;
            }
            return string.Empty;
        }

        /// <summary>
        ///  上傳檔案到Azure
        /// </summary>
        /// <param name="fileName">檔名</param>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public static async Task<string> FileUploadAsync(string fileName, byte[] bytes,string StorageConnectionstring, string ContainerName)
        {
            CloudBlobContainer cloudBlobContainer = null;
            CloudStorageAccount storageAccount = null;
            if (CloudStorageAccount.TryParse(StorageConnectionstring, out storageAccount))
            {
                CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
                cloudBlobContainer = cloudBlobClient.GetContainerReference(ContainerName);
                CloudBlockBlob blob = cloudBlobContainer.GetBlockBlobReference(fileName);
                await blob.UploadFromByteArrayAsync(bytes, 0, bytes.Length);
                return blob.Uri.AbsoluteUri;
            }
            return string.Empty;
        }

        /// <summary>
        /// 從Azure Blob中下載Excel
        /// </summary>
        /// <param name="filePath">下載檔名</param>
        /// <param name="StorageConnectionstring">Azure Blob的連線字串</param>
        /// <param name="containerName">容器名</param>
        /// <returns></returns>
        public static async Task<Stream> FileDownloadAsync(string filename, string StorageConnectionstring, string ContainerName)
        {
            CloudBlobContainer cloudBlobContainer = null;
            CloudStorageAccount storageAccount = null;
            var memoryStream = new MemoryStream();
            if (CloudStorageAccount.TryParse(StorageConnectionstring, out storageAccount))
            {
                CloudBlobClient cloudBlobClient = storageAccount.CreateCloudBlobClient();
                cloudBlobContainer = cloudBlobClient.GetContainerReference(ContainerName);
                CloudBlockBlob blob = cloudBlobContainer.GetBlockBlobReference(filename);
                await blob.DownloadToStreamAsync(memoryStream);
            }
            return memoryStream;
        }


        /// <summary>
        /// 下載Azure Blob中的Excel,儲存到DataSet中
        /// </summary>
        /// <param name="filename">檔名</param>
        /// <param name="connectionString">Azure Blob的連線字串</param>
        /// <param name="containerName">容器名</param>
        /// <returns></returns>
        public static DataTable  GetExcelBlobData(string filename, string connectionString, string containerName)
        {
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference(containerName);
            CloudBlockBlob blockBlobReference = container.GetBlockBlobReference(filename);

            DataSet ds;
            using (var memoryStream = new MemoryStream())
            {
                blockBlobReference.DownloadToStream(memoryStream);

                var excelReader = ExcelReaderFactory.CreateOpenXmlReader(memoryStream);
                ds = excelReader.AsDataSet();
                excelReader.Close();
            }
            return ds.Tables[0];
        }
    }
}
View Code