Probleme mit Excel Automation



  • Mein Programm soll Daten in eine Exceltabelle schreiben und speichern.
    Ich nutze dazu eine Template Exelfile in der bestimmte Felder schon fertig formartiert sind. Das Programm schreibt dann nur noch in bestimmte Zellen die Werte. Das klappt soweit auch ganz gut. Nun möchte ich aber das das Programm automatische eine bestimmte Zeile kopiert, darunter wieder einfügt und die Daten die da vlt. schon drin stehen löscht. Das ganze soll mir die manuelle programmierte Formatierung abnehmen. Ich hab mich, da es dazu nicht wirklich was im Netz zu finden gibt, an C# Beispielen orientiert. Allerdings ist da immer wieder die Rede von einer get_Range Methode die in CLI nicht vorhanden ist. Warum auch immer.... Also wie kann ich das bewerkstelligen?
    C# Beispiel:

    const int xlShiftDown = -4121
    Excel.Range oRange = oSheet.get_Range("A13");
    Excel.Range oRow = oRange.EntireRow;
    oRow.Insert(xlShiftDown);
    

    Mein Versuch:

    void createTable::createExcelFile(String^ FileName, int HowManyFiles, String^ SavePath)
    {
    Excel::Application^ oXl;
    		Excel::_Workbook^ oWB;
    		Excel::_Worksheet^ oSheet;
    		Excel::Range^ oRng;
                    Excel::Range^ oRow;
    
    		String^ local	= IO::Directory::GetCurrentDirectory();
    		local			+= "\\template.xls";
    		String^ time	= DateTime::Now.ToString();
    		String^ range;
    
    	try
    	{
    		//new try
    		oXl				= gcnew  Excel::Application();
    		oXl->Visible	= true; //später false
    		oXl->DisplayAlerts = false;
    
    		oWB				= (Excel::_Workbook^)(oXl->Workbooks->Add(local));
    		oSheet			= (Excel::_Worksheet^)oWB->ActiveSheet;
    
                    //Zeile einfügen
    		oRng			= (Excel::Range^)oSheet->Range["A10","I10"];
    		oRow			= oRng->EntireRow;
    		oRow->Insert(Excel::XlInsertShiftDirection::xlShiftDown,false);
    
                    oSheet->Cells[4 , 3] = FileName;
    		oSheet->Cells[6 , 3] = time;
    
    		for (int i=0; i<HowManyFiles; i++)
    		{
    		      oSheet->Cells[8+i,1] = i+1;
    		}
    
    		oWB->SaveCopyAs(SavePath);
    		oXl->Quit();
    		}
    	catch(SystemException^e)
    	{
    		MessageBox::Show(e->Message);
    	}
    }
    

    edit: Ich hab es jetzt geschafft eine neue Zeile einzufügen, allerdings unformartiert! Der Code wurde oben angepasst! Wenn jemand ne Idee hat wie ich es schaffe eine Formatierte Zeile zu kopieren, wär ich sehr dankbar!

    Ich hoffe ihr könnt mir hier ein wenig auf die Sprünge helfen!



  • Ich hasse es ^^
    Da sitz man seit gut 7 Stunden an dem Problem und 10min nach dem man sich hilfesuchend im Forum meldet, bekommt man es dann doch noch hin....
    Für alle die das selbe mal machen müssen / wollen:

    void createTable::createExcelFile(String^ FileName, int HowManyFiles, String^ SavePath)
    {
    		Excel::Application^ oXl;
    		Excel::_Workbook^ oWB;
    		Excel::_Worksheet^ oSheet;
    
    		String^ local	= IO::Directory::GetCurrentDirectory();
    		local			+= "\\template.xls";
    		String^ time	= DateTime::Now.ToString();
    
    	try
    	{
    		// Excel Starten
    		oXl				= gcnew  Excel::Application();
    		oXl->Visible	= true; //später false
    		oXl->DisplayAlerts = false;
    
    		// Template laden
    		oWB				= (Excel::_Workbook^)(oXl->Workbooks->Add(local));
    		oSheet			= (Excel::_Worksheet^)oWB->ActiveSheet;
    
    		oSheet->Cells[4 , 3] = FileName;
    		oSheet->Cells[6 , 3] = time;
    
    		for (int i=0; i<50; i++)
    		{
    			// Zeile Einfügen
    			insertNewRow(oSheet,i);
    
    			// Daten einfügen
    			oSheet->Cells[8+i,1] = i+1;
    		}
    
    		oWB->SaveCopyAs(SavePath);
    		oXl->Quit();
    	}
    	catch(SystemException^e)
    	{
    		MessageBox::Show(e->Message);
    	}
    };
    
    void createTable::insertNewRow(Microsoft::Office::Interop::Excel::_Worksheet^ oSheet, int CurrentRow )
    {
    	Excel::Range^ oRng;
    	Excel::Range^ oRow;
    	Excel::Range^ oR1;
    	Excel::Range^ oR2;
    
    	oRng	= (Excel::Range^)oSheet->Range[String::Format("A{0}",CurrentRow+9),String::Format("I{0}",CurrentRow+9)];
    	oRow	= oRng->EntireRow;
    	oR1		= oRow;
    	oR2		= (Excel::Range^)oSheet->Range[String::Format("A{0}",CurrentRow+10),String::Format("I{0}",CurrentRow+10)];
    	oR1->EntireRow->Copy(oR2);
    };
    

Anmelden zum Antworten