RAHUL(10217975) Ответов: 1

Загрузите и загрузите файл excel в ASP.NET MVC с использованием epplus


Привет,

Требование заключается в том, что пользователь загружает файл excel с именами студентов и другими данными. После загрузки, на том же событии щелчка пользователь должен получить файл excel с указанием статуса строки за строкой, были ли данные студента созданы успешно или любое сообщение об ошибке.

При загрузке Нажмите кнопку Я вызываю ниже действие и публикую Excel и делаю все проверки материала в действии MVC

function uploadFile(fileType, fileUpload) {
            if (window.FormData !== undefined) {
                var files = fileUpload.files;

                // Create FormData object
                var fileData = new FormData();

                // Looping over all files and add it to FormData object
                fileData.append(files[0].name, files[0]);

                $.ajax({
                    url: '/Admin/UploadNewStudents',
                    type: "POST",
                    contentType: false,// "application/vnd.ms-excel", // Not to set any content header
                    processData: false, // Not to process data
                    data: fileData,
                    success: function (result) {
                        alert(result);
                    },
                    error: function (xhr) {
                        
                    }
                });
            } else {
                alert("FormData is not supported.");
            }
        }




[HttpPost]
public ActionResult UploadNewStudent()
{
    try
    {
        HttpFileCollectionBase file = Request.Files;
        string Message = StudentExcel.ValidateExcel(Request);
        if (!string.IsNullOrEmpty(Message))
            return Json(Message, JsonRequestBehavior.AllowGet);
        else
        {
            HttpPostedFileBase pfile = Request.Files[0];
            DataSet ds = StudentExcel.GetExcelData(pfile);

            using (ExcelPackage pck = new ExcelPackage())
            {
                ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Accounts");
                ws.Cells["A1"].LoadFromDataTable(ds.Tables[0], true);
                Byte[] fileBytes = pck.GetAsByteArray();
                Response.Clear();
                Response.Buffer = true;
                Response.AddHeader("content-disposition", "attachment;filename=DataTable.xlsx");
                Response.Charset = "";
                Response.ContentType = "application/vnd.ms-excel";
                StringWriter sw = new StringWriter();
                Response.BinaryWrite(fileBytes);
                Response.End();
            }
        }

    }
    catch (Exception ex)
    {

    }
    return View();
}


Я получаю желаемые данные в приведенном ниже коде и устанавливаю их в пакет EPplus и пытаюсь загрузить, но Excel не загружается. Я не хочу сохранять excel на сервере.

DataSet ds = StudentExcel.ValidateExcelData(pfile);


Что я уже пробовал:

Гуглить,

Я думаю, что поскольку метод действия-это post, Я не могу загрузить excel. Новичок в MVC, любая помощь будет оценена по достоинству

F-ES Sitecore

Вы не можете обрабатывать загрузку файлов через ajax, так как ваш js обрабатывает ответ и не может записать этот ответ в файл. Вместо того чтобы использовать ajax, просто используйте обычную форму, которая указывает на ваше действие, и имейте файл в качестве обычного элемента формы. Это заставит браузер выполнить действие и обработать ответ, который запустит менеджер загрузок.

1 Ответов

Рейтинг:
2

Richard Deeming

Избегайте использования Response.BinaryWrite в MVC. Использовать пользовательский ActionResult вместо:

public class ExcelResult : FileResult
{
    private const string MimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

    public ExcelResult([NotNull] ExcelPackage package) : base(MimeType)
    {
        if (package is null) throw new ArgumentNullException(nameof(package));
        Package = package;
    }

    public ExcelPackage Package { get; }

    protected override void WriteFile([NotNull] HttpResponseBase response)
    {
        Package.SaveAs(response.OutputStream);
    }
}
[HttpPost]
public ActionResult UploadNewStudent()
{
    try
    {
        string message = StudentExcel.ValidateExcel(Request);
        if (!string.IsNullOrEmpty(message)) return Json(message);
        
        HttpPostedFileBase pfile = Request.Files[0];
        DataSet ds = StudentExcel.GetExcelData(pfile);

        ExcelPackage pck = new ExcelPackage();
        ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Accounts");
        ws.Cells["A1"].LoadFromDataTable(ds.Tables[0], true);
        return new ExcelResult(pck) { FileDownloadName = "DataTable.xlsx" };
    }
    catch (Exception ex)
    {
        return Json(ex.Message);
    }
}