2015-10-06 2 views
2

Donc, j'essaie d'automatiser Excel à partir de C++ et OLE, en utilisant la fonction Autowrap fournie par Microsoft dans leurs exemples d'automatisation.OLE bstr non null terminé?

Je suis allé aussi loin que je peux lire une valeur de chaîne d'une cellule dans la feuille de calcul. Cependant, il semble que pour certaines valeurs, quelque chose ne va pas avec la chaîne, comme si elle n'était pas terminée. Voici mon code:

VARIANT result; 
VariantInit(&result); 
AutoWrap(DISPATCH_PROPERTYGET, &result, range, L"Value", 0); 
wprintf(L"%s, len: %d\n", result.bstrVal, SysStringLen(result.bstrVal)); 
wprintf(L"abc %s\n", SysAllocString(L"def")); 

La sortie est:

John Doe á, 11 
abc def 

considérant que, dans le fichier Excel lors de l'affichage dans Excel, il montre comme:

John Doe 

(Can la page de code du document Excel est en quelque sorte un problème? C'est un fichier xlsx.)

+1

Pouvez-vous essayer avec 'L" Value2 "'? – Amit

+0

@Amit, exactement le même résultat! –

+0

1. Cela arrive-t-il avec n'importe quelle cellule/valeur? 2 Qu'est-ce que vous obtenez avec 'SysStringLen (results.bstrVal)'? 3. Qu'est-ce que vous obtenez si vous essayez wprintf (L "abc% s \ n", SysAllocString (L "def")); '? – Amit

Répondre

4

John Doe á, 11

Le code est assez bogué et doit être corrigé. Le résultat variable ne peut pas être IDispatch, il doit s'agir d'un VARIANT. Vous supposez aveuglément que la propriété Range.Cell.Value renvoie une chaîne, ce n'est pas comment Excel fonctionne. L'appel de VariantChangeType() pour forcer une conversion à VT_BSTR est requis.

Le caractère á est par ailleurs un simple problème de codage de texte. Dollars à beignets, vous avez copié la chaîne à partir d'une fenêtre de la console. Qui utilise code page 437 par défaut en Europe de l'Ouest et les Amériques. Le code de caractère de á dans cette page de code est 0xA0. Qui est réellement U + 00A0, un non-breaking space en Unicode, pas un codepoint inhabituel dans le texte moderne. Pour l'afficher réellement en tant qu'espace dans une application en mode console, il est nécessaire d'appeler SetConsoleOutputCP() pour l'activer sur CP_UTF8 et remplacer la police de la console par Terminal par une police TrueType telle que Consolas. Bien couvert dans d'autres Q + A sur ce site.

+0

Merci. Je n'aurai pas besoin de l'afficher, mais je vais prendre en compte la gestion correcte des chaînes Unicode dans mon programme et surtout corriger le bug VARIANT. –

+0

Hm, j'ai collé dans le code de manière incorrecte. 'result' était un' VARIANT' tout le long. Mais l'appel de conversion de chaîne nécessaire pour assurer un type de chaîne, je n'avais aucune idée sur. –

+0

Peut-être que vous pouvez m'aider avec https://stackoverflow.com/questions/33149605/writing-cell-in-excel-from-c-no-value-written-cell-is-blank aussi? –