如何实现DataTable选中行导出为单独文本文件?
实现DataTable选中行导出为独立文本文件
当前代码会导出DataTable的所有行,需调整为仅导出用户选中的行,以下是具体修改方案:
一、修改View代码(实现行选择与选中数据提交)
- 恢复复选框列,绑定每行的唯一标识(以
SEQUEN字段作为主键示例) - 添加全选/取消全选功能,优化用户操作体验
- 提交表单前收集选中行的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代码(仅处理选中的行)
- 改为
HttpPost方法接收选中行ID列表 - 根据ID筛选数据,避免查询全表提升效率
- 循环导出选中行到独立文本文件,增加文件夹存在性检查
修改后的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
相关产品推荐
相关产品推荐

