【问题标题】:split one big datatable to two separated datatables将一个大数据表拆分为两个单独的数据表
【发布时间】:2011-06-20 01:45:13
【问题描述】:

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

所以..

我如何将一个大数据表分成两个数据表,也许用 Linq ?

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

真诚的 啊

【问题讨论】:

  • Excel 2007 及以上版本支持 1048576 行
  • {在此处插入关于 1048576 行电子表格可用性的强制性说明}
  • 哦,我不知道:PowerPivot 就是这样做的! :)
  • 有人对这个问题有任何想法吗?我需要解决方案。请帮助我。

标签: linq excel datatable dataset split


【解决方案1】:

假设您从某个数据库中获取此 DataTable 的 90,000 行,最有效的方法是将您的 SELECT 语句修改为两个新的 SELECT 语句,每个语句返回

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:
       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 中锻炼过

      【讨论】:

        【解决方案4】:

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

        这应该可行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-11
          • 1970-01-01
          • 1970-01-01
          • 2013-12-13
          • 1970-01-01
          • 2013-08-04
          • 2013-08-06
          相关资源
          最近更新 更多