2017-09-26 60 views
0

我的腳本讀取Excel表並獲取一個範圍,該範圍包含不同媒體文件的名稱,我將其添加到一個大列表中。我使用列表中的名稱來搜索目錄,如果它們存在於給定的文件目錄中,那麼它們將被添加到「existsAlready」列表中。如果它們不存在於給定文件中,則位於copyFiles目錄中,然後將它們複製到給定目錄並添加到「existsAdded」列表中。如果在任一目錄中找不到它們,則將這些文件添加到「existsNegative」列表中。所有3個列表被打印到單獨的列表框。如何讓這個腳本讀取一個excel,然後找到並複製文件運行得更快?

這一切工作,但我發現它運行有點慢:

1)雖然Excel的應用程序是不可見的,但它仍然推出了一秒鐘,然後關閉,減速過程。

2)如果文件夾中存在所有文件或者文件需要複製,應用運行良好/快速,但是如果目錄中找不到許多文件且無法複製,則運行速度很慢,如何我可以做得更快嗎?我想這與它必須搜索整個目錄並且找不到任何東西有關。

  Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application(); 
      Microsoft.Office.Interop.Excel.Workbook excelWorkbook = excelApp.Workbooks.Open("@Excelfile"); 
      Excel.Worksheet xlWorkSheet = (Excel.Worksheet)excelWorkbook.Sheets[1]; 
      excelApp.Visible = false; 
      excelApp.ScreenUpdating = false; 
      excelApp.DisplayAlerts = false; 
      Excel.Range range = xlWorkSheet.get_Range(B1:G1); 



List<string> listFBX = new List<string>(); 

      foreach (Excel.Range s in range) 
      { 

       listFiles.Add(s.Text()); 

      } 

     List<string> existsAlready = new List<string>(); 
     List<string> existsAdded = new List<string>(); 
     List<string> existsNegative = new List<string>(); 


foreach (var item in listFiles) 
      { 




       string curFile = "X:\\Private\\DATA\\PROJECT DATA\\Database\\" + item; 
       string copyFrom = "X:\\Private\\DATA\\PROJECT DATA\\FilesToSearch" + item; 

      if (File.Exists(curFile)) 
      { 
       existsAlready.Add(item); 

      } 

      else if (!File.Exists(curFile) && File.Exists(copyFrom)) 

      { 

       File.Copy(copyFrom, curFile, true); 
       existsAdded.Add(item); 
      } 

      else 
      { 
       existsNegative.Add(item); 
      } 



     } 


     for (int i = 0; i < existsAlready.Count; i++) 
     { 

      listBox1.Items.Add(existsAlready.ElementAt(i)); 
     } 



     for (int i = 0; i < existsAdded.Count; i++) 
     { 
      listBox2.Items.Add(existsAdded.ElementAt(i)); 
     } 



     for (int i = 0; i < existsNegative.Count; i++) 
     { 
      listBox3.Items.Add(existsNegative.ElementAt(i)); 
     } 
+1

爲什麼你甚至需要Excel互操作呢?爲什麼不使用能夠本機讀取Excel文件的庫,如EPPlus,NPOI。 ClosedXML,Office XML SDK,Aspose等 – mason

+0

如果Excel Interop佔用了大部分時間,並且您正在閱讀xlsx文件,那麼您幾乎可以肯定使用EPPlus或ClosedXml等庫(https:// github的.com/ClosedXML/ClosedXML) – CalC

回答

1

而不是做一個!File.Exists,爲什麼不爲數據庫中的所有fileNames和FilesToSearch目錄創建另一個列表。然後做一個Contains來查看你正在迭代的當前文件是否在該列表中。然後執行File.Copy方法&將其添加到Exists列表中。

 List<string> databaseFiles = new List<string>(Directory.GetFiles("X:\\Private\\DATA\\PROJECT DATA\\Database")); 
     List<string> filesToSearch = new List<string>(Directory.GetFiles("X:\\Private\\DATA\\PROJECT DATA\\FilesToSearch")); 

     foreach(var item in listFiles) 
     { 
      var curFile = Path.Combine("X:\\Private\\DATA\\PROJECT DATA\\Database\\", item); 
      var copyFrom = Path.Combine("X:\\Private\\DATA\\PROJECT DATA\\CopyFrom\\", item); 
      if (databaseFiles.Contains(curFile)) 
      { 
       existsAlready.Add(item); 
      } 
      else 
      { 
       if (filesToSearch.Contains(copyFrom)) 
       { 
        File.Copy(copyFrom, curFile, true); 
        existsAdded.Add(item); 
       } 
       else 
       { 
        existsNegative.Add(item); 
       } 
      } 
     } 
1

至於第一點,你能儘快設置excelApp.Visible = false;爲你聲明excelApp,即這將是第二道防線。

關於第二點,是不是隻有在文件不存在的情況下才需要執行更多檢查?那裏有什麼樣的時間/性能差異?如果您期望許多文件不存在,則可以考慮交換If語句的順序。

相關問題