【问题标题】:Fast split excel file by value in c#在c#中按值快速拆分excel文件
【发布时间】:2014-10-23 11:31:44
【问题描述】:

我需要按选定的行拆分 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 行需要一个小时。你知道如何提高这段代码的速度吗?

【问题讨论】:

  • 先复制整个文件N次,然后删除每个文件中不需要的行怎么样?
  • 还是太费时间了,我要241个文件
  • 为什么需要这样做?为什么您将所有数据存储在 1 个电子表格中,而您似乎真的希望按照某些标准对其进行拆分?
  • 这不是我的文件。我只是让它分裂。
  • 您正在使用哪个版本的 excel?使用 OpenXML 甚至 ClosedXML API。它会比互操作服务快得多...closedxml.codeplex.com/…

标签: c# excel split


【解决方案1】:

尝试使用 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))
{       
    // ...
}

【讨论】:

  • 这是一个excel文件的连接,怎么解决的?
  • OP需要处理一堆文件,在这种情况下自动化不是办法,这就是为什么我建议使用oledb来完成这个任务。
【解决方案2】:

我很确定会节省 o(n) 次并做 worksheet.Range["A1"].EntireRow.Copy();每次都没有必要。真的看不出其中一些变量名是什么。

但是使用Stopwatch,您可以自己弄清楚为什么要花这么长时间。

【讨论】:

    猜你喜欢
    • 2022-11-14
    • 2014-04-10
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2010-10-05
    • 2019-04-30
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多