You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core MVC:如何在入库前将Excel数据展示到HTML表格

ASP.NET Core 6 MVC实现Excel预览后入库

需求说明

用户选择本地的student.xlsx文件后,点击「Show Data」按钮,无需页面刷新即可将Excel中的数据展示到页面的HTML表格中;确认数据无误后,再提交数据到数据库入库。

现有代码

Model

public class Students
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int AdmissionYear { get; set; }
    public string RegistrationNo { get; set; }
}

Controller(原代码修正版)

public async Task<IActionResult> Upload(IFormFile file)
{
    if (file == null)
    {
        return RedirectToAction(nameof(Index));
    }
    List<Students> studentList = new List<Students>(); // 修正原代码泛型类型错误
    
    using(var memoryStream = new MemoryStream())
    {
        await file.CopyToAsync(memoryStream).ConfigureAwait(false);
        using(var package = new ExcelPackage(memoryStream))
        {
            var worksheet = package.Workbook.Worksheets[0];
            if (worksheet.Dimension != null && worksheet.Dimension.Rows > 0 && worksheet.Dimension.Columns > 0)
            {
                for (int row = 2; row <= worksheet.Dimension.Rows; row++)   // 从第2行开始跳过表头
                {
                    Students student = new Students();
                    student.FirstName = worksheet.Cells[row, 1].Value?.ToString() ?? string.Empty;
                    student.LastName = worksheet.Cells[row, 2].Value?.ToString() ?? string.Empty;
                    // 处理AdmissionYear转换失败的情况
                    int.TryParse(worksheet.Cells[row, 3].Value?.ToString(), out int admissionYear);
                    student.AdmissionYear = admissionYear;
                    student.RegistrationNo = worksheet.Cells[row, 4].Value?.ToString() ?? string.Empty;
                    studentList.Add(student);
                }
            }
        }
    }
    return View("Index", studentList);
}

View(原代码优化版)

<div class="form-group">
    <label name-for="file">Excel xlsx Upload</label>
    <input type="file" name="file" id="excelFile" accept=".xlsx" />      
</div>
<input type="button" name="display" value="Show Data" id="btnShow" class="btn btn-primary" />
<input type="button" name="submit" value="Submit to DB" id="btnSubmit" class="btn btn-success" style="display:none;" />

<table id="example1" class="table table-bordered table-striped">
    <thead>
    <tr>
        <th class="table-head">
           <input type="checkbox" onchange="checkAll(this)" name="chk[]" />
        </th>
        <th>First Name</th>
        <th>Last Name</th>
        <th>AdmissionYear</th>
        <th>RegistrationNo</th>
    </tr>
    </thead>
    <tbody id="studentTableBody">
        <tr>
            <td valign="middle" align="center" style="width: 2%;">
                <input type="checkbox" onchange="checkSingle(this)" name="chk[]" />
            </td>
            <td></td>
            <td></td>
            <td> </td>
            <td></td>
        </tr>
    </tbody>
</table>

实现步骤

1. 修改Controller,新增预览和入库接口

在原Controller中添加两个Action:一个用于处理Excel文件并返回预览数据的JSON接口,另一个用于接收选中的学生数据并入库。

// 预览Excel数据的接口
[HttpPost]
public async Task<IActionResult> PreviewExcel(IFormFile file)
{
    if (file == null || file.Length == 0 || !file.FileName.EndsWith(".xlsx"))
    {
        return BadRequest("请选择有效的.xlsx文件");
    }
    
    List<Students> studentList = new List<Students>();
    
    using(var memoryStream = new MemoryStream())
    {
        await file.CopyToAsync(memoryStream).ConfigureAwait(false);
        using(var package = new ExcelPackage(memoryStream))
        {
            var worksheet = package.Workbook.Worksheets[0];
            if (worksheet.Dimension != null && worksheet.Dimension.Rows > 1) // 确保有数据行
            {
                for (int row = 2; row <= worksheet.Dimension.Rows; row++)
                {
                    Students student = new Students();
                    student.FirstName = worksheet.Cells[row, 1].Value?.ToString() ?? string.Empty;
                    student.LastName = worksheet.Cells[row, 2].Value?.ToString() ?? string.Empty;
                    int.TryParse(worksheet.Cells[row, 3].Value?.ToString(), out int admissionYear);
                    student.AdmissionYear = admissionYear;
                    student.RegistrationNo = worksheet.Cells[row, 4].Value?.ToString() ?? string.Empty;
                    studentList.Add(student);
                }
            }
        }
    }
    
    return Json(new { success = true, data = studentList });
}

// 提交数据入库的接口
[HttpPost]
public async Task<IActionResult> SubmitStudents(List<Students> selectedStudents)
{
    if (selectedStudents == null || selectedStudents.Count == 0)
    {
        return BadRequest("请选择要提交的学生数据");
    }
    
    // 替换为实际入库逻辑,例如使用EF Core
    // _context.Students.AddRange(selectedStudents);
    // await _context.SaveChangesAsync();
    
    return Json(new { success = true, message = "数据提交成功" });
}

2. 前端添加AJAX逻辑,实现预览和提交

在View底部添加JavaScript代码,实现按钮的交互功能:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$(document).ready(function() {
    // Show Data按钮点击事件
    $("#btnShow").click(function() {
        var file = $("#excelFile")[0].files[0];
        if (!file) {
            alert("请先选择Excel文件");
            return;
        }
        
        var formData = new FormData();
        formData.append("file", file);
        
        $.ajax({
            url: "@Url.Action("PreviewExcel")",
            type: "POST",
            data: formData,
            contentType: false,
            processData: false,
            success: function(response) {
                if (response.success) {
                    // 清空表格原有内容
                    $("#studentTableBody").empty();
                    
                    // 动态生成表格行
                    $.each(response.data, function(index, student) {
                        var row = `<tr data-index="${index}">
                            <td valign="middle" align="center" style="width: 2%;">
                                <input type="checkbox" class="studentChk" name="chk[]" value="${index}" />
                            </td>
                            <td>${student.firstName}</td>
                            <td>${student.lastName}</td>
                            <td>${student.admissionYear}</td>
                            <td>${student.registrationNo}</td>
                            <!-- 隐藏域存储学生数据,方便提交 -->
                            <input type="hidden" class="studentData" value='${JSON.stringify(student)}' />
                        </tr>`;
                        $("#studentTableBody").append(row);
                    });
                    
                    // 显示提交按钮
                    $("#btnSubmit").show();
                } else {
                    alert("预览失败:" + (response.message || "未知错误"));
                }
            },
            error: function(xhr) {
                alert("请求出错:" + xhr.responseText);
            }
        });
    });
    
    // Submit to DB按钮点击事件
    $("#btnSubmit").click(function() {
        var selectedStudents = [];
        
        // 收集选中的学生数据
        $(".studentChk:checked").each(function() {
            var studentData = $(this).closest("tr").find(".studentData").val();
            selectedStudents.push(JSON.parse(studentData));
        });
        
        if (selectedStudents.length == 0) {
            alert("请选择要提交的学生");
            return;
        }
        
        $.ajax({
            url: "@Url.Action("SubmitStudents")",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify(selectedStudents),
            success: function(response) {
                if (response.success) {
                    alert(response.message);
                    // 提交成功后重置页面状态
                    $("#studentTableBody").empty();
                    $("#excelFile").val("");
                    $("#btnSubmit").hide();
                } else {
                    alert("提交失败:" + response.message);
                }
            },
            error: function(xhr) {
                alert("提交出错:" + xhr.responseText);
            }
        });
    });
    
    // 全选/取消全选逻辑
    window.checkAll = function(checkbox) {
        $(".studentChk").prop("checked", checkbox.checked);
    };
    
    // 单个复选框点击逻辑,更新全选框状态
    window.checkSingle = function(checkbox) {
        var allChecked = $(".studentChk").length == $(".studentChk:checked").length;
        $("input[name='chk[]']:first").prop("checked", allChecked);
    };
});
</script>

3. 关键注意事项

  • 确保项目已安装EPPlus NuGet包(用于Excel解析),可通过NuGet包管理器直接安装。
  • 入库逻辑需根据实际数据库框架修改,例如使用Entity Framework Core时,需注入DbContext并完成数据持久化操作。
  • 可增加更多数据校验逻辑,比如Excel单元格为空、数据格式不符合要求的情况,避免前端或后端报错。

内容的提问来源于stack exchange,提问作者Ayobamilaye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 05:01:06