Как читать Excel из AJAX для веб-API - PullRequest
0 голосов
/ 08 сентября 2018

Вот мой вызов ajax:

 $.ajax({
                    type: "POST",
                    url: "/api/excels/Upload",
                    data: $file,
                    contentType: false,
                    processData: false
                }).done(function (result) {
                    alert(result);
                }).fail(function (a, b, c) {
                    console.log(a, b, c);
                });
                return false;// if it's a link to prevent post
            });

Вот моя функция контроллера Web APi:

 [HttpPost]
        public async Task<string> Upload()
        {

            FilePath filePath = "HOW SHOULD I GET THE FILE???"; 
            FileStream stream = System.IO.File.Open(filePath, FileMode.Open, FileAccess.Read);
            IExcelDataReader excelReader = null;

            //Check file type 
            if (filePath.EndsWith(".xls"))
            {
                excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
            }

            else if (filePath.EndsWith(".xlsx"))
            {
                excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
            }

            var result = excelReader.AsDataSet(new ExcelDataSetConfiguration()
            {
                ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
                {
                    UseHeaderRow = true
                }
            });

            String sheetName = result.Tables[0].TableName;

        }

Как видите, я использую ExcelReader, чтобы получить файл и проанализировать его, чтобы прочитать его содержимое. Моя конечная цель - прочитать каждую строку и сохранить каждую строку в БД, используя Entity Framework. Я не могу использовать форму для доступа к файлу, потому что это веб-API. Буду признателен за вашу помощь.

1 Ответ

0 голосов
/ 09 сентября 2018

Во-первых, чтобы загрузить файл, вы можете использовать представление с кодом, подобным следующему:

@section scripts
{
<script type="text/javascript">
    $(document).ready(function() {
        $('#upload').click(function () {
            var data = new FormData();
            var file = $('form input[type=file]')[0].files[0];
            data.append('file',file);
            $.ajax({
                url: '/api/excels/Upload',
                processData: false,
                contentType: false,
                data: data,
                type: 'POST'
            }).done(function(result) {
                alert(result);
            }).fail(function(a, b, c) {
                console.log(a, b, c);
            });
        });
    });
</script>    
}

Во-вторых, чтобы получить данные и проверить, измените метод следующим образом:

public class ExcelsController : ApiController
{
    [HttpPost]
    public async Task<string> Upload()
    {
       var provider = new MultipartMemoryStreamProvider();
       await Request.Content.ReadAsMultipartAsync(provider);

       // extract file name and file contents
       Stream stream = new MemoryStream(await provider.Contents[0].ReadAsByteArrayAsync());

       //get fileName
       var filename = provider.Contents[0].Headers.ContentDisposition.FileName.Replace("\"", string.Empty);

        //Check file type 
        if (filename .EndsWith(".xls"))
        {
            excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
        }

        else if (filename .EndsWith(".xlsx"))
        {
            excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
        }
        else
        {
            return "Not Valid";
        }
        var result = excelReader.AsDataSet(new ExcelDataSetConfiguration()
        {
            ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
            {
                UseHeaderRow = true
            }
        });


       return result;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...