上傳下載Azure Blob裡的Excel檔案
阿新 • • 發佈:2020-09-18
本文內容如下:
- 上傳Excel檔案到Azure Blob
- 在Azure Blob中下載Excel檔案的兩種方式
- 在Azure Blob中下載Excel檔案直接儲存到DataTable
- AzureHelp.cs附件
1. 上傳Excel檔案到Azure-Blob
新增引用:Microsoft.WindowsAzure.Storage.dll
前臺程式碼:
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-widthView Code" /> <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> <input class="form-control" id="excelfile" name="excelfile" type="file"> <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>
後臺程式碼:
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