Преобразование кода - MFC C ++ в VSTO Excel Addin в C # - PullRequest
0 голосов
/ 28 марта 2012

Я конвертирую MFC C ++ COM Addin в VSTO Excel Addin в C # .NET4.0.В нем много кода, относящегося к 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

Это конвертируется следующим образом?*

Или есть лучший способ конвертации без обращения к сторонней утилите?Могу ли я все сделать во ВСТО?Есть ли где-нибудь график преобразований C API в C #?

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Excel-DNA действительно должен значительно упростить преобразование Excel C ++ в .NET.

Вам следует быть осторожным, пытаясь смешать VSTO и Excel-DNA.Они не живут вместе счастливо в одной и той же надстройке, поэтому вы должны либо основывать все на Excel-DNA (что дает вам доступ как к C API, так и к интерфейсам COM), либо создавать две отдельные надстройки (VSTO имеетнекоторые ленты и другие высокоуровневые обертки, которые могут быть удобны.)

Для доступа к API C из Excel-DNA вы используете класс XlCall, как вы заметили, вместе с классом ExcelReference, который содержит информацию изссылочный тип XLOPER.С Excel-DNA вам никогда не придется иметь дело с XLOPER явно, все преобразования типов выполняются автоматически при вызове XlCall.Excel (...).

Не следует путать вспомогательный тип C API ExcelReference,с типом COM Range.Вы можете конвертировать туда и обратно, но они не являются взаимозаменяемыми.Для вызовов API C вам нужен тип ExcelReference.

Обращаясь к вашему примеру, неясно, что такое controllerRange, но я предполагаю, что тип xlr тип является эквивалентом типа ExcelReference Excel-DNA, а не COM.Тип диапазона, который вы используете (как 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;

Теперь я не уверен, что делает ваша последняя строка - похоже, создается еще один объект xlr.В ExcelReference есть свойства RowFirst, RowLast, которые вы использовали бы для проверки количества строк.

1 голос
/ 28 марта 2012

«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, не нужно работать со ссылкой и использовать ссылку в качестве параметра для функций.

...