IBM Doors DXL: Excel OLE Automation ein- und auslesen von Werten / Zellen

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

Ein Gedanke zu „IBM Doors DXL: Excel OLE Automation ein- und auslesen von Werten / Zellen“

  1. 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.