通过microsoft Interop c追加到现有的excel文件#

问题描述:

伙计们!我正在编写一个程序,通过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

我也写了我想要完成的代码顶部 –

好的,首先,我看不到.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(); 
} 

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 –