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

如何实现DataTable选中行导出为单独文本文件?

实现DataTable选中行导出为独立文本文件

当前代码会导出DataTable的所有行,需调整为仅导出用户选中的行,以下是具体修改方案:

一、修改View代码(实现行选择与选中数据提交)

  1. 恢复复选框列,绑定每行的唯一标识(以SEQUEN字段作为主键示例)
  2. 添加全选/取消全选功能,优化用户操作体验
  3. 提交表单前收集选中行的ID,通过隐藏字段传递到后台

修改后的View代码:

<table id="example" class="display" style="width:100%">
    <thead>
        <tr>
            <th><input type="checkbox" id="selectAll" /></th>
            <th>DATE</th>
            <th>ORDBUS</th>
            <th>ORDSER</th>
            <th>SEQUEN</th>
            <th>HEUDEB</th>
            <th>HEUFIN</th>
            <th>Actions</th>
        </tr>
    </thead>
    <tbody>
        @foreach (DataRow row in Model.Tables[0].Rows)
        {
            <tr class="active-row">
                <td><input type="checkbox" class="row-checkbox" value="@row["SEQUEN"]" /></td>
                <td>@row["DATMVT"]</td>
                <td>@row["ORDBUS"]</td>
                <td>@row["ORDSER"]</td>
                <td>@row["SEQUEN"]</td>
                <td>@row["HEUDEB"]</td>
                <td>@row["HEUFIN"]</td>
                <td>
                    <button type="button" class="btn btn-primary">EDIT</button>
                </td>
            </tr>
        }
    </tbody>
</table>

@using (Html.BeginForm("ConvertToTextfile", "Display", FormMethod.Post))
{
    <input type="hidden" id="selectedRows" name="selectedRows" />
    <input type="submit" value="导出选中行" class="btn btn-success" id="btnExport" />
}

<script>
    // 全选/取消全选逻辑
    $("#selectAll").click(function() {
        $(".row-checkbox").prop("checked", $(this).prop("checked"));
    });

    // 提交前收集选中行ID
    $("#btnExport").click(function(e) {
        var selectedIds = [];
        $(".row-checkbox:checked").each(function() {
            selectedIds.push($(this).val());
        });

        if (selectedIds.length === 0) {
            alert("请至少选择一行");
            e.preventDefault();
            return;
        }

        $("#selectedRows").val(selectedIds.join(","));
    });
</script>

二、修改Controller代码(仅处理选中的行)

  1. 改为HttpPost方法接收选中行ID列表
  2. 根据ID筛选数据,避免查询全表提升效率
  3. 循环导出选中行到独立文本文件,增加文件夹存在性检查

修改后的Controller代码:

[HttpPost]
public ActionResult ConvertToTextfile(string selectedRows)
{
    if (string.IsNullOrEmpty(selectedRows))
    {
        return Content("未选择任何行");
    }

    string[] selectedIds = selectedRows.Split(',');
    string connect = System.Configuration.ConfigurationManager.AppSettings["dsn_AS400"];
    string conn_string = connect + "UID=" + HttpContext.Session["Username"] + ";PWD=" + HttpContext.Session["Password"] + ";";

    db_tools.sg_connStr = conn_string;
    connection = db_tools.Connect();

    // 仅查询选中的行(需根据实际主键字段调整)
    string mySQL = $"SELECT * FROM MOUVEMSSE.Mouvem11 WHERE SEQUEN IN ({string.Join(",", selectedIds)})";
    DataTable table = db_tools.ExecuteSelectCommand(mySQL, CommandType.Text);

    string folderLocation = @"C:\Users\zarai\source\repos\Sms_Chauffeur\Sms_Chauffeur\Extractedfiles";
    if (!Directory.Exists(folderLocation))
    {
        Directory.CreateDirectory(folderLocation);
    }

    for (int i = 0; i < table.Rows.Count; i++)
    {
        // 用主键作为文件名后缀,避免重复
        string fileName = Path.Combine(folderLocation, $"File-{table.Rows[i]["SEQUEN"]}.txt");
        string contents = "";
        foreach (DataColumn col in table.Columns)
        {
            contents += table.Rows[i][col].ToString() + "    ";
        }
        System.IO.File.WriteAllText(fileName, contents);
    }

    return Content("选中行已成功导出");
}

关键优化点

  • 复选框选择逻辑直观易用,兼容常规表格操作
  • 后台通过IN语句精准筛选数据,减少不必要的数据库查询
  • 文件名绑定主键字段,避免生成重复文件
  • 添加文件夹存在性检查,防止导出失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:15:38