根据值从表中创建组/块

Posted

技术标签:

【中文标题】根据值从表中创建组/块【英文标题】:Creating groups/blocks from table based on value 【发布时间】:2018-11-14 14:26:33 【问题描述】:

我在 datagridview 中有input table(输出显示为绿色),我需要得到这个输出:

'Start of block'   'Size'  'TypKar'
 1.2.2017 0:00:02   14      6280
 1.2.2017 0:03:33    2      3147
 1.2.2017 0:04:17    2      4147
 1.2.2017 0:04:28    2      6280
 1.2.2017 0:04:59   10      3147

现在我使用for 循环,我在其中写入第一个条目,然后我计数直到TypKar 列中的值发生变化。当它改变时,我写下日期和类型并从 1 开始计数。

for(int i = 0; i < dviewExport.RowCount; i++)

    //first line in excel
    if(totalCount == 0) 
    
        totalCount = 32; 
        signCount = 1;
        excelWsExport.Cells[totalCount, 2] = (DateTime)dviewExport[0, i].Value;
        excelWsExport.Cells[totalCount, 3] = 1;
        excelWsExport.Cells[totalCount, 4] = dviewExport["TypKar", i].Value;
        continue;
    
    //value is same = just increment
    if((excelWsExport.Cells[totalCount, 4] as Excel.Range).Value.ToString() == dviewExport["TypKar", i].Value.ToString())
    
        excelWsExport.Cells[totalCount, 3] = (excelWsExport.Cells[totalCount, 3] as Excel.Range).Value + 1;
        signCount++;
        if(maxCount < signCount)
            maxCount = signCount;
    
    //value changed = write new line and restart incrementing
    else
    
        totalCount++;
        signCount = 1;
        excelWsExport.Cells[totalCount, 2] = (DateTime)dviewExport[0, i].Value;
        excelWsExport.Cells[totalCount, 3] = 1;
        excelWsExport.Cells[totalCount, 4] = dviewExport["TypKar", i].Value;
    

问题是,我把它写到 excel 中,当数据有几千行时,它需要很多时间。

是否可以使用 excel interop 加快速度 - 将其写入数组,然后将数组粘贴到 excel / sql / ling还有什么

我试图找到类似的问题并得到一些答案,但我不知道如何描述我的问题。

【问题讨论】:

你有没有想过使用 Parallel.For 循环,我最近做了类似的事情,并将我的运行时间从 35 分钟减少到 5 分钟 docs.microsoft.com/en-us/dotnet/standard/parallel-programming/…。顺序似乎并不重要,所以这应该适合你 这与 Microsoft Access 有什么关系? Excel Interop 只能减慢事物至少一个数量级,因为每个调用都是跨进程调用。如果要生成 Excel 文件,也不需要 DataGridView。您可以使用 EPPlus 之类的库来创建真正的 Excel 文件,而无需使用 Excel。例如,将 DataTable 加载到工作表中就像 sheet.Cells.LoadFromDataTable(dataTable); 一样简单 @Andrei 这根本没有帮助。您不能像这样从多个客户端/线程访问同一个 Excel 实例 我加载到 dgv 的数据来自 Access db 或 SQL Server。另外我必须将它发送到excel,因为之后的下一步工作 【参考方案1】:

在我现在正在开发的一个应用程序中,我使用了类似的东西:

string connectionString = "my connection string";



            for (int i = 0; i < dataGridView1.RowCount - 1; i++)
            
                DataGridViewRow row = dataGridView1.Rows[i];

                SqlConnection conn = new SqlConnection(connectionString);
                conn.Open();

                try
                

                    var queryString = "INSERT INTO [SQLdb] " +
                        "(columnNamesInDB) " +
                        "VALUES (@dataBeingRead)";
                    SqlCommand comm = new SqlCommand(queryString, conn);
                    comm.ExecuteNonQuery();
                    comm.Close();
                  
catch (Exception e)

//catch behavior

遍历网格视图中的每个值并插入 SQL 服务器。对于我们的目的来说工作得很快(目前约 1000 范围)。

【讨论】:

问题是不是关于存储到数据库的。【参考方案2】:

基于Export a C# List of Lists to Excel,我设法通过创建通用列表来加快速度,然后将其粘贴到二维对象列表中,然后将这些创建的列表添加到 Excel 范围内。这比每次写入 excel 单元格要快得多。

问题是 Excel 不喜欢 List&lt;T&gt;list[]。你必须发送到 excel object[,](二维),因为我只有一个维度,所以我做了第二个维度 1。

//create generic lists
List<DateTime> listDate = new List<DateTime>();                                     
List<int> listSize = new List<int>();                                       
List<string> listSign = new List<string>();                                     

//fill lists with data from wherever
for(int i = 0; i < dviewExport.RowCount; i++)                                       
                                       
    if(listSign.Count == 0)                             
                                   
        signCount = 1;                          
        listDate.Add((DateTime)dviewExport[0, i].Value);                            
        listSize.Add(1);                            
        listSign.Add((string)dviewExport[$"Sign", i].Value);                      
        continue;                           
                                   
    if(listSign[listSign.Count - 1] == dviewExport[$"Sign", i].Value.ToString())                              
                                   
        listSize[listSize.Count - 1] += 1;                          
        signCount++;                            
        if(maxCount < signCount)                            
            maxCount = signCount;                       
                                   
    else                                
                                   
        signCount = 1;                          
        listDate.Add((DateTime)dviewExport[0, i].Value);                            
        listSize.Add(1);                            
        listSign.Add((string)dviewExport[$"Sign", i].Value);                          
                                   
       

//create two dimensional object lists with size of generic lists
object[,] outDate = new object[listDate.Count, 1];                                      
object[,] outSize = new object[listSize.Count, 1];                                      
object[,] outSign = new object[listSign.Count, 1];                                      

//fill two dimensional object lists with data from generic lists
for(int row = 0; row < listDate.Count; row++)

    outDate[row, 0] = listDate[row];                                    
    outSize[row, 0] = listSize[row];                                    
    outSign[row, 0] = listSign[row];
                           

//set Excel ranges and paste lists
range = excelWsExport.get_Range($"B32:B32 + listDate.Count", Type.Missing);                                       
range.NumberFormat = "d.MM.yyyy H:mm:ss";                                       
range.Value = outDate;                                      

range = excelWsExport.get_Range($"C32:C32 + listSize.Count", Type.Missing);                                       
range.Value = outSize;                                      

range = excelWsExport.get_Range($"D32:D32 + listSign.Count", Type.Missing);                                       
range.Value = outSign;                                      

【讨论】:

以上是关于根据值从表中创建组/块的主要内容,如果未能解决你的问题,请参考以下文章

根据搜索值从表排序中检索数据??/

根据先前的值从表中删除行

jquery根据选择值从表中填充文本输入

在 ASmack 中创建组

在 SQL 中创建组 ID

如何在 django 中创建组权限