通过Ajax上传ExcelFile并在Controller上读取

时间:2018-09-04 14:37:24

标签: javascript c# asp.net-mvc

我需要读取通过ajax发送到控制器的excel文件(格式为httppostfilebase)并获取其数据 该文件将从网站上载,无需保存在磁盘上。 我在PageWeb上得到了这个(选择文件的按钮和进行上传的人(“ Analizar”):

<input type="file" accept=".xls,.xlsx" id="cargarArchivo" class="cargarArchivo"/>
    <br/>
 <input type="button" class="analizarArchivo" value="Analizar" onclick="AnalizarArchivoEmpleados()"/>

这在JS上(以“ HttpPostFileBase”格式发送文件的人(剩下的只是验证而已):

var mensajeDialogo;
function AnalizarArchivoEmpleados () {
var nombreArchivo = $(".cargarArchivo").val();
//Se verifica que hay un archivo seleccionado y que su extension sea Excel (xls, xlsx)
if ($(".cargarArchivo").get(0).files.length == 0 || nombreArchivo.indexOf(".xls") == -1) {
    mensajeDialogo = "Porfavor seleccione un archivo";
    if ($(".cargarArchivo").get(0).files.length != 0 && nombreArchivo.indexOf(".xls") == -1) {
        mensajeDialogo = mensajeDialogo + "<br> con extencion valida Excel (xls, xlsx)";
    }
    $('<div>' + mensajeDialogo + "</div>").dialog({
        scriptCharset: "utf-8",
        contentType: "application/x-www-form-urlencoded; charset=UTF-8",
        draggable: false,
        modal: true,
        resizable: false,
        width: 'auto',
        title: 'Analizar Archivo',
        buttons: {
            "Aceptar": function () {
                $(this).dialog("close");
            }
        }
    }); 
} else {
    //Se verifica que el navegador soporte windows.FormData , para el envio de archivo excel
    if (window.FormData !== undefined) {
        alert("si lo soporte oe");
        var archivoExcelData = new FormData();
        var totalFiles = document.getElementById("cargarArchivo").files.length;
        for (var i = 0; i < totalFiles; i++) {
            var file = document.getElementById("cargarArchivo").files[i];

            archivoExcelData.append("cargarArchivo", file);
        }
        $.ajax({
            type: 'POST',
            url: "/Empleados/AnalisisArchivoExcel",
            data: archivoExcelData ,
            dataType: 'json',
            contentType: false,
            processData: false,
            statusCode: {
                401: function () {
                    MostrarMensajeSinPermiso();
                },
                200: function (data, status, xhr) {
                    var expirado = xhr.getResponseHeader('Expires');
                    if (expirado == "-1") {
                        MostrarMensajeSessionExpirada();
                    } else {
                        alert("volvi");
                    }
                }
            }
        });
    }else {
        mensajeDialogo = "Su navegador no soporta envio de archivos <br>Porfavor actualize su navegador";
        $('<div>' + mensajeDialogo + "</div>").dialog({
            scriptCharset: "utf-8",
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            draggable: false,
            modal: true,
            resizable: false,
            width: 'auto',
            title: 'Error',
            buttons: {
                "Aceptar": function () {
                    $(this).dialog("close");
                }
            }
        });    
    }
}};

这在控制器上:

 [HttpPost]
 public void AnalisisArchivoExcel()
 {
    for (int i = 0; i < Request.Files.Count; i++)
    {
        var file = Request.Files[i];
        var fileName = Path.GetFileName(file.FileName);            
        string fileContentType = file.ContentType;
        byte[] fileBytes = new byte[file.ContentLength];
        var data = file.InputStream.Read(fileBytes, 0, 
        Convert.ToInt32(file.ContentLength));
   }
}

“数据”变量,只显示数字,别无其他,我需要读取该文件以获取数据

1 个答案:

答案 0 :(得分:0)

如果您想阅读Excel文档及其单元格,并且碰巧安装了启用OLEDB的SQL Server,则可以直接阅读excel文档并将其转换为数据表

例如这个问题:Reading excel file using OLEDB Data Provider

请注意它如何通过更改提供程序类型来处理xls和xlsx文件

编辑: 我记得我以前做过的一个项目,并找到了它,所以这是您需要的所有代码

            DataTable dt = new DataTable();

            string connStr = "";
            if (fileExtension == ".xls")
            {
                connStr = string.Format(String.Format("provider=Microsoft.Jet.OLEDB.4.0;Data Source='{0}';Extended Properties='Excel 8.0;IMEX=1;';", FullFilePath), FullFilePath, true);
            }
            else
            {
                connStr = string.Format(String.Format("provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';Extended Properties='Excel 12.0;IMEX=1;';", FullFilePath), FullFilePath, true);
            }

            using (OleDbConnection dbConn = new OleDbConnection(connStr))
            {
                if (System.IO.File.Exists(FullFilePath))
                {
                    dbConn.Open();
                    DataTable dtSchema = dbConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    OleDbCommand dbCmd = new OleDbCommand(String.Format("SELECT * FROM [{0}]", dtSchema.Rows[0]["TABLE_NAME"]), dbConn);
                    OleDbDataAdapter dbAdp = new OleDbDataAdapter(dbCmd);

                    try
                    {
                        dbAdp.Fill(dt);
                    }
                }
            }

其中FullFilePath是您的xls / x文件的正确路径