如何用LINQ排除指定列复制生成新DataTable?
嘿,我来给你梳理几个实用的方案,既能搞定基于筛选列创建新DataTable的需求,也给你聊聊生成Excel的更优选择:
基于筛选列创建新DataTable的方法
方法一:适配你已有的列列表,手动构建新表
既然你已经通过LINQ拿到了要保留的列列表,直接用它来搭建新表就好,步骤很清晰:
- 新建一个空的
DataTable实例 - 把筛选后的列逐一添加到新表中(保留原列的数据类型)
- 遍历原表的每一行,将对应列的数据复制到新表的行里
代码示例:
// 你已经获取到的目标列列表 var columns = dt1.Columns.Cast<DataColumn>().Where(c => c.ColumnName != "ID").ToList(); // 创建新的DataTable DataTable newDt = new DataTable(); // 添加筛选后的列 foreach (var col in columns) { newDt.Columns.Add(col.ColumnName, col.DataType); } // 复制原表的行数据到新表 foreach (DataRow row in dt1.Rows) { DataRow newRow = newDt.NewRow(); foreach (var col in columns) { newRow[col.ColumnName] = row[col.ColumnName]; } newDt.Rows.Add(newRow); }
方法二:更简洁的「复制-移除」方式
如果你的需求只是排除少数列(比如只排除ID),其实可以先复制原表,再直接移除不需要的列,代码更短更直观:
DataTable newDt = dt1.Copy(); newDt.Columns.Remove("ID");
这种方式省去了LINQ筛选列的步骤,适合排除列数量少的场景。
生成Excel的方案(含OpenXML及替代方案)
用OpenXML生成Excel(适配LoadFromDataTable)
拿到新的newDt之后,如果你用的是封装过的LoadFromDataTable工具类,直接导入数据即可;如果是原生OpenXML,手动实现数据映射也很简单:
using (SpreadsheetDocument document = SpreadsheetDocument.Create("output.xlsx", SpreadsheetDocumentType.Workbook)) { // 创建工作簿和工作表基础结构 WorkbookPart workbookPart = document.AddWorkbookPart(); workbookPart.Workbook = new Workbook(); WorksheetPart worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); worksheetPart.Worksheet = new Worksheet(new SheetData()); Sheets sheets = document.WorkbookPart.Workbook.AppendChild(new Sheets()); Sheet sheet = new Sheet() { Id = document.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" }; sheets.Append(sheet); // 将新DataTable的数据加载到工作表(模拟LoadFromDataTable的效果) var sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); // 写入表头 Row headerRow = new Row(); foreach (DataColumn col in newDt.Columns) { headerRow.AppendChild(new Cell(new CellValue(col.ColumnName))); } sheetData.AppendChild(headerRow); // 写入数据行 foreach (DataRow row in newDt.Rows) { Row excelRow = new Row(); foreach (var item in row.ItemArray) { excelRow.AppendChild(new Cell(new CellValue(item.ToString()))); } sheetData.AppendChild(excelRow); } }
更优替代方案:使用EPPlus库
如果你觉得OpenXML的API太繁琐,EPPlus绝对是更友好的选择,它对DataTable的支持非常直接,代码量少很多,还能轻松处理样式:
首先通过NuGet安装EPPlus包,然后:
using (var package = new ExcelPackage(new FileInfo("output.xlsx"))) { var worksheet = package.Workbook.Worksheets.Add("Sheet1"); // 直接加载DataTable,第二个参数true表示包含表头 worksheet.Cells["A1"].LoadFromDataTable(newDt, true); // 可选:给表头加个样式,让表格更美观 worksheet.Cells["A1:B1"].Style.Font.Bold = true; worksheet.Cells["A1:B1"].Style.Fill.PatternType = ExcelFillStyle.Solid; worksheet.Cells["A1:B1"].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray); package.Save(); }
日常处理Excel生成需求我更推荐EPPlus,开发效率比原生OpenXML高不少。
内容的提问来源于stack exchange,提问作者JoeyDiaz
相关产品推荐
相关产品推荐

