Stap 6: C++ automatisering van Excel...
TCLogger2Excel begon als een Windows-opdrachtregeltoepassing maar werd omgezet in een MFC-dialoogvenster gebaseerde toepassing om het toevoegen van het dialoogvenster dat de standaardwaarden in de sectie variabelen van elke Excel-werkblad stelt. Het voordeel van het gebruik van MFC is dat het gemakkelijk is! Het is niet een perfecte UI bibliotheek, maar het is zeer makkelijk te gebruiken. Ik zal geen betrekking op de MFC-code in dit Instructable maar in plaats daarvan zal concentreren op de belangrijkste onderdelen van de code die nuttig zijn kunnen bij het schrijven van andere programma's uit te leggen. De eerste van die gebieden is hoe Excel automatiseren van C++.
Eerst een paar woorden over beide keuzes hier, C++ en Excel.
Excel werd geselecteerd omdat het is een krachtig hulpmiddel voor het bewerken en weergeven van gegevens. Excel-grafieken maken onze stuwkracht en druk curven visueel begrijpelijk. De Excel-formules op het een & n tabblad cover wiskunde dat is ver buiten mijn comfortniveau. Door het nemen van de TC-Logger opgenomen gegevens en nu brengen deze in Excel de gebruiker kunt manipuleren en talloze berekeningen en bewerkingen uit te voeren.
C++ is aan de andere kant mijn programmeer taal van keuze! Ik zal u niet vervelen met een lange monoloog op haar deugden of de fouten van andere programmeertalen. Ik zal alleen zeggen dat als een professionele programmeur voor enkele tientallen jaren, en op veel platformen, C++ biedt de meeste kracht op het grootste gemak. Daarmee kan ik niet alleen geoptimaliseerde systeemeigen code genereren, maar met moderne C++ ik kan het gebruiken van de krachtige functies van de C++ Standard Library die rivaal die in elke andere programmeertaal, in termen van macht, begrijpelijkheid en gebruiksgemak.
Automatiseren van Excel vanaf C++
COM-automatisering maakt het gemakkelijk voor het automatiseren van Microsoft Excel. Om te beginnen u wilt importeren van de Excel-typebibliotheken zoals hieronder (van ExcelAutomation.cpp):
Hierdoor wordt de compiler voor het genereren van de headerbestanden (EXCEL.tlh en MSO.tlh) en implementatie bestanden (EXCEL.tli en MSO.tli) die het gebruik van de COM-automatiseringsobjecten die we zullen gebruiken vereenvoudigen. Als u de bestanden van de .tlh vindt u een schat aan informatie die nuttig worden zal als u verschillende taken uitvoeren openen.
Vervolgens moeten we een nieuw exemplaar van het object Excel application. De volgende code is overgenomen uit de CreateExcelSpreadsheet functie in ExcelAutomation.cpp...
Het eerste blok stelt de COM-omgeving en het met behulp van N4189 de scope_exit klasse, tranen omlaag wanneer aShutdown buiten bereik aan het einde van de functie raakt:
Het volgende blok ziet als het register op deze machine een vermelding voor Excel heeft. Het is niet een garantie dat Excel is geïnstalleerd, maar het is een goede start:
Nu maken we een exemplaar van het Excel-object:
Met deze opstelling in plaats we kunnen nu werkbladen maken, vullen van cellen, grafieken maken en nog veel meer. Om dit te illustreren zullen we vervolgens de toepassing zichtbaar maken, maak een werkmap en het toepassingsvenster maximaliseren.
pXLBook is het object van de Excel-werkmap dat we gebruik door de rest van het programma maken zullen.
De (slecht benoemde) functie ProduceExcelWorkbook in de ExcelAutomation.cpp werkt altijd met de actieve Excel-werkblad:
We kunnen het werkblad geven een naam met code als volgt:
Het is belangrijk op te merken dat de Excel-objecten met een naam die eindigt in Ptr zoals Excel::_WorksheetPtr RAII C++ objecten vergelijkbaar met die welke worden aangeboden door N4189 zijn. _bstr_t is ook een RAII-object. Kortom dat betekent dat het geheugen achter deze objecten automatisch vrijgegeven wanneer de variabele ruimte laat, zelfs als dat vanwege een uitzondering gebeurt. (Dit laatste is een concept dat veel C/C++ programmeurs vergeten! Het is zeer belangrijk dat u RAII of anders zodat object-opschonen wanneer een uitzondering unwinds! Als u vergrendelen een CRITICAL_SECTION bijvoorbeeld met behulp van EnterCriticalSection, maar niet te LeaveCriticalSection wanneer een uitzondering uw code om te ontspannen veroorzaakt--misschien zelfs een uitzondering ergens in een bibliotheek u belt, u zal het lekken van de sluis en het zal bijna onmogelijk op te sporen zelfs onder de debugger. Je zal eindigen met een impasse die geen zin! RAII objecten gebruiken! Het enige alternatief is het gebruik van try/finally-blokken voor elke resource!)
Later wanneer we een nieuw werkblad moeten de volgende code wordt gemaakt:
Met een actieve werkblad, kunnen de gegevens in een cel met een functie zoals deze van ExcelAutomation.cpp worden geplaatst:
Merk op dat een "celbereik" (pDataRange) wordt gemaakt en vervolgens een string-waarde toegewezen. U kunt ook een SAFEARRAY zijn, met de gegevens toewijzen aan een celbereik voorbereiden. Lijnen om te zien hoe dit wordt gedaan kijken ExcelAutomation.cpp 270-397.
ExcelAutomation.cpp laat ook zien hoe een grafiek toevoegen aan een werkblad (2 verschillende voorbeelden), grafieklabels aanpassen, toevoegen van een trendlijn, gekleurde cellen, en tekengrootte van label wijzigen.
Een laatste tip... Als u een macro in Excel maken en vervolgens te bewerken, verschijnt het volgende Visual Basic-code die is heel makkelijk te converteren naar C++ met behulp van de voorbeelden in de ExcelAutomation.cpp.