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