簡體   English   中英

將字符串從 C# 發送到客戶端並轉換為 Uint8Array 類型的字節數組,然后轉換為 blob 以打開 excel 文件。 參與的柯基犬

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM