extjs 将Excel文件上载到Web API

wlwcrazw  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(179)

我正在尝试上传一个excel文件到我的WebApi,并使用它的内容做一些事情。我已经完成了通过上传按钮发送文件的extJs部分。(下面的代码)
我的问题是我不知道如何构建webApi部分来处理excel文件。我猜我必须有一个HttpPost。

假WebApi:

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

外部代码:

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
                    });
                }
            });
        }
    }
}]

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

lymgl2op

lymgl2op1#

您可以像这样处理文件:

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

tjrkku2a2#

另一种可能的解决方案。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;
            }
        }
    }
}
sgtfey8w

sgtfey8w3#

我想分享另一种在WEB API中使用ExcelDataReader.DataSet库实现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,了解详细的逐步说明。

相关问题