使用oleDbCommand在C#中将行插入Excel电子表格的更快捷方式?

时间:2017-07-28 14:32:22

标签: c# excel aspose

所以我正在寻找一种更快的插入方法到服务器上的电子表格中。现在它取决于所使用的数据,但在单个电子表格中插入100行需要大约20秒。我理解它为什么这样做,因为插入电子表格会导致excel在每次插入新行时移动行。因此,添加到单个电子表格的行越多,所需的时间就越长。我测试了这个理论并且它是正确的,我创建了大约100个电子表格并随机插入1000行遍布它们。这需要大约60秒才能完成。将相同的1000行插入单个电子表格需要5分钟才能完成。以下是我的代码:

 string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;" +
                            "Data Source={0};Extended Properties='Excel 12.0;HDR=YES'", file);
            Aspose.Cells.Workbook wb = new Aspose.Cells.Workbook(fileTemplate);
            Aspose.Cells.WorksheetCollection sheets = wb.Worksheets;
            Aspose.Cells.Worksheet sheet = wb.Worksheets[0];

        wb.Save(file);

            combinedCount = 0;
            counter = 0;
            foreach (DataRowView drv in view)//check each row in our simplified view for ebid
            {
                if (combinedList[combinedCount][1] == "") //if its empty it goes into brandies sheet
                {

                    sheet.Cells.InsertRow(2);
                    using (OleDbConnection cn = new OleDbConnection(connectionString))
                    {
                        cn.Open();
                        OleDbCommand cmd1 = new OleDbCommand("INSERT INTO [" + combinedList[combinedCount][0] + "$] " + //"+sheetCnt+"
                             "([Reporting Retailer EBID],[Outlet BASF ID],[Retailer OT],[Mapped Grower ID],[Mapped Grower],[Ship To Grower],[Bill To Grower],[Transaction ID],[Product ID],[Product Description],[Quantity],[Invoice No],[Previously Sent],[Comments])" +
                             "VALUES(@value1,@value2,@value3,@value4,@value5,@value6,@value7,@value8,@value9,@value10,@value11,@value12,@value13,@value14)", cn);
                        cmd1.Parameters.AddWithValue("@value1", drv[0]);//retailer ebid
                        cmd1.Parameters.AddWithValue("@value2", drv[1]);//outlet basf
                        cmd1.Parameters.AddWithValue("@value3", drv[13]);//retailer ot
                        cmd1.Parameters.AddWithValue("@value4", drv[2]);//mapped g id
                        cmd1.Parameters.AddWithValue("@value5", drv[10]);//mapped g
                        cmd1.Parameters.AddWithValue("@value6", drv[11]);//ship to g
                        cmd1.Parameters.AddWithValue("@value7", drv[12]);//bill to g
                        cmd1.Parameters.AddWithValue("@value8", drv[3]);//trans id
                        cmd1.Parameters.AddWithValue("@value9", drv[4]);//prod id
                        cmd1.Parameters.AddWithValue("@value10", drv[5]);//prod desc
                        cmd1.Parameters.AddWithValue("@value11", drv[6]);//quantity
                        cmd1.Parameters.AddWithValue("@value12", drv[7]);//invoice no
                        cmd1.Parameters.AddWithValue("@value13", drv[8]);//prev sent
                        cmd1.Parameters.AddWithValue("@value14", drv[9]);//comments
                        cmd1.ExecuteNonQuery();
                        cn.Close();
                    }
                }
            }

2 个答案:

答案 0 :(得分:0)

好吧,如果您需要将数据从某些数据源(例如DataTable,Arrays,List等)导入MS Excel工作表或从工作表导出数据以一次性填充DataTable或数组等,那么您可以尝试相关的Aspose.Cells API(这些API很有效)。您应该检查Cells类的特定方法(例如Cells.ImportDataTable,Cells.ExportDataTable等 - 还有一些其他有用的方法。)。此外,您的数据表将以这样的方式插入,以便相应地在表格下移动其他内容。

1)查看将数据表导入工作表的代码行:

//Importing the contents of DataTable to the worksheet starting from "A1" cell,
//where true specifies that the column names of the DataTable would be added to
//the worksheet as a header row
worksheet.Cells.ImportDataTable(dataTable, true, "A1");

2)同样,请参阅从工作表导出数据以填充DataTable的示例代码段:

//Exporting the contents of first 7 rows and 2 columns (A1:B7) starting from 1st cell to DataTable
DataTable dataTable = worksheet.Cells.ExportDataTable(0, 0, 7, 2, true);

我是Aspose的开发人员/传播者。

答案 1 :(得分:0)

我想出了如何极大地减少它。正如我之前所说,插入函数会在处理大型数据集时导致拥塞。因此,定位每个单元格并使用putvalue函数。例如:

                combinedCount = 0;
                counter = 0;
                int testCount = 2;
                foreach (DataRowView drv in view)
                   {
                        if (combinedCount != 0)//if its the first one, there is nothing to compare it to
                        {
                            if (combinedList[combinedCount - 1][0] == combinedList[combinedCount][0])//look at the previous one to check if its the same as the one before it, because we dont want to increment it everytime else it will increment on a different and empty page
                            {
                                testCount++;
                            }
                            else
                            {
                                testCount = 2; //2 is where our first row starts on each page
                            }
                        }
                        else { }
                           Aspose.Cells.Worksheet sheet = wb.Worksheets[combinedList[combinedCount][0]];
                           Aspose.Cells.Cell cell1 = sheet.Cells["A" + testCount];
                           Aspose.Cells.Cell cell2 = sheet.Cells["B" + testCount];
                           Aspose.Cells.Cell cell3 = sheet.Cells["C" + testCount];
                           Aspose.Cells.Cell cell4 = sheet.Cells["D" + testCount];
                           Aspose.Cells.Cell cell5 = sheet.Cells["E" + testCount];
                           Aspose.Cells.Cell cell6 = sheet.Cells["F" + testCount];
                           Aspose.Cells.Cell cell7 = sheet.Cells["G" + testCount];
                           Aspose.Cells.Cell cell14 = sheet.Cells["N" + testCount];
                           Aspose.Cells.Cell cell15 = sheet.Cells["O" + testCount];
                           Aspose.Cells.Cell cell16= sheet.Cells["P" + testCount];
                           Aspose.Cells.Cell cell17 = sheet.Cells["Q" + testCount];
                           Aspose.Cells.Cell cell18 = sheet.Cells["R" + testCount];
                           Aspose.Cells.Cell cell19 = sheet.Cells["S" + testCount];
                           Aspose.Cells.Cell cell20 = sheet.Cells["T" + testCount];

                           cell1.PutValue(drv[0]);
                           cell2.PutValue(drv[1]);
                           cell3.PutValue(drv[13]);
                           cell4.PutValue(drv[2]);
                           cell5.PutValue(drv[10]);
                           cell6.PutValue(drv[11]);
                           cell7.PutValue(drv[12]);
                           cell14.PutValue(drv[3]);
                           cell15.PutValue(drv[4]);
                           cell16.PutValue(drv[5]);
                           cell17.PutValue(drv[6]);
                           cell18.PutValue(drv[7]);
                           cell19.PutValue(drv[8]);
                           cell20.PutValue(drv[9]);  

}

这有点草率但你明白了。 60秒以上下降到40秒,25秒下降到15秒。虽然仍然没有快速闪电,但插入电子表格永远不会超快。

我发现另一个将运行时间缩短到一位数的问题是保存功能。我从foreach循环中删除了保存并将其放在外面,它仍然可以正常保存。