2017-09-04 41 views
0

夥計們!我正在編寫一個程序,通過selenium web驅動程序從一個網站獲取數據。我正在努力爲我們的項目創建足球夾具。到目前爲止,我完成了日期和時間,團隊名稱和分數從網站。一兩天前,我問有沒有辦法將數據寫入excel文件。我嘗試過epplus,但它使用起來並不容易,所以我開始使用Interop,並且有幾個問題。通過microsoft Interop c追加到現有的excel文件#

首先,我需要檢查我的文件是否存在。另外,我需要訪問當前的工作表。然後,我需要檢查第一行項目是否存在。如果它不存在,我需要插入一個新行到索引1.我不知道,我做得對:

using Excel = Microsoft.Office.Interop.Excel; //namespace 

var filePath = new FileInfo(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + 
       "\\Test" + "\\" + pathName + "\\" + subFile + "\\" + pathName + ".xlsx"); 

Excel.Application xlApp = new Excel.Application(); 
xlApp.Visible = true; 
object misValue = System.Reflection.Missing.Value; 

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Test" + "\\" + pathName + "\\" + subFile + "\\" + pathName + ".xlsx"; 

if (filePath.Exists) 
{ 
     Excel.Workbook wb = xlApp.Workbooks.Open(path,0, false, misValue, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); 
     Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets.Item["Sheet1"]; 
     for (int i = 0; i < dateTime.Count; i++) 
     { 
      if (string.Compare(ws.Cells[i + 1, 1], dateTime[dateTime.Count - i -1]) != 0 && string.Compare(ws.Cells[i + 1, 2], firstTeam[dateTime.Count - i - 1]) != 0 && string.Compare(ws.Cells[i + 1, 3], secondTeam[dateTime.Count - i - 1]) != 0) 
      { 
         ws.Cells.Rows.Insert(0); 
         ws.Cells[1, 1] = dateTime[dateTime.Count - i - 1]; 
         ws.Cells[1, 2] = firstTeam[dateTime.Count - i - 1]; 
         ws.Cells[1, 3] = secondTeam[dateTime.Count - i - 1]; 
      } 
     } 
} 

我想檢查該行的數據,但我無法完成。我的如果條件不起作用我收到此錯誤:best overloaded method match for 'string.Compare(string, string)' has some invalid arguments'我該怎麼辦?另外,我的代碼是否正確?

+0

你能否提供一些更多的信息,請:什麼是DATETIME,firstTeam,secondTeam?你無法完成的事情?任何錯誤? –

+0

@NikitaViul我現在正在添加 –

+0

我也寫了我想要完成的代碼頂部 –

回答

0

好的,首先,我看不到.Value,而使用標頭using Excel = Microsoft.Office.Interop.Excel;所以,我認爲,沒有任何用法。但是,當我嘗試使用它時,它沒有發生任何錯誤,我的代碼完美地工作。

更新版本:

using Excel = Microsoft.Office.Interop.Excel; //namespace 
var filePath = new 
FileInfo(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + 
      "\\Test" + "\\" + pathName + "\\" + subFile + "\\" + pathName + ".xlsx"); 

Excel.Application xlApp = new Excel.Application(); 
xlApp.Visible = true; 
object misValue = System.Reflection.Missing.Value; 

string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\Test" + "\\" + pathName + "\\" + subFile + "\\" + pathName + ".xlsx"; 

if (filePath.Exists) // checks whether file exist or not 
{ 
     Excel.Workbook wb = xlApp.Workbooks.Open(path,0, false, misValue, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false); 
     Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets.Item["Sheet1"]; 
     for (int i = 0; i < dateTime.Count; i++) 
     { 
      // check element already there or not 
      if (ws.Cells[i + 1, 1].Value.ToString() != dateTime[dateTime.Count - i - 1]) 
      { 
        ws.Rows["1"].insert(); // add new row for new data 
        ws.Cells[1, 1] = dateTime[dateTime.Count - i - 1]; 
        ws.Cells[1, 2] = firstTeam[dateTime.Count - i - 1]; 
        ws.Cells[1, 3] = secondTeam[dateTime.Count - i - 1]; 
      } 
     } 
       wb.SaveAs(path, Excel.XlFileFormat.xlOpenXMLWorkbook, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlShared, misValue, misValue, misValue, misValue, misValue); 
       wb.Close(true, misValue, misValue); 
       xlApp.Quit(); 
} 
0

String.Compare()有一些重載方法,您可以點擊此處查看:https://msdn.microsoft.com/en-us//library/system.string.compare(v=vs.110).aspx

所以,你應該通過在其兩個字符串,但你通過細胞和日期時間,細胞和firstTeam和細胞和secondTeam。所以,你需要將它們帶入相同類型的System.String。我更喜歡String.Equals()(https://msdn.microsoft.com/en-us//library/1hkt4325(v=vs.110).aspx),而不是String.Compare(),因爲String.Equals()返回布爾值,所以沒必要將它與0進行比較。假設我不知道哪種類型是dateTime ,fisrtTeam和secondTeam對象,例如,如果你的情況可能是這樣的:

if (string.Equals(ws.Cells[i + 1, 1].Value.ToString(), dateTime[dateTime.Count - i -1].ToString()) && string.Equals(ws.Cells[i + 1, 2].Value.ToString(), firstTeam[dateTime.Count - i - 1].ToString()) && string.Equals(ws.Cells[i + 1, 3].Value.ToString(), secondTeam[dateTime.Count - i - 1]).ToString()) 

肯定地說,你應該避免寫長的情況那樣,監守你可以easally錯過的東西。

另外:在if體內,您將Cells分配給dateTime,firstTeam和secondTeam,它們可能是不同的類型。所以,它可能會失敗。

+0

我的數據類型是字符串。我嘗試了你的建議,但沒有奏效。我認爲現在的問題是程序不讀取單元格 –

+0

你可以評論所有的「if」,然後在for循環裏面寫下: var cells = ws.Cells [i + 1,1]; var dt = dateTime [dateTime.Count - i -1]; var ft = firstTeam [dateTime.Count - i - 1]; var st = secondTeam [dateTime.Count - i - 1]; ,然後在關閉foor循環的「}」處放一個斷點並調試你的程序。在本地窗口中,您將看到該變量的當前類型。 –

+0

var cells = ws.Cells [i + i];得到空,它根本沒有讀它。之後,我得到了這個錯誤:hresult 0x800a03ec –

相關問題