Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回Excel变量C_C#_Excel_Function_Type Conversion_Windows Forms Designer - Fatal编程技术网

C# 返回Excel变量C

C# 返回Excel变量C,c#,excel,function,type-conversion,windows-forms-designer,C#,Excel,Function,Type Conversion,Windows Forms Designer,我有一个Windows窗体应用程序,其中有5个方法,每个方法都基于用户单击按钮的方式。在每种方法中,我都希望以相同的方式打开相同的excel文件。但是,在每个方法中,我希望在工作表上选择不同的范围。我尝试创建一个函数来打开excel文件,而不是重写它5次 // method to open Excel and load a the workbook based on date selected. public Tuple<Microsoft.Office.Interop.Excel.App

我有一个Windows窗体应用程序,其中有5个方法,每个方法都基于用户单击按钮的方式。在每种方法中,我都希望以相同的方式打开相同的excel文件。但是,在每个方法中,我希望在工作表上选择不同的范围。我尝试创建一个函数来打开excel文件,而不是重写它5次

// method to open Excel and load a the workbook based on date selected.
public Tuple<Microsoft.Office.Interop.Excel.Application, Workbook, Worksheet> openExcel() 
{
    Microsoft.Office.Interop.Excel.Application excelObj = new Microsoft.Office.Interop.Excel.Application();    
    string fileName = @"C:\Users\" + userName + @"\Documents\Visual Studio 2015\Projects\ProgramForMom\ProgramForMom\bin\Debug\Excel Files\" + frm2.year.Text + " Expenses"; 
    Workbook wb = excelObj.Workbooks.Open(fileName, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false); 
    wb.Activate();  // Activates file.
    Worksheet ws = wb.Worksheets[frm2.month.Text];   
    ws.Activate();  
    return Tuple.Create(excelObj, wb, ws);
}
我得到一个错误,说

无法将类型“System.Tuple”隐式转换为“Microsoft.Office.Interop.Excel.Workbook”。存在显式转换。是否缺少强制转换

对于工作表,我得到了相同的错误。它说同样的东西只是用工作表代替工作簿


你能解释一下我做错了什么吗?谢谢。

方法的返回类型(元组)与要捕获openExcel输出的变量类型不匹配

看起来应该更像这样

Tuple<Microsoft.Office.Interop.Excel.Application, Workbook, Worksheet> allThreeInOne = openExcell();
通过这种方式,您可以准确地将匹配类型分配给变量

编辑: 正如Joel Coehoorn正确指出的那样,后一种解决方案是不可取的,因为您会不必要地打开文件3次,只为了得到第一次调用时已经得到的结果

将元组分开将是一种方法:

var excelObj = allThreeInOne.Item1;
Workbook wb = allThreeInOne.Item2;
Worksheet ws = allThreeInOne.Item3;

完美的非常感谢你。正是我需要的!不客气。元组是一个很好的工具,可以在一个地方短时间收集信息。我看了这篇文章,有人想创建3个函数或使用全局变量来实现类似我的问题。你的解决方案更好!非常简单、整洁、省时。为什么不创建一个方法来加载excel文件并将不同的范围作为参数传递?通过这种方式,你可以用一种方法确定加载工作簿的哪个部分,并只返回你需要的内容。我有大约7个不同的范围。还值得吗。如果是的话,你能告诉我怎么做吗?这也行。因此,这个解决方案和Mong Zhu发布的解决方案都非常有用。只是想让人们知道。
var excelObj = openExcel().Item1;
Workbook wb = openExcel().Item2;
Worksheet ws = openExcel().Item3;
var excelObj = allThreeInOne.Item1;
Workbook wb = allThreeInOne.Item2;
Worksheet ws = allThreeInOne.Item3;
var result = openExcel();
var excelObj = result.Item1;
Workbook wb = result.Item2;
Worksheet ws = result.Item3;
var cellValue = ws.Range["A1"].Value2;