как прочитать файл Excel в памяти (без сохранения его на диске) и вернуть его содержимое в ядро ​​tnet - PullRequest
0 голосов
/ 20 апреля 2020

Я работаю над webApi, используя ядро ​​do tnet, которое берет файл excel из IFormFile и читает его содержимое. Я следую статье https://levelup.gitconnected.com/reading-an-excel-file-using-an-asp-net-core-mvc-application-2693545577db, которая делает то же самое, за исключением файла здесь присутствует на сервере, и мой будет предоставлен пользователем.

вот код: publi c Тест IActionResult (файл IFormFile) {

            List<UserModel> users = new List<UserModel>();
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
            using (var stream = System.IO.File.Open(file.FileName, FileMode.Open, FileAccess.Read))
            {
                using (var reader = ExcelReaderFactory.CreateReader(stream))
                {

                    while (reader.Read()) //Each row of the file
                    {
                        users.Add(new UserModel
                        {
                            Name = reader.GetValue(0).ToString(),
                            Email = reader.GetValue(1).ToString(),
                            Phone = reader.GetValue(2).ToString()
                        });
                    }
                }
            }
            return Ok(users);
        }
    }

Когда system.IO пытается откройте файл, он не может найти путь, поскольку путь отсутствует. Как можно получить путь к файлу (который будет варьироваться в зависимости от выбора файла пользователем)? Существуют ли другие способы сделать это возможным.

PS: я не хочу сначала загружать файл на сервер, а затем читать его.

1 Ответ

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

Вы используете свойство file.FileName, которое ссылается на имя файла, отправляемое браузером. Это полезно знать, но пока нет реального файла на сервере. Вы должны использовать CopyTo(Stream) метод для доступа к данным:

public IActionResult Test(IFormFile file)
{
    List<UserModel> users = new List<UserModel>();
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    using (var stream = new MemoryStream())
    {
        file.CopyTo(stream);
        stream.Position = 0;
        using (var reader = ExcelReaderFactory.CreateReader(stream))
        {
            while (reader.Read()) //Each row of the file
            {
                users.Add(new UserModel{Name = reader.GetValue(0).ToString(), Email = reader.GetValue(1).ToString(), Phone = reader.GetValue(2).ToString()});
            }
        }
    }

    return Ok(users);
}

Ссылка

...