在c#中按值快速拆分excel文件

时间:2014-10-23 11:31:45

标签: c# excel split

我需要按选定的行拆分excel文件。我有相当多的排,所以用手分开花了太多时间。

 worksheet.Range["A1"].EntireRow.Copy();
                Microsoft.Office.Interop.Excel.Workbook nowy = excel.Workbooks.Add();
                Excel.Worksheet sh = nowy.Sheets.Add();
                sh.Name = "test";

                Excel.Range r = sh.get_Range("A1", "A1").EntireRow;
                r.Insert(Excel.XlInsertShiftDirection.xlShiftDown);
                int y;
                int limit=range.Rows.Count;
                for ( y= 2; y <= limit; y++)
                {
                   ile++;
                   worksheet.Range["A" + y].EntireRow.Copy();
                   Trace.Write(ile + ",");
                   r = sh.get_Range("A2", "A2").EntireRow;
                   r.Insert(Excel.XlInsertShiftDirection.xlShiftDown);

                    if (worksheet.Cells[y, x].value != worksheet.Cells[y+1, x].value)
                    {
                        osredu=worksheet.Cells[y, x].value;
                        string plik_ = "c:\\plikixml_dzielone\\" + osredu;
                        nowy.SaveAs(plik_,
                            System.Reflection.Missing.Value,
                            System.Reflection.Missing.Value,
                            System.Reflection.Missing.Value,
                            false,
                            false,
                            Excel.XlSaveAsAccessMode.xlShared,
                            false,
                            false,
                            System.Reflection.Missing.Value,
                            System.Reflection.Missing.Value,
                            System.Reflection.Missing.Value);
                        nowy.Close();
                        worksheet.Range["A1"].EntireRow.Copy();
                        nowy = excel.Workbooks.Add();
                        sh = nowy.Sheets.Add();
                        sh.Name = "test";
                        r = sh.get_Range("A1", "A1").EntireRow;
                        r.Insert(Excel.XlInsertShiftDirection.xlShiftDown);
                        Trace.WriteLine(Environment.NewLine);
                        Trace.WriteLine(ile_szkol+ "---"+ osredu + " : " + ile);
                        Trace.WriteLine(Environment.NewLine);
                        ile = 0;
                        ile_szkol++;
                    }

                }

我配对这段代码。它工作正常,但极其缓慢并锁定剪贴板使用。拆分超过9500行需要一个小时。您是否知道如何提高此代码的速度?

2 个答案:

答案 0 :(得分:0)

尝试使用OleDb驱动程序执行此任务。它应该比自动化更快。

string sourceConnectionString =
             @"Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0 XML;Data Source=C:\source\MyExcel.xlsx;";

using (var conn = new OleDbConnection(connectionString))
{       
    // ...
}

答案 1 :(得分:0)

我很确定能节省o(n)次并做workheet.Range [&#34; A1&#34;]。EntireRow.Copy();每次都没有必要。无法真正了解其中某些变量名称的含义。

然而,使用Stopwatch,你可以弄清楚自己花了这么长时间。