Problem
Es wird eine Lösung für das Ein- und Auslesen von Werten in Excelsheets benötigt.
A solution shall enable the user to read and write data to an excel spreadsheet.
Ansatz – Approach
Die Nutzung der OLE Schnittstelle von Excel erlaubt die Fernsteuerung.
The usage of the OLE Interface allows Excel to control excel remotely.
Lösung – Solution
Der folgende DXL Schnipsel erlaubt die Fernsteuerung von Excel mit OLE Automation.
The following DXL Snipplet allows the user to control the excel interface remotely.
/**************************************************************************** * Beispiele für das Einlesen mit OLE Excel Automation in DXL * erstellt von Björn Karpenstein an einem Sonntag (was ich alles mache!!) ****************************************************************************/ // String Functions #include "\\\\bbmag2k\\exchange\\doors\\dxl\\strings.inc"; // Global settings //pragma encoding,"UTF-8"; pragma runLim, 0; int findLastRow (OleAutoObj objExcelSheet) { OleAutoObj objUsedRange, objRows; int iRow = 0; oleGet(objExcelSheet,"UsedRange",objUsedRange); oleGet(objUsedRange,"Rows",objRows); oleGet(objRows,"Count",iRow); return iRow+1; } int findLastColumn (OleAutoObj objExcelSheet) { OleAutoObj objUsedRange, objColumns; int iColumn = 0; oleGet(objExcelSheet,"UsedRange",objUsedRange); oleGet(objUsedRange,"Columns",objColumns); oleGet(objColumns,"Count",iColumn ); return iColumn +1; } // Excel: Table1.Cells(1,2).Value; string getCellContent(OleAutoObj objSheet, int x, int y) { // Das hier brauchen wir, um Parameter an OLE-Objekte // zu übergeben - immer leer machen! OleAutoArgs objArgBlock = create; OleAutoObj objCell; // Das Zellen-Objekt nach Übermittlung der Koordinaten (1,1) string zellenInhalt; // Der Inhalt aus der Zelle als String clear( objArgBlock ); // Parameter leeren put( objArgBlock, y ); // Parameter 2 put( objArgBlock, x ); // Parameter 1 oleGet(objSheet, "Cells", objArgBlock,objCell); // Das Zellenobjekt nimmt Koordinaten an if (!null objCell) { // Get the value // oleGet(objCell,"Value",zellenInhalt); oleGet(objCell,"FormulaR1C1",zellenInhalt); } return zellenInhalt ""; } void setCellContent(OleAutoObj objSheet, int x, int y, string zellenInhalt) { // Das hier brauchen wir, um Parameter an OLE-Objekte // zu übergeben - immer leer machen! OleAutoArgs objArgBlock = create; OleAutoObj objCell; // Das Zellen-Objekt nach Übermittlung der Koordinaten (1,1) clear( objArgBlock ); // Parameter leeren put( objArgBlock, y ); // Parameter 2 put( objArgBlock, x ); // Parameter 1 oleGet(objSheet, "Cells", objArgBlock,objCell); // Das Zellenobjekt nimmt Koordinaten an if (!null objCell) { olePut(objCell,"FormulaR1C1",zellenInhalt); } } void main(void) { // Wenn Excel lokal installiert ist gibt es dieses OLE Objekt im System.. suchs Hasso!!! OleAutoObj objExcel = oleCreateAutoObject( "Excel.Application" ); // Das hier brauchen wir, um Parameter an OLE-Objekte zu übergeben - immer leer machen! OleAutoArgs objArgBlock = create; // Was steht in Application.isVisible? bool isVisible; // Auslesen 1 oleGet(objExcel, "Visible", isVisible); // Auslesen 2 print "Die Anwendung ist momentan " (isVisible?"sichtbar":"unsichtbar") "\n"; // Mache die Anwendung sichtbar Application.isVisible=true; olePut(objExcel, "Visible", true); // Reinschreiben // Ein Woorkbook ist eine Excel-Datei. Excel kann mehrere Dateien öffnen daher die // Collection. Die Collection selbst hat die Open Methode zum einlesen von XLS-Files OleAutoObj objWorkbooks; oleGet(objExcel, "Workbooks", objWorkbooks); // Hole Workbooks Collection // Öffne Excel application string xlsWorkbook="C:\\dev\\alarms.xls"; // Öffne Workbook clear( objArgBlock ); put( objArgBlock, xlsWorkbook); OleAutoObj objWorkbook = null; oleGet(objWorkbooks, "Open",objArgBlock, objWorkbook ); // Reinschreiben Datei zu öffnen und Auslesen oleGet(objWorkbooks, "Add", objWorkbook ); // Falls man die obere Zeile nicht ausfuehrt eins adden // Hole das erste Sheet clear( objArgBlock ) put( objArgBlock, 1 ) oleGet( objWorkbook, "Sheets", objArgBlock, objSheet); // Gib den Namen des ersten Sheets aus string sheetName; oleGet(objSheet, "Name", sheetName); print sheetName "\n"; // Hole das Sheet mit dem Namen adt_warnings_uni.v1.0 clear( objArgBlock ); put( objArgBlock, "adt_alarms_uni.v1.0" ); oleGet( objWorkbook, "Sheets", objArgBlock, objSheet); // Gib den Index des "adt_warnings_uni.v1.0" Sheets aus int sheetIndex; oleGet(objSheet, "Index", sheetIndex); print sheetIndex"\n"; // Hole das Cells(1,1) Objekt um auf die Excel Zellen zuzugreifen print "Zelleninhalt : " getCellContent(objSheet,17,1) "\n"; print "Zelleninhalt : " getCellContent(objSheet,18,1) "\n"; print "Letzte Zeile : " findLastRow(objSheet) "\n"; print "Letzte Spalte :" findLastColumn(objSheet) "\n"; // Iteration durch das Excel Sheet int spaltenCount = findLastColumn(objSheet); int zeilenCount = findLastRow(objSheet); int currentZeile, currentSpalte; string zeilenString=""; Skip texte = create; for (currentZeile=1;currentZeile<zeilenCount;currentZeile++) { DxlObject eqtext = new(); eqtext->"BK_EQtext_english"=getCellContent(objSheet,17,currentZeile) ""; eqtext->"BK_EQtext_german"=getCellContent(objSheet,18,currentZeile) ""; string theKey = getCellContent(objSheet,3,currentZeile) ""; // Delete Brackets and numbers within the key int anfangBrackets=indexOf(theKey, "("); int endeBrackets=lastIndexOf(theKey, ")"); if (anfangBrackets<endeBrackets) { theKey = theKey[0:anfangBrackets-1]; } put(texte,trim(theKey),eqtext); } // Iteration through the SkipList for myIterator in texte do { string keyValue = (string key(texte)); DxlObject currentObject = null; if(find(texte, keyValue, currentObject)) { // Just put the column names here.. it will work //print keyValue "\t"; //print (string currentObject->"BK_EQtext_english") "\t"; //print (string currentObject->"BK_EQtext_german") "\n"; } } Module m = edit("/Project/filder/module", true); Object o; for o in m do { string doorsKey = trim(o."Object Text" ""); if (doorsKey != "" && (o."BK_AlarmType" "" == "Alarm") ) { DxlObject currentObject = null; if (find (texte, doorsKey, currentObject)) { string BK_EQtext_english = (string currentObject->"BK_EQtext_english"); string BK_EQtext_german = (string currentObject->"BK_EQtext_german"); // Zuweisen if(trim(BK_EQtext_english) != "") { o."BK_EQtext_english" = replace(BK_EQtext_english, charOf(30) "", "\n") ""; o."BK_EQtext_german" = replace(BK_EQtext_german, charOf(30) "", "\n") ""; print doorsKey "<<< Da wird was zugwiesen\n"; } } else print "Not found: " doorsKey "\n"; } } // Speicher aufräumen oleCloseAutoObject( objExcel ); } main();
1) What is „FormulaR1C1“ in line 74? I understand it gives value. But is it a keyword in oleAutomation or is it the heading of Column or value present inside the cell or anything else? Your explanation in simple words is much appreciated.
2) Also please let me know in lines 18, 29 the string „UsedRange“ is it also a keyword? How do I know what to write in there? I understand oleUsedRange but not „UsedRange“. Can I write any string (ex:“pen“) in that place? From where do I know this list of words what to write there