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();