将Excel文件上载到Web API

时间:2017-03-23 15:35:38

标签: excel asp.net-web-api extjs

我正在尝试将excel文件上传到我的WebApi和DO STUFF及其内容。 我有extJs部分通过上传按钮完成发送文件。 (以下代码)

我的问题是我不知道如何构建webApi部件来处理excel文件。我猜我必须有一个HttpPost。

假WebApi:

public string SampleUploadFile()
{
    return _repo.UploadFile();
}

Extjs代码:

xtype: 'form',
//renderTo: 'fi-form', //(5)
fileUpload: true, //(1)
width: 500,
frame: true,
title: 'Position Sheet Upload Form',
bodyPadding: '10 10 0',
//bodyStyle: 'padding: 10px 10px 0 10px;',

defaults: {
    anchor: '100%',
    allowBlank: false,
    msgTarget: 'side',
    labelWidth: 50
},

//labelWidth: 50,
items: [{
    xtype: 'fileuploadfield',
    emptyText: 'Select an image',
    fieldLabel: 'Image',
    name: 'file', //(2)
    buttonText: 'Choose a file'
}],
buttons: [{
    text: 'Save',
    handler: function () {
        if (this.up('form').getForm().isValid()) {
            this.up('form').getForm().submit({
                url: 'Home/Upload',
                waitMsg: 'Uploading your file...',
                success: function (form, o) //(3)
                {
                    Ext.Msg.show({
                        title: 'Result',
                        msg: o.result.result,
                        buttons: Ext.Msg.OK,
                        icon: Ext.Msg.INFO
                    });
                },
                failure: function (form, o) //(4)
                {
                    Ext.Msg.show({
                        title: 'Result',
                        msg: o.result.error,
                        buttons: Ext.Msg.OK,
                        icon: Ext.Msg.ERROR
                    });
                }
            });
        }
    }
}]

有谁知道怎么做?我应该有一个参数是文件吗?

3 个答案:

答案 0 :(得分:4)

你可以处理这样的文件:

public void UploadFile(HttpRequestMessage request)
{
    HttpContext context = HttpContext.Current;
    HttpPostedFile postedFile = context.Request.Files["file"];
    // ...
}

答案 1 :(得分:1)

我想分享另一种使用 ExcelDataReader.DataSet 库在 WEB API 中处理 Upload and Read the EXCEL file 的方法。

        [Route("ReadFile")]
        [HttpPost]
        public string ReadFile()
        {
            try
            {
                #region Variable Declaration
                string message = "";
                HttpResponseMessage ResponseMessage = null;
                var httpRequest = HttpContext.Current.Request;
                DataSet dsexcelRecords = new DataSet();
                IExcelDataReader reader = null;
                HttpPostedFile Inputfile = null;
                Stream FileStream = null;
                #endregion
 
                #region Save Student Detail From Excel
                using (dbCodingvilaEntities objEntity = new dbCodingvilaEntities())
                {
                    if (httpRequest.Files.Count > 0)
                    {
                        Inputfile = httpRequest.Files[0];
                        FileStream = Inputfile.InputStream;
 
                        if (Inputfile != null && FileStream != null)
                        {
                            if (Inputfile.FileName.EndsWith(".xls"))
                                reader = ExcelReaderFactory.CreateBinaryReader(FileStream);
                            else if (Inputfile.FileName.EndsWith(".xlsx"))
                                reader = ExcelReaderFactory.CreateOpenXmlReader(FileStream);
                            else
                                message = "The file format is not supported.";
 
                            dsexcelRecords = reader.AsDataSet();
                            reader.Close();
 
                            if (dsexcelRecords != null && dsexcelRecords.Tables.Count > 0)
                            {
                                DataTable dtStudentRecords = dsexcelRecords.Tables[0];
                                for (int i = 0; i < dtStudentRecords.Rows.Count; i++)
                                {
                                    Student objStudent = new Student();
                                    objStudent.RollNo = Convert.ToInt32(dtStudentRecords.Rows[i][0]);
                                    objStudent.EnrollmentNo = Convert.ToString(dtStudentRecords.Rows[i][1]);
                                    objStudent.Name = Convert.ToString(dtStudentRecords.Rows[i][2]);
                                    objStudent.Branch = Convert.ToString(dtStudentRecords.Rows[i][3]);
                                    objStudent.University = Convert.ToString(dtStudentRecords.Rows[i][4]);
                                    objEntity.Students.Add(objStudent);
                                }
 
                                int output = objEntity.SaveChanges();
                                if (output > 0)
                                    message = "The Excel file has been successfully uploaded.";
                                else
                                    message = "Something Went Wrong!, The Excel file uploaded has fiald.";
                            }
                            else
                                message = "Selected file is empty.";
                        }
                        else
                            message = "Invalid File.";
                    }
                    else
                        ResponseMessage = Request.CreateResponse(HttpStatusCode.BadRequest);
                }
                return message;
                #endregion
            }
            catch (Exception)
            {
                throw;
            }
        }

您可以阅读此 article 以获得详细的分步说明。

答案 2 :(得分:0)

另一种可能的解决方案。 Web API方法使用ClosedXML nuget包来读取包含excel内容的流:

using ClosedXML.Excel;

public async void UploadFile()
{
    var context = HttpContext.Current;

    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }

    var provider = new MultipartMemoryStreamProvider();
    await Request.Content.ReadAsMultipartAsync(provider);

    foreach (HttpContent ctnt in provider.Contents)
    {
        //now read individual part into STREAM
        var stream = await ctnt.ReadAsStreamAsync();
        if (stream.Length != 0)
        {
            //handle the stream here
            using (XLWorkbook excelWorkbook = new XLWorkbook(stream))
            {
                var name = excelWorkbook.Worksheet(1).Name;
            }
        }
    }
}