0

C# .NET4.0 で MFC C++ COM アドインを VSTO Excel アドインに変換しています。その中には、C API を参照するコードがたくさんあります。ここに例があります。変換タスクを簡素化するために Excel DNA を使用する可能性があります。

参考: 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# への変換のチャートはありますか?

4

2 に答える 2

1

「Everyting」は大きな言葉ですが、VSTO では多くのことができます :-)。

C# コードは機能する可能性がありますが、この構文は V​​STO で通常使用するものではありません。次のようにできます。

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 オブジェクトを直接操作できます。参照を操作して関数へのパラメーターとして参照を使用する必要はありません。

于 2012-03-28T14:30:00.417 に答える
1

Excel-DNAを使用すると、Excel C++ から .NET への変換がはるかに簡単になります。

VSTO と Excel-DNA を混在させる場合は注意が必要です。それらは同じアドインでうまく共存できないため、すべてを Excel-DNA (C API と COM インターフェイスの両方にアクセスできるようにする) に基づいて作成するか、2 つの個別のアドインを作成する必要があります (VSTO には便利ないくつかのリボンやその他の高レベルのラッパー。)

Excel-DNA から C API にアクセスするには、お気づきのように XlCall クラスを、参照型 XLOPER からの情報を含む ExcelReference クラスと共に使用します。Excel-DNA では、XLOPER を明示的に処理する必要はありません。XlCall.Excel(...) 呼び出しを行うと、すべての型変換が自動的に行われます。

C API ヘルパー タイプ ExcelReference と COM タイプ Range を混同しないでください。前後に変換できますが、交換はできません。C API 呼び出しの場合、ExcelReference 型が必要です。

あなたの例に目を向けると、controllerRangeが何であるかは明確ではありませんが、タイプxlrタイプは、使用しているCOM Rangeタイプ(Excel.Rangeとして)ではなく、Excel-DNAのExcelReferenceタイプと同等であると思います。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;

最後の行が何をするのかわかりません - 別の xlr オブジェクトを作成しているようです。ExcelReference には、行数を確認するために使用する RowFirst、RowLast プロパティがあります。

于 2012-03-28T19:24:58.327 に答える