1

我有一个excel文件。我已经上传了截图。我需要编写一个 .NET 应用程序(控制台应用程序)来解析 excel 文件。您可以看到一个标题为“函数名称”的单元格。我的 .NET 应用程序应该找到该特定单元格并读取该列中的内容,例如 Template、InstanceFromTemplate、Task 等。如果它读取Task,它应该调用像Task()这样的CreateTask函数;如果它读取 InstanceFromTemplate,它应该调用 InstanceFromTemplate 函数,如 TaskInstanceFromTemplate();

我已经为这些功能编写了代码。我只需要有关如何解析 excel 表、转到该特定列、读取该列下包含函数名称的单元格并调用该适当函数的帮助。任何帮助,将不胜感激。

算法就像

  1. 打开excel文件
  2. 搜索标题为 Function Name 的标题单元格
  3. 读取标题单元格下的第一个单元格
  4. 如果第一个单元格读取,调用函数(GetAllTemplate 函数的代码已经存在)只需要在找到它之后调用它
  5. 如果是第二个单元格,则调用函数。
  6. 到达标题单元格函数名称下的最后一个单元格。所以,退出
4

5 回答 5

4

根据关于您尝试做什么的描述,您应该真正使用 LINQ to Ecxel 插件,我认为这是解决问题的简单方法

http://code.google.com/p/linqtoexcel/

于 2012-06-15T05:04:24.350 回答
4

我强烈建议使用Excel Data Reader之类的库并使用托管代码中的数据。CodePlex 网站有一个很好的例子来说明你需要做什么。

于 2012-06-15T05:05:18.593 回答
1

这里有一些教程可以帮助您入门:

http://csharp.net-informations.com/excel/csharp-excel-tutorial.htm

于 2012-06-15T05:05:15.520 回答
1

额外注释以供将来参考。只是想指出,使用互操作是混乱的。你最好的选择是使用图书馆。

于 2015-07-08T10:25:05.563 回答
0

使用 Excel 互操作,您可以这样做。我认为函数名称指向您的 excel 工作簿中定义的函数,否则您必须更改该部分以使用反射(但在这种情况下,您需要方法的接收器,而我没有看到在问题中)。

        object hmissing = System.Reflection.Missing.Value; 

        Xls.Application App = new Xls.ApplicationClass();
        App.Visible = true;
        Xls.Workbook wb = App.Workbooks.Open(@"c:\tmp\cartel1.xls", hmissing, hmissing, hmissing, hmissing, hmissing, hmissing,
            hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing);
        Xls.Worksheet ws = (Xls.Worksheet)wb.ActiveSheet;
        Xls.Range rng = ws.UsedRange;
        Xls.Range hdr = rng.Find("Function Name", hmissing, hmissing, hmissing, hmissing, Microsoft.Office.Interop.Excel.XlSearchDirection.xlNext, hmissing, hmissing, hmissing);
        string hdrAdd = hdr.get_Address(hmissing, hmissing, Microsoft.Office.Interop.Excel.XlReferenceStyle.xlA1, hmissing, hmissing);
        string[] pcs = hdrAdd.Split('$');
        string col = pcs[1];
        int row;
        int.TryParse(pcs[2], out row);
        string methName;
        row++;
        while ((methName = App.get_Range(col + row.ToString(), hmissing).get_Value(hmissing) as String) != null)
        {
            App.Run(methName.Split('.')[1], hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing,
                hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing,
                hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing, hmissing,
                hmissing, hmissing, hmissing);
            row++;
        }
于 2012-06-15T06:22:31.517 回答