代码转换 – MFC C ++到C#中的VSTO Excel插件

我在C#.NET4.0中将MFC C ++ COM Addin转换为VSTO Excel Addin。 有很多代码指的是C API。 这是一个例子。 我可能会使用Excel DNA来简化我的转换任务。

FYI:xlr是XLSDK中的一个类。

//allocate local storage for the reference m_pControllerReference = new xlr( controllerRange ) ; //get the name of the book and sheet with the reference g->Excel.fn( xlSheetNm, *m_pControllerReference ) ; if ( g->Excel.resultXltype() != xltypeErr ) { m_referenceSheetName = g->Excel.resultCString() ; // and get the sheet ID g->Excel.fn( xlSheetId, xl(m_referenceSheetName) ) ; if ( g->Excel.resultXltype() != xltypeErr ) { m_controllerSheetId = g->Excel.resultSheetId() ; xlr theRange( m_pControllerReference->GetLPXLOPER(), 0, TRUE ) ; if(theRange.nRows() >6) ........etc 

这是否像这样转换?

  m_pControllerReference = (Excel.Range)controllerRange; m_referenceSheetName = (string)XlCall.Excel(XlCall.xlSheetNm, m_pControllerReference ); m_controllerSheetId = XlCall.Excel(XlCall.xlSheetId, m_referenceSheetName); // and get the sheet ID //how to convert this ? //xlr theRange( m_pControllerReference->GetLPXLOPER(), 0, TRUE ) ; 

还是有更好的方式转换,而不诉诸第三方实用程序? 我可以做VSTO的一切吗? C API到C#转换中是否有图表?

Excel-DNA确实可以让你的Excel C ++到.NET的转换变得更容易。

您应该小心地尝试混合VSTO和Excel-DNA。 他们并不是在同一个插件中快乐地生活在一起,所以你应该把所有东西都放在Excel-DNA(它允许你访问C API和COM接口)或者做两个单独的加载项(VSTO一些丝带和其他可以方便的高级包装。)

要从Excel-DNA访问C API,您可以使用XlCall类(如您已经注意到的)以及ExcelReference类(其中包含来自参考typesXLOPER的信息)。 使用Excel-DNA您不必显式处理XLOPER,所有types的转换都会在您进行XlCall.Excel(…)调用时自动完成。

您不应将C API帮助器typesExcelReference与COMtypesRange混淆。 你可以来回转换,但它们是不可互换的。 对于C API调用,您需要ExcelReferencetypes。

谈到你的例子,目前还不清楚controllerRange是什么,但是我猜想typesxlrtypes等同于Excel-DNA的ExcelReferencetypes,而不是你正在使用的COM范围types(​​如Excel.Range)。 这里有一篇关于在ExcelReference和Range之间转换的文章: http ://groups.google.com/group/exceldna/browse_frm/thread/7a16e20e9067d3d2。

当你有一个ExcelReference,你的电话是正确的。 所以这应该工作:

  m_pControllerReference = new ExcelReference(0,0,0,0, "Sheet1"); // Cell A1 m_referenceSheetName = (string)XlCall.Excel(XlCall.xlSheetNm, m_pControllerReference ); m_controllerSheetId = XlCall.Excel(XlCall.xlSheetId, m_referenceSheetName); // or just: m_controllerSheetId = m_pControllerReference.SheetId; 

现在我不知道最后一行是什么 – 它似乎创build了另一个xlr对象。 ExcelReference具有属性RowFirst,RowLast用来检查它有多less行。

“Everyting”是一个很大的词,但是你可以在VSTO中做很多事情:-)。

你的C#代码可能工作,但是这个语法不是你通常在VSTO中使用的。 你可以这样做:

 Range controllerRange = <your code here> //... get your range string referenceSheetName = controllerRange.Worksheet.Name; // I'm not aware of any sheet ID in VSTO if (controllerRange.Rows.Count > 6) ... etc... 

正如你所看到的,你可以直接在Range对象上工作,不需要使用引用,并使用引用作为函数的参数。