将一个大数据表拆分为两个独立的数据表

时间:2011-02-02 15:40:30

标签: linq excel datatable dataset split

我正在将数据表导出到Excel工作簿。问题是数据表包含90000行,而excel在每张表中只能容纳67000行。

所以..

如何将一个大数据表划分为两个数据表,可能是Linq?

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

诚恳 AGH

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

拆分记录集。执行一个提取所有90,000行的SELECT,并在Excel导入步骤中将其拆分。

答案 2 :(得分:0)

 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
}

克隆 - 使用原始列结构创建表格的最快方法是克隆方法。

导出到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中工作了

答案 3 :(得分:0)

DataTable [] splittedtables = dt.AsEnumerable()                .Select((row,index)=&gt; new {row,index})                .GroupBy(x =&gt; x.index / 用户输入)//整数除法,小数部分被截断                .Select(g =&gt; g.Select(x =&gt; x.row).CopyToDataTable())                .ToArray();

这应该有用。