如何将 excel 从 ajax 读取到网络 api
How to read excel from ajax to web api
这是我的 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
});
这是我的网站 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 将每一行保存在数据库中。我也无法使用 Form 访问该文件,因为它是 Web Api。感谢您的帮助。
首先,要上传文件,您可以使用如下代码的视图:
@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>
}
二、接收数据chack,修改方法如下:
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;
}
}
这是我的 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
});
这是我的网站 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 将每一行保存在数据库中。我也无法使用 Form 访问该文件,因为它是 Web Api。感谢您的帮助。
首先,要上传文件,您可以使用如下代码的视图:
@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>
}
二、接收数据chack,修改方法如下:
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;
}
}