IBM Doors DXL: Excel Dateien einlesen mit OLE Automation

Problem

IBM Doors besitzt keine direkte Import-Option für Excel Files. Man geht hier den Umweg über das konvertieren in andere Formate. Manchmal sind mehrere Tools bei einem Import beteiligt.

Ansatz

Durch das direkte Einlesen von Excel Dateien in DXL über OLE Automation kann auf Zellenwerte zugegriffen werden.

Lösung

// 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;
}

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, x );  // Parameter 1
	put( objArgBlock, y );  // Parameter 2
             // Das Zellenobjekt nimmt Koordinaten an
	oleGet(objSheet, "Cells", objArgBlock,objCell); 

	if (!null objCell)
		// Ewig rumprobiert... Value liefert Schrott bei Zahlen (manchmal nix...) 
		// oleGet(objCell,"Value",zellenInhalt);	{

		// Get the value
		oleGet(objCell,"FormulaR1C1",zellenInhalt);
	}
	else return "";

	return 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="N:\\doorsattachments\\alarms.xls";	// Öffne Workbook
	clear( objArgBlock );
	put( objArgBlock, xlsWorkbook);
	OleAutoObj objWorkbook = null;
              // Reinschreiben Datei zu öffnen und Auslesen 
	oleGet(objWorkbooks, "Open",objArgBlock, objWorkbook ); 
	// 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 sheet1
	clear( objArgBlock );
	put( objArgBlock, "sheet1" ); 
	oleGet( objWorkbook, "Sheets", objArgBlock, objSheet);	

	// Gib den Index des "sheet1" 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,1,1) "\n";
	print "Zelleninhalt  : " getCellContent(objSheet,2,2) "\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="";

	for (currentZeile=1;currentZeile<zeilenCount;currentZeile++)
	{
		
		for (currentSpalte=1;currentSpalte<spaltenCount;currentSpalte++)
		{
			zeilenString = zeilenString "" getCellContent(objSheet, //-
                                                      currentSpalte, currentZeile) "\t";	
		}
		print zeilenString "\n";
		zeilenString="";
	}

	// Speicher aufräumen
	oleCloseAutoObject( objExcel );
}

main();