разделить один большой набор данных на два отдельных набора данных - PullRequest
2 голосов
/ 02 февраля 2011

Я экспортирую таблицы данных в книгу Excel. Проблема в том, что таблица данных содержит 90000 строк, а в Excel может храниться только 67000 строк на каждом листе.

Так ..

Как я могу разделить один большой набор данных на два, возможно с Linq?

Тогда у меня может быть datatable1 в листе1 и datatable2 в листе2

Sincerly аг

Ответы [ 4 ]

0 голосов
/ 04 января 2016

DataTable [] splittedtables = dt.AsEnumerable () .Select ((строка, индекс) => new {строка, индекс}) .GroupBy (x => x.index / Ввод от пользователя )// целочисленное деление, дробная часть усекается .Select (g => g.Select (x => x.row) .CopyToDataTable ()) .ToArray ();

Это должно работать.

0 голосов
/ 18 февраля 2011

Разделите ваш набор записей. Выполните один SELECT, который извлекает все 90 000 строк, и разбейте его на шаге импорта Excel.

0 голосов
/ 06 января 2012
 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

0 голосов
/ 02 февраля 2011

Предполагая, что вы получаете 90 000 строк для этого DataTable из базы данных где-то, наиболее эффективным подходом было бы преобразование вашего оператора SELECT в два новых оператора SELECT, каждый из которых возвращает <67 000 строк, а затем все остальное то же самое. </p>

...