In Excel Datei schreiben



  • @ Polofreak:

    Kannst da auch mal Code zu posten? Also was Formatierung von Zellen betrifft?



  • aber über das Database-Objekt geht es leider nicht.
    Ich kann dir gerne Code posten. Schau dir aber zuerst mal das nochmal an. Hast ja schon, aber haste das denn auch verstanden? Denn auf dem basiert was ich dir erklären will. Wenn du das verstanden hast dann versuch das, Grundprinzip mal aufzustellen und wenn du dann Probleme hast melde dich noch mal.



  • Ich melde mich noch mal.

    Also, ich brauche zwei Funktionen:

    - Schrift einer Zelle auf Fett ändern.
    - Format einer Zelle auf 'Zahl' ändern.

    Kannst mir helfen? Dank schon mal.

    BTW: Das Schreiben in Excel funktioniert sehr gut.
    Nur eine Kleinigkeit stört noch: Fülle ich z.B. den Wert "text" ab, steht in Excel schlussendlich effektiv "'text". Also mir einem führendem Hochkomma.
    Gibt es da eine Möglichkeit das dies nicht erscheint?



  • Es gibt schon möglichkeiten, dass das nicht erscheint, das Problem ist nur diese Möglickeit gibt es nicht wenn du Excel als DB Objekt benutzt! Dieses führende ' soll soviel bedeuten wie diese Zeile ist keine Zahl. Dazu müsstest du Excel nun auf eine andere Art und Weise automatisieren. Ich meine du hättest dich da mal in irgend eine Art eingelesen, denn ich hab dir zu verschiedenen automatisierungsarten ne Funktion zum fett schreiben. Aber wenn du sowas machen willst darfste nicht vergessen, du musst Excel als Objekt einbinden. Da kommste nicht drum herum. Ich glaube du hast dich in ein schema eingelesen, wozu diese Funktion passen könnte:

    // macht übergebenen Bereich (Schriftart) FETT
    bool CExtendedExcel::Fett(CString VonZelle, CString BisZelle)
    {
    	//LPCTSTR wird benötigt um Bereich zu holen
    	LPCTSTR von = _T(VonZelle);
    	LPCTSTR bis = _T(BisZelle);
    	try
    	{	//Bereich holen
    		xlRange = excel->GetRange(von,bis);
    		//Für gewählten Bereich Schrift fett machen
    		xlRange->Font->Bold = true; //Fett machen
    		return TRUE;
    	}
    	catch(_com_error &ce)
    	{//Fehlerbehandlung
    		m_sLastError = ce.Description();
    		return FALSE;
    	}
    }
    


  • Das mit dem führendem Komma ist kein Problem. Ich belasse es dabei.

    Ich muss also Excel als Objekt einbinden? Wie mache ich das?

    Edit:

    http://www.a-m-i.de/tips/office/officeautomation.php#cppexample_Excel
    Hier gibt es ja schon ein paar Funktionen. Ich nehme an das die Funktion Fett ebenfalls auf diesem Prinzip basiert.
    Gibt es denn nicht eine Klasse wie die geurlte, die aber mehr Möglichkeiten (Formatierung, etc.) bietet? Das müsste es doch sicher geben...



  • Es gibt mehrere Möglichkeiten z.B. so:

    #include "stdafx.h"
    #include <odbcinst.h> // glaub dieses Include brauchste gar nicht
    #include <afxdb.h>
    #import "C:\Programme\Microsoft Office\Office\MSO9.DLL"
    #import "C:\Programme\Gemeinsame Dateien\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
    #import "C:\Programme\Microsoft Office\Office\EXCEL9.OLB" \
    

    Am besten machste dir ne eigene Klasse wo du das rein machst. Die Header musst dann natürlich auch noch includen.
    nach dem du das gemacht hast solltest du noch:

    rename("DialogBox", "ExcelDialogBox") \
      rename("RGB", "ExcelRGB") \
      no_dual_interfaces
    
    	Excel::_ApplicationPtr excel;
    	Excel::_WorkbookPtr workbook;
    	Excel::_WorksheetPtr worksheet;
    	Excel::FontPtr font;
    	Excel::RangePtr xlRange;
    	Excel::_ChartPtr xlChart;
    

    Bei den PTR Objekten natürlich nur die die du auch brauchst. Jetzt solltest du noch dein ATL Objekt.

    Du musst dein Objekt aber auch noch initialisieren und wenn du es nciht mehr braucht uninitialisieren
    das machst du mit

    CoInitialize(NULL);
    

    bzw

    CoUnInitialize(NULL);
    

    Wenn du das alles hast musste dein File öffnen, das mach ich mal so:

    // öffnen der Exceldatei um sie zu bearbeiten
    bool CExtendedExcel::Open(bool visible, CString FileName)
    {// bool visible = anzeigen von Excel oder im Hintergrund arbeiten
     // CString Filename = welches File soll geöffnet werden
    	LPCTSTR tmp = _T(FileName);
    	try
    	{
    		// Initialisiere und überprüfen ob initialisiert
    		HRESULT hr = excel.CreateInstance(L"Excel.Application");
    		if(FAILED(hr))//Fehler beim initialisieren
    		{
    			char msg[1024] = {0};
    			sprintf(msg, "E: Fehler beim initialisieren: %d", hr);
    //			throw std::runtime_error(msg); // geht bei mir nicht
    		}
    		if (FileName.IsEmpty()) //Wenn kein FileName dann erstellen wir halt ein File
    			// erstellen des Workbooks
    			workbook = excel->Workbooks->Add(static_cast<long>(Excel::xlWorksheet));
    		else // Wenn ein File angegeben, dann öffnen
    			workbook = excel->Workbooks->Open(tmp);
    		worksheet = excel->ActiveSheet; // holen des aktiven Blattes
    		if (visible) // soll Excel sichtbar sein?
    			excel->Visible = TRUE; // Excel sichtbar
    	}
    	catch(_com_error &ce)
    	{
    		// Handle the error
    		m_sLastError = ce.Description();
    		return FALSE;
    	}
    	return TRUE;
    }
    


  • wenn du sowas findest wäre das schön, wäre ich auch für einen guten Link dankbar. also zu dem AMI Prinzip geht das Fett drucken ähnlich aber nicht gleich nach dem Prinzip findet man auch einiges auf der MSDN Website

    COleVariant
    		covTrue((short)TRUE),
    		covFalse((short)FALSE),
    		covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
    	//Format A3:A8 as bold, vertical alignment = center.
    	range = objSheet.GetRange(COleVariant("A3"), COleVariant("A8"));
    	font = range.GetFont();
    	font.SetBold(covTrue);
    


  • Hab mal die Pfade angepasst. (verwende Office 97).
    Habe folgende Includes

    #include <odbcinst.h> // glaub dieses Include brauchste gar nicht 
    #include <afxdb.h> 
    #import "C:\Program Files\Microsoft Office\Office\MSO97.DLL"  
    #import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" // dieser include scheint die probleme hervorzurufen. 
    // was muss hier stehen? (für office 97)
    #import "C:\Program Files\Microsoft Office\Office\Excel8.olb"
    

    Problem ist, es kompiliert noch nicht. (errors)

    Fehlt ein include? Oder wo liegt das Problem?

    P.S. ist eine normale MFC-App mit nur den oben erwähnten Includes, sonst nix.

    Der Compiler gibt das aus:

    debug\mso97.tlh(863) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
    debug\vbe6ext.tlh(218) : error C2039: '_CommandBarsPtr' : is not a member of 'Office'
    debug\vbe6ext.tlh(218) : error C2146: syntax error : missing ';' before identifier 'CommandBars'
    debug\vbe6ext.tlh(218) : error C2501: '_CommandBarsPtr' : missing storage
    

    P.S Es gibt noch eine andere Möglichkeit das einzubinden. "Create class from type lib" (über den ClassWizard). So hat es funktioniert, aber eben nur so.

    P.S.2 Die verschiedenen Office versionen (97, 2000,...) haben eine verschiedene Syntax. Stimmt das?



  • die Includes stimmen glaube ich schon so er meckert ja auch nicht an den Includes rum zeig mal ein wenig Source um die CommandBars, denn dascheint was faul zu sein.



  • Hi Hi

    ich bin neu bei C++ und bräuchte genau das um was es hier am anfang ging Werte aus einem Std vektor in ein Excel Sheet schreiben 😉 keine formatierung oder extrawünsche 😉

    leider gibt mir mein Visual Studio eine fehlermeldung nach der anderen die ich nicht verstehe wenn ich den Code den Polofreak gepostet hat versuche 😞

    Wäre super wenn mir jemand helfen könnte 😕
    Was braucht man denn für infos um mir zu helfen ? die Fehlermeldung ?
    Fehler 1 error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d


  • Mod

    Google kennst Du aber?

    Du hast nicht geschrieben welche VS Version Du hast.

    Project Settings
    General -> General -> Use MFC in a shared DLL



  • ja aber hat mir nicht geholfen die tante 😞
    möglicherweise ist mein google foo auch noch nicht gut genug 😉

    VS 13 Pro

    was bewirkt / bedeutet das was du beschrieben hast ?

    Ein Beispielprogramm das in CSV Dateien schreibt wurde mir auch viel helfen 😉 ?


  • Mod

    Es gibt in C++ die CRT (C/C++ Runtime). Diese liegt als statisch linkbare Version vor und als auch dynmisch linkbare DLL Version.

    Die MFC (die Du auch verwendest) gibt es auch statisch linkbar oder dynamisch.

    Nun gibt es eine einfache Einschränkung:
    Wenn MFC dynamisch, dann bitte auch CRT dynamisch.
    Wenn MFC statisch, dann bitte auch CRT statisch.

    Die Einstellungen finden sich unter
    General -> Use of MFC
    sowie unter
    **C/C++ -> Code Gereration -> Runtime Library
    **

    Das Tante Google Dir nicht geholfen hat bezweifle ich schwer.
    Wenn ich einfach Deine Fehlermeldung kopiere (als Ganzes) und suche, erhalte ich sofort als zweiten Fund, eine entsprechende Anfrage bei stackoverfow.com. Die behandelt genau das.

    Wir sooft ist man hier eher eine Meta-Suchmaschine...



  • okay gebe ich recht mein fehler ...

    Aber ich haben nichts passendes in google für mein eigentliches problem gefunden , ich möchte inhalt von Std vektor in eine CSV datei schreiben, sollte einfacher als excel sein ...
    3 Std vektoren jeder eine Spalte in der csv datei 😞

    bzw das bekomme ich hin aber das UTF format macht mir probleme
    1,5 zeigt Excel dann in 1500 an ??
    wie kann ich das denn korigieren ??


Anmelden zum Antworten