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

时间:2017-09-04 00:52:23

标签: c# excel interop ms-office

民间!我正在编写一个程序,通过selenium web驱动程序从网站获取数据。我正在尝试为我们的项目创建足球装备。到目前为止,我完成了从网站上获取日期和时间,团队名称和分数。一两天前,我问有没有办法把数据写入excel文件。我试过epplus,但它不容易使用,所以我开始使用Interop,我有几个问题。

首先,我需要检查我的文件是否存在。另外,我需要访问当前的工作表。然后,我需要检查第一行项是否存在。如果它不存在,我需要在索引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'我该怎么办?另外,我的代码是对的吗?

2 个答案:

答案 0 :(得分:1)

好的,首先,我在使用标题import org.neo4j.spark._ import org.apache.spark.graphx._ import org.apache.spark.graphx.lib._ val neo = Neo4j(sc) // load graph via Cypher query val graphQuery = """MATCH (n)-[b]-(a) where b.NodeType = "Technology" return n,b,a""" val graph: Graph[Long, String] = neo.rels(graphQuery).partitions(7).batch(200).loadGraph graph.vertices.count <--- ERROR 时看不到.Value因此,我想,没有任何用法。但是,当我尝试使用它时,它没有发生任何错误,我的代码完美运行。

更新版本:

using Excel = Microsoft.Office.Interop.Excel;

答案 1 :(得分:0)

String.Compare()有一些重载方法,你可以在这里查看:https://msdn.microsoft.com/en-us//library/system.string.compare(v=vs.110).aspx

所以,你应该在其中传递两个字符串,但是你传递了Cells和dateTime,Cells和firstTeam以及Cells和secondTeam。因此,您需要将它们带到相同类型的System.String。我更喜欢String.Equals()(https://msdn.microsoft.com/en-us//library/1hkt4325(v=vs.110).aspx),而不是String.Compare(),因为String.Equals()返回boolean,所以没有必要将它与0进行比较。假设我不知道哪个类型是dateTime,fisrtTeam和secondTeam对象,例如,您的if条件可能如下所示:

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()) 

当然,你应该避免写出这样的长期条件,因为你可以轻易错过一些东西。

另外:在if体内,你将Cells分配给dateTime,firstTeam和secondTeam,它们可能是不同的类型。所以,它可能会失败。