Загрузить файл пакета Excel на локальный компьютер в формате ASP. NET MVC - PullRequest
0 голосов
/ 02 апреля 2020

Я публикую веб-приложение на сервере VM в домене. Я хочу позволить пользователям загружать файл Excel на свой локальный компьютер. Я хочу показать Save File Box и спросить пользователя о FileName и FilePath? Мой простой не работает, он сохраняет только файл на сервере. Я удалил SQL настройки запросов и соединений в следующем примере:

public ActionResult ZW2(ZW_Query model)
{
        string parametra = model.paremetr1;
        string parametrb = model.paremetr2;
        string parametrc = model.paremetr3;
        string parametrd = model.paremetr4;
        string parametre = model.paremetr5;

        if (parametra == "*")
        {
            parametra = "%";
        }
        else
        {
            parametra = model.paremetr1;
        }

        List<Models.ZWPub> list = new List<Models.ZWPub>();

        try
        {
            using (SqlConnection con = new SqlConnection())
            {
                String sql;

                DataTable dt = new DataTable();
                SqlDataAdapter da = new SqlDataAdapter();
                da.SelectCommand = new SqlCommand(sql, con);

                da.Fill(dt);

                if (dt.Rows.Count > 0)
                {
                    string filename = "Zamowienia.xlsx";
                    string filePath = Path.Combine(Path.GetTempPath(), filename.Replace(".xlsx", DateTime.Now.ToFileTime() + ".xlsx"));
                    FileInfo Files = new FileInfo(filePath);
                    ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
                    ExcelPackage excel = new ExcelPackage(Files);
                    var sheetscreate = excel.Workbook.Worksheets.Add("Zamowienia");

                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        sheetscreate.Cells[1, i + 1].Value = dt.Columns[i].ColumnName.ToString();
                    }

                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        for (int j = 0; j < dt.Columns.Count; j++)
                        {
                            sheetscreate.Cells[i + 2, j + 1].Value = dt.Rows[i][j].ToString();
                        }
                    }

                    excel.Save();

                    FileStream stream = new FileStream(filePath, FileMode.Open);
                    var result = new FileStreamResult(stream, "application/vnd.ms-excel");
                    result.FileDownloadName = Path.GetFileName(filePath);

                    return result;
                }

                return null;
            }
        }
        catch
        {
            return null;
        }
}
@using (Html.BeginForm("ZW2", "GM", FormMethod.Post, new { @class = "form-horizontal", role = "form", target = "_blank" }))
{
                @Html.AntiForgeryToken()
                <h4>Podaj numer ZW.</h4>
                <h5 class="redfont">Numery zamówień podawaj kolejno od góry.</h5>

                <hr />
                @Html.ValidationSummary(true, "", new { @class = "text-danger" })
                <div class="form-group">
                    @Html.LabelFor(m => m.paremetr1, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.EditorFor(m => m.paremetr1, new { htmlAttributes = new { @Value = "*", @class = "form-control datepicker" } })
                        @Html.ValidationMessageFor(m => m.paremetr1, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.paremetr2, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.EditorFor(m => m.paremetr2, new { htmlAttributes = new { @Value = "*", @class = "form-control datepicker" } })
                        @Html.ValidationMessageFor(m => m.paremetr2, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.paremetr3, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.EditorFor(m => m.paremetr3, new { htmlAttributes = new { @Value = "*", @class = "form-control datepicker" } })
                        @Html.ValidationMessageFor(m => m.paremetr3, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.paremetr4, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.EditorFor(m => m.paremetr4, new { htmlAttributes = new { @Value = "*", @class = "form-control datepicker" } })
                        @Html.ValidationMessageFor(m => m.paremetr4, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    @Html.LabelFor(m => m.paremetr5, new { @class = "col-md-2 control-label" })
                    <div class="col-md-10">
                        @Html.EditorFor(m => m.paremetr5, new { htmlAttributes = new { @Value = "*", @class = "form-control datepicker" } })
                        @Html.ValidationMessageFor(m => m.paremetr5, "", new { @class = "text-danger" })
                    </div>
                </div>
                <div class="form-group">
                    <div class="col-md-offset-2 col-md-10">
                        <input type="submit" value="Uruchom" class="btn btn-default" />
                        <input type="button" class="btn btn-default" value="Powrót" onclick="location.href='@Url.Action("Index", "GM")'" />
                    </div>
                </div>
}

1 Ответ

0 голосов
/ 02 апреля 2020

Итак, вы никогда не возвращаете файл в браузер. Один из способов достижения sh - использовать System.IO.FileStream и FileStreamResult.

        string filePath = Path.Combine(Path.GetTempPath(), filename.Replace(".xlsx", DateTime.Now.ToFileTime() + ".xlsx"));

        FileStream stream = new FileStream(filePath, FileMode.Open);

        var result = new FileStreamResult(stream, "application/vnd.ms-excel");
        result.FileDownloadName = Path.GetFileName(filePath);
        return result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...