[英]sending string from C# to client and converting into Uint8Array type byte array and then into blob to open excel file. Corgi Involved
因此,在 C# 代碼中,我將柯基犬發送給擁有柯基寶寶的客戶。 在這里使用 ClosedXml。
var wbCorgiBabiesTemplate = new XLWorkbook();
var wsCoriBabiesAmendementTemplate = wbCorgiBabiesTemplate.Worksheets.Add(" Work Sheet Corgi baby Template");
wsCoriBabiesAmendementTemplate.Cell("A1").Value = "Corgi Parent";
wsCoriBabiesAmendementTemplate.Cell("B1").Value = "Corgi Child";
wsCoriBabiesAmendementTemplate.Cell("A2").Value = "Petunia";
wsCoriBabiesAmendementTemplate.Cell("B2").Value = "Khaleesi";
using (var ms = new MemoryStream())
{
wbCorgiBabiesTemplate.SaveAs(ms);
byte[] Corgibabies = ms.ToArray();
}
corgi.Corgibabies = System.Text.Encoding.UTF8.GetString(Corgibabies);
return corgi;
之后在客戶端中,我想在 excel 表中打開 corgibabies,但這里的轉換在某處是錯誤的,我認為 excel 表無法正確打開。
var fileName = 'CorgiBabies.xlsx';
dataAccessService.get('corgi')
.then(function(response) {
let utf8Encode = new TextEncoder();
var strBytes = utf8Encode.encode(response.corgiBabies);
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
var file = new Blob([strBytes], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
var fileURL = window.URL.createObjectURL(file);
a.href = fileURL;
a.download = fileName;
a.click();
})
下面是 excel 表給我的圖像錯誤
假設你在.Net Core+(否則你可以找到 System.Buffers Nuget package for.Net 標准或框架),在服務器端嘗試
using System.Buffers;
using System.Buffers.Text;
並插入
var outputBuffer = new Span<byte>();
var status = Base64.EncodeToUtf8(Corgibabies, outputBuffer, out var consumed, out var written);
// sanity check
// if (status != OperationStatus.Done) throw new Exception();`
// do the above just before replacing
// System.Text.Encoding.UTF8.GetString(Corgibabies);
// with
System.Text.Encoding.UTF8.GetString(outputBuffer);
現在我很確定這將確保服務器響應客戶端應該期望的內容,但我還沒有准備好測試 Javascript 方面的事情(還)。 同時讓我知道這是否有助於您取得進步。
PS1:原始代碼中的錯誤是隱含假設Corgibabies
是一個包含 UTF8 編碼字符串字節的數組。 它實際上包含通常是磁盤上的 .xlsx 文件的原始字節。 需要將其轉換為文本(Base64 編碼)並確保文本為 UTF8。 顯然在 Javascript 你需要做相反的事情 - UTF8 Base64 到二進制,保存到磁盤,在 Excel 中打開...
您可以使其與File
一起使用,而不是將string
作為內容返回。
public ActionResult Get()
{
var wbCorgiBabiesTemplate = new XLWorkbook();
var wsCoriBabiesAmendementTemplate = wbCorgiBabiesTemplate.Worksheets.Add(" Work Sheet Corgi baby Template");
wsCoriBabiesAmendementTemplate.Cell("A1").Value = "Corgi Parent";
wsCoriBabiesAmendementTemplate.Cell("B1").Value = "Corgi Child";
wsCoriBabiesAmendementTemplate.Cell("A2").Value = "Petunia";
wsCoriBabiesAmendementTemplate.Cell("B2").Value = "Khaleesi";
wbCorgiBabiesTemplate.SaveAs("new.xlsx");
var ms = new MemoryStream();
wbCorgiBabiesTemplate.SaveAs(ms);
ms.Position = 0;
var fileName = "CorgiBabies.xlsx";
return File(ms, "application/octet-stream", fileName);
}
Api 致電:
<a href="https://localhost:7135/api/downloadExcel"></a>
或者
fetch('https://localhost:7135/api/downloadExcel')
.then(resp => resp.blob())
.then(blob => {
const url = window.URL.createObjectURL(blob);
const a = document.createElement('a');
a.style.display = 'none';
a.href = url;
// the filename you want
a.download = 'CorgiBabies.xlsx';
document.body.appendChild(a);
a.click();
window.URL.revokeObjectURL(url);
})
.catch(() => alert('oh no!'));
編號: git
ClosedXML
有幾個擴展可以幫助您實現所需的功能:
您可以為您的項目安裝適當的擴展,以幫助您快速訪問下載工作簿。 您還可以將文件保存在磁盤上,並將文件鏈接(路徑)傳遞給 JavaScript,然后繼續處理 JavaScript 中的文件。
如果您需要知道如何讓用戶從 ASP.NET 下載文件,那么您可以這樣做:
簡單的工作簿:
C#:ASP.NET MVC
[HttpGet]
public ActionResult Download(string fileName)
{
// create workbook
var workbook = new XLWorkbook();
var sheet = workbook.Worksheets.Add("Worksheet 1");
sheet.Cell("A1").Value = "A1";
sheet.Cell("B1").Value = "B1";
sheet.Cell("A2").Value = "A2";
sheet.Cell("B2").Value = "B2";
// get workbook bytes
byte[] workbookBytes;
using (var memoryStream = new MemoryStream())
{
workbook.SaveAs(memoryStream);
workbookBytes = memoryStream.ToArray();
}
return File(workbookBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", fileName);
}
C#: ASP.NET Web Z6450242531912981C3683CAE88A32A6Z6
public void Export(HttpResponse response, string fileName)
{
// create workbook
var workbook = new XLWorkbook();
var sheet = workbook.Worksheets.Add("Worksheet 1");
sheet.Cell("A1").Value = "A1";
sheet.Cell("B1").Value = "B1";
sheet.Cell("A2").Value = "A2";
sheet.Cell("B2").Value = "B2";
HttpResponse httpResponse = response;
httpResponse.Clear();
httpResponse.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
httpResponse.AddHeader("content-disposition", $"attachment;filename=\"{fileName}.xlsx\"");
using (var memoryStream = new MemoryStream())
{
workbook.SaveAs(memoryStream);
memoryStream.WriteTo(httpResponse.OutputStream);
}
httpResponse.End();
}
以上示例將直接將文件下載到客戶端設備中。 但是,如果要將工作簿字節傳遞給 JavaScript,則需要將其轉換為 base64 字符串並將其傳遞給JavaScript
,如下所示:
var base64String = Convert.ToBase64String(workbookBytes);
然后從JavaScript
將其解碼為Uint8Array
:
/*
JavaScript
*/
// get base64 string array and decoded it
var data = atob(serverSideResult);
var array = new Array(data.length);
for (var i = 0; i < data.length; i++) {
array[i] = data.charCodeAt(i);
}
// final result
var dataUint8Array = new Uint8Array(array);
現在您可以像普通Uint8Array
dataUint8Array
如果要將其傳遞回服務器端,可以將數組轉換為 base64 字符串,然后將其傳遞給服務器端,如下所示:
/*
JavaScript
*/
let binaryString = ''
for (var i = 0; i < dataUint8Array.byteLength; i++) {
binaryString += String.fromCharCode(dataUint8Array[i]);
}
//pass base64Result to the server-side (C#)
var base64Result = window.btoa(binaryString);
然后從C#
你只需要將它從 base64 字符串轉換回數組,如下所示:
var bytes = Convert.FromBase64String(dataReceivedFromJavaScript);
其中bytes
將是byte[]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.