将一个大的数据表分成两个分开的数据表

我正在将数据表导出到Excel工作簿。 问题是,数据表保存90000行,excel只能在每个表中保存67000行。

所以..

我怎样才能将一个大的数据表分成两个数据表,也许与Linq?

然后我可以在sheet1中有datatable1,在sheet2中有datatable2

真是啊

假设你从某个数据库中获得这个DataTable的90,000行,最有效的方法是将你的SELECT语句修改为两个新的SELECT语句,每个语句返回<67,000行,然后执行其他所有操作。

拆分你的logging集。 执行一个提取全部90,000行的SELECT,然后在Excel导入步骤中将其拆分。

private List<DataTable> CloneTable(DataTable tableToClone, int countLimit)//Split function { List<DataTable> tables = new List<DataTable>(); int count = 0; DataTable copyTable = null; foreach (DataRow dr in tableToClone.Rows) { if ((count++ % countLimit) == 0) { copyTable = new DataTable(); copyTable = tableToClone.Clone(); copyTable.TableName = "Sample" + count; tables.Add(copyTable); } copyTable.ImportRow(dr); } return tables; } protected void LinkReport_Click(object sender, EventArgs e) { DataTable dt2 = (DataTable)ViewState["dtab"]; List<DataTable> dt1 = CloneTable(dt2, 5); DataSet ds = new DataSet("dst"); for (int i = 0; i < dt1.Count; i++) { ds.Tables.Add(dt1[i]); } string filePath = Server.MapPath("Reports/").ToString() + "master.xls"; FileInfo file = new FileInfo(filePath); if (file.Exists) { file.Delete(); } Export(ds, filePath);// Export into Excel } 

克隆 – 使用原始列结构创build表的最快方法是克隆方法。

导出到Excel

 private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; } finally { GC.Collect(); } } public void Export(DataSet ds, string filePath) { string data = null; string columnName = null; int i = 0; int j = 0; Excel.Application xlApp; Excel.Workbook xlWorkBook; //Excel.Worksheet xlWorkSheet; Excel.Worksheet xlWorkSheet = null; object misValue = System.Reflection.Missing.Value; Excel.Range range; xlApp = new Excel.ApplicationClass(); xlWorkBook = xlApp.Workbooks.Add(misValue); //xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); for (int l = 0; l < ds.Tables.Count; l++) { xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(l + 1); xlWorkSheet.Cells[1, 1] = "Report"; xlWorkSheet.get_Range("A1:D1", Type.Missing).Merge(Type.Missing); xlWorkSheet.get_Range("A1", "D1").Font.Bold = true; xlWorkSheet.Cells.Font.Name = "Courier New"; if (l == 0) { xlWorkSheet.Name = "Sheet1"; } else if (l == 1) { xlWorkSheet.Name = "Sheet2"; } else if (l == 2) { xlWorkSheet.Name = "Sheet3"; } else if (l == 3) { xlWorkSheet.Name = "Sheet4"; } else if (l == 4) { xlWorkSheet.Name = "Sheet5"; } for (i = 0; i <= ds.Tables[l].Rows.Count - 1; i++) { for (j = 0; j <= ds.Tables[l].Columns.Count - 1; j++) { columnName = ds.Tables[l].Columns[j].ColumnName.ToString(); xlWorkSheet.Cells[3, j + 1] = columnName; data = ds.Tables[l].Rows[i].ItemArray[j].ToString(); xlWorkSheet.Cells[i + 5, j + 1] = data; } } } //for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) //{ // for (j = 0; j <= ds.Tables[0].Columns.Count - 1; j++) // { // data = ds.Tables[0].Rows[i].ItemArray[j].ToString(); // xlWorkSheet1.Cells[i + 1, j + 1] = data; // } //} xlWorkBook.SaveAs(filePath, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); xlWorkBook.Close(true, misValue, misValue); xlApp.Quit(); // kill all excel processes Process[] pros = Process.GetProcesses(); for (int p = 0; p < pros.Length; p++) { if (pros[p].ProcessName.ToLower().Contains("excel")) { pros[p].Kill(); break; } } releaseObject(xlWorkSheet); releaseObject(xlWorkBook); releaseObject(xlApp); } 

试试这个..我已经在Visual Studio 2005中工作了

DataTable [] splittedtables = dt.AsEnumerable().Select((row,index)=> new {row,index}).GroupBy(x => x.index / Input From User )//整数除法,小数部分为truncated .Select(g => g.Select(x => x.row).CopyToDataTable()).ToArray();

这应该工作。