Проблема с файлом экспорта C# Web API Excel, который не может открыть файл из-за неправильного формата или расширения файла - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь сгенерировать файл Excel из моей базы данных и загрузить файл с моего веб-сайта, но когда я открываю файл Excel, возникает ошибка «невозможно открыть файл, поскольку формат файла или расширение файла недопустимы». произошло. Итак, это мой код для этого.

Вот мой скрипт:

    $(document).ready(function () {
    $("#btnExportExcel").click(function (e) {
        e.preventDefault();
        const deferred = $.Deferred();
        var paymentType = $("#transactionTypeDropdown").val();
        var paymentStatus = $("#paymentStatusDropdown").val();
        var merchantName = $("#merchantNameDropdown").val();
        var dateTime = $("#reservation").val().split(" ");
        var refNo = $("#refNoInput").val();
        var terminalId = $("#terminalID").val();
        $.ajax({
            type: "POST",
            crossOrigin: true,
            url: "/api/Transaction/ExportExcel",
            headers: {
                Accept: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
            },
            data: {
                "Date_1": dateTime[0],
                "Date_2": dateTime[2],
                "PaymentType": paymentType,
                "Status": paymentStatus,
                "Outtrade": refNo,
                "Merchant": merchantName,
                "TerminalID": terminalId
            },
            success: function (result) {
                if (dateTime[0] == dateTime[2]) {
                    filename = "Transaction_Detail_" + dateTime[0].replace(/\//g, '-') + ".xlsx";
                }
                else {
                    filename = "Transaction_Detail_" + dateTime[0].replace(/\//g, '-') + " - "
                        + dateTime[2].replace(/\//g, '-') + ".xlsx";
                }

                var uri = 'data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,' + result;
                var link = document.createElement("a");
                link.href = uri;
                link.style = "visibility:hidden";
                link.download = filename;
                document.body.appendChild(link);
                link.click();
                document.body.removeChild(link);
            },
            error: function (jqXHR, exception) {
                getErrorMessage(jqXHR, exception);
            }
        });
        return deferred.promise();
    });
});

Вот мой C# API:

public class TransactionController : ApiController
{        
        [AllowAnonymous]
        [HttpPost]
        [Route("api/Transaction/ExportExcel")]
        public HttpResponseMessage ExportExcel(TransactionSearchReq req)
        {
            TransactionMgr transaction = new TransactionMgr();
            List<TransactionRecordRes> transactionList = new List<TransactionRecordRes>();
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK);
            MediaTypeHeaderValue mediaType = MediaTypeHeaderValue.Parse("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            byte[] fileContents;
            string fileName;
            try
            {
                // Get transaction records
                transactionList = transaction.GetSearchTransactionRecord(req);
                if (transactionList.Count() > 0)
                {
                    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
                    using (var package = new ExcelPackage())
                    {
                        var worksheet = package.Workbook.Worksheets.Add("Sheet1");

                        // I put data to worksheet here.

                        fileContents = package.GetAsByteArray();
                    }

                    if (fileContents == null || fileContents.Length == 0)
                    {
                        response = Request.CreateResponse(HttpStatusCode.InternalServerError);
                        response.Content = new StringContent("Export file error.", Encoding.Unicode);
                        return response;
                    }
                    else
                    {
                        if (string.Compare(req.Date_1, req.Date_2) == 0)
                        {
                            fileName = string.Format("Transaction_Detail_{0}.xlsx", req.Date_1.Replace('/', '-'));
                        }
                        else
                        {
                            fileName = string.Format("Transaction_Detail_{0} - {1}.xlsx", req.Date_1.Replace('/', '-'), req.Date_2.Replace('/', '-'));
                        }

                        MemoryStream memoryStream = new MemoryStream(fileContents);
                        response.Content = new StreamContent(memoryStream);
                        response.Content.Headers.ContentType = mediaType;
                        response.Content.Headers.ContentDisposition =
                            new ContentDispositionHeaderValue("attachment") { FileName = fileName };
                        return response;
                    }
                }
                else
                {
                    response = Request.CreateResponse(HttpStatusCode.InternalServerError);
                    response.Content = new StringContent("Export file error.", Encoding.Unicode);
                    return response;
                }
            }
            catch (Exception ex)
            {
                response = Request.CreateResponse(HttpStatusCode.InternalServerError);
                response.Content = new StringContent("Export file error.", Encoding.Unicode);
                return response;
            }
        }
}

Где я ' я ошибаюсь?

...