online 1
gast (50)

/ Forum / Skripte(PHP,ASP,Perl...)

Skripte(PHP,ASP,Perl...)Skripte(PHP,ASP,Perl...)

Fragevon Romero vom 19.08.2022, 20:37 Options

Anhängen einer weiteren Spalte aus Excel!

hallo liebe gemeinde,

ich habe da wieder ein kleines für euch, ein großes problem für mich.

ich versuche eine weitere spalte an eine bestimmte liste dranzuhängen.

der unten aufgeführte script soll euch ein wenig dabei helfen.

dieses script liest erst einmal daten aus einer exceltabelle aus. die daten was er auslesen soll, werden vorher mittels einem hauptscript an die include.js übermittelt. diese daten beinhalten, die exceldatei, -tabelle, zeilenanfang, spaltenanfang, ausgangsdatei, arbeitsordner, ...

nachdem die liste aus excel ausgelesen wurde, wandelt er diese um, um sie für weitere zwecke zu gebrauchen. nachdem umwandeln werden die entsprechenden daten aus einem großen ordner gesucht und in eine von mir vorgegebene ausgangsdatei gespeichert.

bsp.:
excelliste:

a123-45678-000-00 (a123-45678-000 -> hauptteil der datei)
a123-45679-002-00
...

umgewandelte liste:

a123_45678_000
a123_45679_002
...

ungewandelte liste ist im script die "infile"!!!

die "list" ist die gesamte liste aus dem ordner, wo alle dateien drin sind.

das script vergleicht nun unter function checkifinfilelist() ob die infile zu der liste passt. wenn ja, dann gibt er die entsprechende liste aus.

in der liste sind alle dateien enthalten. aber benötigt wird nur die aktuellste datei, erkennbar an einem kennbuchstaben.
sollten also mehrere dateien mit dem hauptteil der infile vorhanden sein, dann soll er nur die "entnehmen", welche den höchsten buchstaben haben.

a123_45678_000A
a123_45678_000B
a123_45679_002D
a123_45679_002AA
...

das wird bereits bewerkstelligt.

aber ab und zu kommt es auch dazu das unter einem bestimmten hauptteil und dem akt. buchstaben, verschiedene materialien existieren. d.h. eine infile kann aus mehreren teilen bestehen.

bsp:
a123_45678_000B

a123_45678_000B_10b
a123_45678_000B_11b
a123_45678_000B_12b
...

jetzt müssen alle gespeichert werden, da sie ja die einzelnen teile sind, welchen den hauptteil wiederspiegeln. das macht das script ebenfalls.

aber nun kommts. wie schaffe ich, dass die entsprechende anzahl zu infile auch zur entsprechenden list passt?

ich denke, es liegt in der function checkifinfilelist(), da da infile und list verglichen wird.

die anzahl aus der excelliste sieht so aus:

a123-45678-000-00 // 5
a123-45679-002-00 // 22 (-> // spiegelt die andere spalte wieder)

aussehen am ende muss es so:

a123_45678_000B_10b_5
a123_45678_000B_11b_5
a123_45678_000B_12b_5

a123_45679_002AA_11b_22
a123_45679_002AA_22b_22
...

habe versucht, die anzahl am ende einzufügen, aber da macht er nur folgendes:

a123_45678_000B_10b_5
a123_45678_000B_11b_22
a123_45678_000B_12b_(andere anzahl)
...

wenn ich aber bei function checkifinlifelist(), bei function findinlist() die anzahl mit angebe, bringt er mir für die anzahl "undefined", weil list größer ist als die tatsächliche liste des ordners.

also nun die frage an euch. Wie bekomm ich wie oben unter "aussehen am ende muss es so:" beschrieben, die entsprechende anzahl unter die einzelnen einzelteilen?

lg romero


Antwort schreiben

Antwort 1 von Romero vom 19.08.2022, 20:40 Options

		//-----------------------------
		//-- Initialisierung
		//-----------------------------
		function init()
		{
			var infile, list, out, anzahl;

			msg( "<br>--- Excel Datei laden: ---<br>" );

			infile = loadExcelFile( locations.infile, locations.startSheet );
			infile = deleteEmpty( infile );
			infile = convertInfile( infile );

			//--> Excelliste auslesen, leeren Inhalt löschen, Infile (ausgelesene Excelliste) für das Auslesen vorbereiten

			anzahl = loadExcelFile( locations.infile, locations.startSheet );
			anzahl = deleteEmpty( anzahl );
			anzahl = convertAnzahl( anzahl );

			//--> Excelliste auslesen, leeren Inhalt löschen, Anzahl (ausgelesene Excelliste) für das Auslesen vorbereiten

			msg( "<br>--- Dateien finden: ---<br>" );

			list   = getSortedList( [ locations.posA, locations.posB, locations.posC ] );
			list   = findLast( list ); 

			//--> Dateien finden, Liste sortieren. Liste ist ein Array von Objekten: { p = Pfad, n = File }
			//--> jeweils letzte Datei finden, und alle anderen Einträge löschen

			out = checkIfInFileList( list, infile, anzahl );

			//--> Dateien und Infile vergleichen, sowie deren Anzahl anhängen

			save( out );

			if( Eingabewerte.STL_vorhanden == "Ja" || Eingabewerte.STL_Tür_Links_vorhanden == "Ja" || Eingabewerte.STL_Tür_Rechts_vorhanden == "Ja" || Eingabewerte.STL_Tür_LinksRechts_vorhanden == "Ja" ) 
			{
				document.getElementById( "STL_Meldungen_Überschreiben" ).style.display = "inline";
				document.getElementById( "STL_Meldungen_Alt_Text" ).style.display = "inline";
				document.getElementById( "STL_Meldungen_Alt_Text" ).disabled = true;
				document.getElementById( "Überschreiben_Alt_Text" ).disabled = true;
				document.getElementById( "Alt_Text" ).disabled = true;
			}

			return;
		};

		//------------------------------------------
		//-- Exceldatei laden, Array zurückliefern
		//------------------------------------------
		function loadExcelFile( fileName, sheetName )
		{
			var x, y;
			var currentRange;
			var currentSheet;
			var excelApp = new ActiveXObject("Excel.Application");
			var wbin;
			var out      = new Array();
			
			try { wbin     = excelApp.Workbooks.Open( fileName ); }
			catch(e)
			{
				STL_Meldungen_Fehler( "(!) konnte folgende Datei nicht öffnen: '" + fileName + "' (!)" );
				return [];
			}
			
			currentSheet = get_sheet_by_name( wbin, sheetName );
			if( currentSheet )
			{
				currentRange = currentSheet.UsedRange;
				for ( y = locations.startRow; y < currentRange.Rows.Count; y++ )
				{
					out.push( currentRange.Cells( y + 1, locations.startCol1 ).Text + currentRange.Cells( y + 1, locations.startCol1_1 ).Text );
				}

				for ( y = locations.startRow; y < currentRange.Rows.Count; y++ )
				{
					out.push( currentRange.Cells( y + 1, locations.startCol2 ).Text + currentRange.Cells( y + 1, locations.startCol2_2 ).Text );
				}
			}

			//--> Matten-Spalte auslesen und Anzahl-Spalte an die Stückliste zeilenweise anhängen

			wbin.Close();
			excelApp.Quit();
			return out;

			function get_sheet_by_name( wb, name )
			{
				var i;
				for( i = 1; i < wb.Sheets.Count + 1; i++ )
				{
					if( wb.Sheets( i ).name == name )
					{
						return wb.Sheets( i );
					}
				}
				STL_Meldungen_Fehler( "(!) Tabelle '" + name + "' nicht gefunden (!)" );
				return false;
			}
		};

		//------------------------------------------------------
		//-- leere Elemente der Infile löschen
		//------------------------------------------------------
		function deleteEmpty( infile )
		{
			var i = 0;
			var out = [];
			for( i = 0; i < infile.length; i++ )
			{
				if( infile[ i ] ) { out.push( infile[i] ); }
			}

			//--> alle leeren Eintragungen werden gelöscht

			out.pop();

			//--> der letzte Eintrag wird gelöscht

			return out;
		};

		//------------------------------------------------------
		//-- leere Elemente der Anzahl löschen
		//------------------------------------------------------
		function deleteEmpty( anzahl )
		{
			var i = 0;
			var out_anz = [];
			for( i = 0; i < anzahl.length; i++ )
			{
				if( anzahl[ i ] ) { out_anz.push( anzahl[i] ); }
			}

			//--> alle leeren Eintragungen werden gelöscht

			out_anz.pop();

			//--> der letzte Eintrag wird gelöscht

			return out_anz;
		};

		//---------------------------------------------
		//-- Infile konvertieren, Ausgabe zur kontrolle
		//---------------------------------------------
		function convertInfile( infile )
		{
			var i = 0; var last = "";
			for( i = 0; i < infile.length; i++ )
			{
				if( infile[ i ] )
				{
					last = infile[ i ].substr( 0, 14 );

					infile[ i ] = convertFileNameToObject( infile[ i ] );

					msg( "infile: " + last + " / " + i + " " + infile[ i ] + "<br>" )
				}
			}

			return infile;
		};

		function convertFileNameToObject( fn )
		{
			fn = fn.replace( /-/g, "_" );
			fn = fn.substr( 0, 14 );

			out = fn;
			return out;
		}

		//---------------------------------------------
		//-- Anzahl konvertieren, Ausgabe zur kontrolle
		//---------------------------------------------
		function convertAnzahl( anzahl )
		{
			var i = 0; var last = "";
			for( i = 0; i < anzahl.length; i++ )
			{
				if( anzahl[ i ] )
				{
					last = anzahl[ i ].substr( 0, 14 );

					anzahl[ i ] = anzahl[ i ].substr( 17 , 3 );

					//if( anzahl[ i ] == 1 ) { anzahl[ i ] = "" };

					msg( "Anzahl: " + last + " ( " + anzahl[ i ] + " )<br>" )
				}
			}

			return anzahl;
		};

		//---------------------------------
		//-- vorhandene Stückliste einlesen
		//---------------------------------
		function loadFile( FileName )
		{
			var fso,f1;
			var FileStr = "";

			fso = new ActiveXObject("Scripting.Filesystemobject");

			if( fso.FileExists(FileName) )
			{
				f1 = fso.OpenTextFile(FileName, 1);
				if(f1.AtEndOfStream) msg("(!) Die Datei ist leer<br>", true); else FileStr = f1.ReadAll();
				f1.close();
			}
			else
			{
				msg("(!) vorhandene Datei nicht gefunden! --->" + FileName + "<br>", true);
			}

			return FileStr;
		}

		//-----------------------------
		function checkIfInFileList( list, infile, anzahl )
		{
			var i, temp;
			var out = [];

			for( i = 0; i < infile.length; i++ )
			{
				out = out.concat( findInList( infile[i] ) );
			}

			return out;

			function findInList( s )
			{
				var i = 0;
				var out = [];
				for( i = 0; i < list.length; i++ )
				{
					if( s == list[i].n.join("_").substr( 0, 14 ) )
					{
						out.push( list[i] );
					}
				}

				if( out.length == 0 ) return [s];
				return out;
                        }
                };

Antwort 2 von Romero vom 19.08.2022, 20:41 Options


		//----------------------------------------------------------------------------
		//-- gefundene Materialien in einer Liste speichern und zur Kontrolle ausgeben
		//----------------------------------------------------------------------------
		function save( list )
		{
			var out = [];

			for( var i = 0; i < list.length; i++ )
			{
				if( list[i].n )
				{
					out.push( list[i].n.join("") + ".nc" );
					msg( i + " " + list[i].n + " // ( " + list[i].anzahl + " ) - " + list[i].p + "<br>" );
				}
				else
				{
					out.push( "! datei nicht gefunden: '" + list[i] + "'" );
					msg( i + " " + "! datei nicht gefunden '" + list[i] + "' !<br>" );
                        	}
			}

			var infile_vorhanden = loadFile( locations.workFolder_STL + locations.outfile1 ).replace(/\r\n/g,"\n").split("\n");

			vergleich( out , infile_vorhanden )

			//-------------------------------------------------------------------------------
			//-- Ausgabedatei und vorhandene Stückliste vergleichen und Unterschiede ausgeben
			//-------------------------------------------------------------------------------
			function vergleich( infile_neu , infile_vorhanden )
			{
				for( var i = 0; i < infile_neu.length; i++ )
				{
					infile_neu[i] = infile_neu[i].substr( 0 , 15 );
				}

				for( var i = 0; i < infile_vorhanden.length; i++ )
				{
					infile_vorhanden[i] = infile_vorhanden[i].substr( 0 , 15 );
				}

				infile_neu.sort();
				infile_vorhanden.sort();

				if( infile_neu.length == infile_vorhanden.length )
				{

					document.getElementById( "STL_Meldungen_Überschreiben" ).innerHTML = '<p class="STL_Meldungen_Überschreiben">Wollen Sie die Stückliste Überschreiben? <input type="button" value="Bestätigen" class="STL_Meldungen_Button" onclick="kommt_noch( out )"></input> <input type="button" value="Abbrechen" class="STL_Meldungen_Button" onclick="Überschreiben_Abbrechen()"></input>';

					msg( "<br><b>Es wurden keine Unterschiede gefunden." );
				}
				else
				{
					for( var i = 0; i < infile_neu.length && infile_vorhanden.length; i++ )
					{
						if( infile_neu[i] != infile_vorhanden[i] )
						{

							document.getElementById( "STL_Meldungen_Überschreiben" ).innerHTML = '<p class="STL_Meldungen_Überschreiben">Wollen Sie die Stückliste Überschreiben? <input type="button" value="Bestätigen" class="STL_Meldungen_Button" onclick="kommt_noch( out )"></input> <input type="button" value="Abbrechen" class="STL_Meldungen_Button" onclick="Überschreiben_Abbrechen()"></input>';

							msg( "<br><b>Unterschiede: </b>" + infile_vorhanden[i] + " --> <b>" + infile_neu[i] + "</b>" );
						}
					}
				}

			};

			//saveFile( locations.workFolder1 + locations.outfile1, out.join("\r\n") );
		};

		//---------------------------------------------------------
		//-- Speichern der Stückliste - Überschreiben und Abbrechen 
		//---------------------------------------------------------
		function Überschreiben_Abbrechen()
		{
			STL_Meldungen_Fehler( "Ihre Stückliste(n) " + locations.Bereich + "<br>wurde nicht gespeichert." );
		};

		function kommt_noch( out )
		{
			out = out;

			saveFile( "C:/test/" + locations.outfile1, out.join("\r\n") );
		};

		//---------------------------------------------------------
		//-- Liste in vorgegebenen Ordner durchsuchen und speichern
		//---------------------------------------------------------
		function getSortedList( locs )
		{
			var out = new Array();
			var temp, i, k;
			for( i = 0; i < locs.length; i++ )
			{
				temp = getFiles( locs[i], 5 )[1];
				for( k = 0; k < temp.length; k++ )
				{
					temp[k] = { p:temp[k].path, n:temp[k].name };
					temp[k].p = temp[k].p.replace(/\\/g,"/");
					temp[k].p = temp[k].p.substr( 0, temp[k].p.lastIndexOf("/") );
					temp[k].n = temp[k].n.split(".")[0];
					temp[k].n = [ temp[k].n.substr( 0, 14 ), temp[k].n.substr( 14 ) ];
					out.push( temp[k] );
				}
			}

			//--> Dateien finden

			out.sort( sort );
			out = findLast( out );
			return out;

			function sort( a, b )
			{
				var i;
				a = a.n;
				b = b.n;
				for( i = 0; i < a.length; i++ )
				{
					if( !b[i] ) return 1;
					if( a[i].length > b[i].length ) return 1;
					if( a[i].length < b[i].length ) return -1;
					if( a[i] > b[i] ) return 1;
					if( a[i] < b[i] ) return -1;
	                        }
				return 0;

			//--> Liste sortieren

	                };
		};

		function findLast( arr )
		{
			var i   = 0;
			var out = new Array();
			var temp = [];
			var current000, last000;
			var currentX, lastX;
			var current00x, last00x;

			for( i = 0; i < arr.length; i++ )
			{
				current000   = arr[i].n[0];
				current00x   = arr[i].n[1].split("_")[1];
				currentX     = arr[i].n[1].split("_")[0];
				if( last000 != current000 )
				{
					out = out.concat( temp );
					temp = [];
				}
				if( i > 0 && lastX != currentX ) { temp = []; }
				temp.push( arr[ i ] );
				last000 = current000;
				lastX   = currentX;
				last00x = current00x;
			}
			return out;

		//--> Letzten Eintrag finden, sprich höchste Aktualität (ISSUE)

                };

		//------------------------------------------
		//--Liste im entsprechendem Ordner speichern
		//------------------------------------------
		function saveFile(FileName,str)
		{
			var fso, folder, file, foldername;

			//____
			function getfoldername(s) { s = s.replace(/\\/g,"/"); s = s.substr( 0, s.lastIndexOf("/") ); return s; }

			fso = new ActiveXObject("Scripting.Filesystemobject");
			foldername = getfoldername(FileName);
			if(fso.FolderExists(foldername))
			{
				folder = fso.Getfolder(foldername);
				if(folder.attributes!=16&&folder.attributes!=48)
				{
					STL_Meldungen_Fehler("[savefile] kann auf Verzeichnis nicht zugreifen ---><b>" + foldername + "</b> (att:" + folder.attributes + ")");
					return false;
				}
				if(fso.FileExists(FileName))
				{
					file = fso.GetFile(FileName);
					if(file.attributes!=0&&file.attributes!=32)
					{
						STL_Meldungen_Fehler("[savefile] kann auf Datei nicht zugreifen ---><b>" + FileName + "</b> (att:" + file.attributes + ")");
						return false;
					}
				}
				file = fso.OpenTextFile(FileName, 2, true);
				file.write(str);
				file.close();
			}
			else
			{
				STL_Meldungen_Fehler("Verzeichnis nicht gefunden! ---><b>" + foldername + "</b>");
			}
		}

		//-----------------------------------------------------------------------------------
		//-- returns an array: [ array of folder objects, array of file objects ]
		//-- filter:
		//-- n = 0000 (0): all folders and subfolders and all files
		//-- n = 0001 (1): no folders
		//-- n = 0010 (2): no files
		//-- n = 0100 (4): no subfolders
		//-- ext = extension as STRING
		//-- part = member as STRING, eg. "name"
		//-----------------------------------------------------------------------------------
		function getFiles( startfolder, n , ext, part )
		{
			if( !n ) n = 0;
			var fso     = new ActiveXObject("Scripting.FileSystemObject");
			var folders = new Array();
			var files   = new Array();
			if( !fso.FolderExists( startfolder ) )
			{
				STL_Meldungen_Fehler("(!) Folder " + startfolder + " not found!", true );
				return [ [],[] ];
			}
			getNext( startfolder );
			return [ folders, files ];

			function getNext( fld )
			{
				var folderObj = fso.getFolder( fld );
				var filesEn, foldersEn;
				var tmp = "";
				if( (n & 2) == 0 )
				{
					filesEn   = new Enumerator( folderObj.Files );
					for (; !filesEn.atEnd(); filesEn.moveNext())
					{
						tmp = filesEn.item().name;
						if( typeof(ext) == 'undefined' || tmp.substr( tmp.length - ext.length, ext.length ).toLowerCase() == ext.toLowerCase() )
						{
							if( typeof(part) != 'undefined' && filesEn.item()[part] != 'undefined' )
								files.push( filesEn.item()[part] )
							else
								files.push( filesEn.item() );
						}
					}
				}
				if( (n & 1) == 0 )
				{
					folders.push( folderObj );
					foldersEn = new Enumerator( folderObj.SubFolders );
					if( (n & 4) == 0 )
					{
						for (; !foldersEn.atEnd(); foldersEn.moveNext()) getNext( foldersEn.item().path );
					}
				}
			}
		}
		//-----------------------------
		function msg( s ) { document.getElementById("msgs").innerHTML += s; };

		function STL_Meldungen_Fehler( Fehler )
		{
			document.getElementById("STL_Meldungen_Fehlerausgabe").style.display = "inline";
			document.getElementById("STL_Meldungen_Fehler").innerHTML += Fehler + '<br>';
		};

Antwort 3 von Romero vom 19.08.2022, 20:53 Options

Zitat:
wenn ich aber bei function checkifinlifelist(), bei function findinlist() die anzahl mit angebe, bringt er mir für die anzahl "undefined", weil list größer ist als die tatsächliche liste des ordners.


richtig muss es heißen:

wenn ich aber bei function checkifinlifelist(), bei function findinlist() die anzahl mit angebe, bringt er mir für die anzahl "undefined", weil list größer ist als die länge der einträge der anzahl.

Ähnliche Themen

Excel VBA: Bedingte Formatierung
snailhouse  16.04.2009 - 1134 Hits - 8 Antworten

VBA/excel einfügen in varierende zellen
Kokosk  19.05.2009 - 625 Hits - 2 Antworten

MySQL Summer einer Spalte, allerdings VARCHAR(200)
TByte  27.05.2009 - 357 Hits - 7 Antworten

Excel VBA: FollowHyperlink Mailto:
snailhouse  09.07.2009 - 532 Hits - 1 Antwort

Excel VBA: Modul exportieren
snailhouse  24.07.2009 - 493 Hits - 2 Antworten

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Thu Jan 8 21:07:44 2026