open-insight/LSL2/STPROC/EXCEL_SERVICES_DEV.txt
Infineon\StieberD 7762b129af pre cutover push
2024-09-04 20:33:41 -07:00

844 lines
43 KiB
Plaintext

Function Excel_Services_Dev(@Service, @Params)
/***********************************************************************************************************************
This program is proprietary and is not to be used by or disclosed to others, nor is it to be copied without written
permission from SRP Computer Solutions, Inc.
Name : Excel_Services
Description : Handler program for all module related services.
Notes : This service module relies upon the GemBox.Spreadsheet .NET library
(https://www.gemboxsoftware.com/spreadsheet)
Parameters :
Service [in] -- Name of the service being requested
Param1-10 [in/out] -- Additional request parameter holders
Response [out] -- Response to be sent back to the Controller (MCP) or requesting procedure
Metadata :
History : (Date, Initials, Notes)
11/18/17 dmb Original programmer.
06/19/18 dmb Initialize the DocumentObject variable in the GetDocumentObject service.
06/19/18 dmb Make the GemBoxDLLPath and the License string dynamic based on the GetServer service.
***********************************************************************************************************************/
#pragma precomp SRP_PreCompiler
$insert LOGICAL
$insert SERVICE_SETUP
$insert REVDOTNETEQUATES
Equ Tab$ to \09\
Equ CRLF$ to \0D0A\
Equ LF$ to \0A\
Equ Comma$ to ','
GemBoxDLLPath = 'C:\Program Files (x86)\GemBox Software\GemBox.Spreadsheet 4.3\Bin\net35\GemBox.Spreadsheet.dll'
License = 'E0YV-XKIJ-WFKD-LMN7'
Common /ExcelServices/ SpreadsheetInfoObject@, DocumentObjects@, ExcelFileFactoryObjects@, DocumentPaths@, WorksheetsObjects@, WorksheetObjects@, SaveOptionsObjects@, WorksheetObjectsNames@, RowsObjects@, RowObjects@, CellsObjects@, CellObjectsKeyIDs@, CellObjects@
Declare function Excel_Services_Dev, Memory_Services, SRP_List, SRP_FastArray, SRP_Array, Logging_Services
Declare function Environment_Services
Declare subroutine Excel_Services_Dev, Memory_Services, SRP_List, SRP_FastArray, Logging_Services
LogPath = Environment_Services('GetApplicationRootPath') : '\LogFiles\GaNWIP'
LogDate = Oconv(Date(), 'D4/')
LogTime = Oconv(Time(), 'MTS')
LogFileName = LogDate[7, 4] : '-' : LogDate[1, 2] : '-' : LogDate[4, 2] : ' Excel Import Log.csv'
Headers = 'Logging DTM' : @FM : 'Service' : @FM : 'Notes'
objLog = Logging_Services('NewLog', LogPath, LogFileName, CRLF$, Comma$, Headers, '', False$, False$)
LoggingDTM = LogDate : ' ' : LogTime ; // Logging DTM
If DocumentObjects@ EQ '' then
DocumentObjects@ = SRP_List('Create')
ExcelFileFactoryObjects@ = SRP_List('Create')
DocumentPaths@ = SRP_List('Create')
WorksheetsObjects@ = SRP_List('Create')
SaveOptionsObjects@ = SRP_List('Create')
WorksheetObjects@ = SRP_FastArray('Create')
WorksheetObjectsNames@ = SRP_FastArray('Create')
RowsObjects@ = SRP_FastArray('Create')
RowObjects@ = SRP_FastArray('Create')
CellsObjects@ = SRP_FastArray('Create')
CellObjectsKeyIDs@ = SRP_List('Create')
CellObjects@ = SRP_List('Create')
end
GoToService else
Error_Services('Add', Service : ' is not a valid service request within the ' : ServiceModule : ' services module.')
end
Return Response OR ''
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Service Parameter Options
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Options BOOLEAN = True$, False$
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Services
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------------------------------------------------
// OpenDocument
//
// DocumentPath - Path to where the Excel file is located. - [Required]
// DocumentPassword - Password for protected Excel file. - [Optional]
//
// Opens an excel document from the indicated path. If successful it returns an object handle.
//----------------------------------------------------------------------------------------------------------------------
Service OpenDocument(DocumentPath, DocumentPassword)
DocumentObject = ''
If Documentpath NE '' then
DocumentObject = Excel_Services_Dev('GetDocumentObject', DocumentPath, DocumentPassword)
end else
Error_Services('Add', 'DocumentPath argument was missing in the ' : Service : ' service.')
end
Response = DocumentObject
end service
//----------------------------------------------------------------------------------------------------------------------
// NewDocument
//
// Opens a new excel document. If successful it returns an object handle.
//----------------------------------------------------------------------------------------------------------------------
Service NewDocument()
Response = Excel_Services_Dev('GetDocumentObject')
end service
//----------------------------------------------------------------------------------------------------------------------
// SaveDocument
//
// Attempts save the indicated excel document to the indicated path. If DocumentPath is empty, an attempt will be made
// to identify the original path used to open this document. Supports password protected spreadsheets.
//----------------------------------------------------------------------------------------------------------------------
Service SaveDocument(DocumentObject, DocumentPath, DocumentPassword)
debug
If DocumentObject NE '' then
If DocumentPath EQ '' then
Index = SRP_List('Locate', DocumentObjects@, DocumentObject)
DocumentPath = SRP_List('GetAt', DocumentPaths@, Index)
end
If DocumentPath NE '' then
If DocumentPassword NE '' then
// This document has a password, use the XlsxSaveOptions class to pass in the password
// via an XlsxSaveOptions object.
// Start the .NET engine.
DocIndex = SRP_List('Locate', DocumentObjects@, DocumentObject)
XlsxSaveOptionsObject = SRP_List('GetAt', SaveOptionsObjects@, DocIndex)
DocParams = DocumentPath:@FM:XlsxSaveOptionsObject
ParamTypes = 'System.String':@FM:'RevDotNet'
rv = Send_Message.Net(DocumentObject, 'Save', DocParams, ParamTypes, 1)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create DocumentObject in the ' : Service : ' service. Status: ' : StatusCode)
end
end else
rv = Send_Message.Net(DocumentObject, 'Save', DocumentPath)
end
StatusCode = ''
If Get_Status(StatusCode) then
Error_Services('Add', 'Error calling the Save method in the ' : Service : ' service. Status: ' : StatusCode)
end
Excel_Services_Dev('CloseDocument', DocumentObject)
end else
Error_Services('Add', 'Unable to get DocumentPath in the ' : Service : ' service.')
end
end else
Error_Services('Add', 'DocumentObject argument was missing in the ' : Service : ' service.')
end
end service
//----------------------------------------------------------------------------------------------------------------------
// CloseDocument
//
// Attempts to close the indicated excel document. This frees up all .NET objects related to this document object and it
// removes all document object associated information tracked by the labelled common handles that the SRP List and
// SRP FastArray functions utilize.
//----------------------------------------------------------------------------------------------------------------------
Service CloseDocument(DocumentObject)
If DocumentObject NE '' then
DocObjIndex = SRP_List('Locate', DocumentObjects@, DocumentObject)
If DocObjIndex GT 0 then
WorksheetsObject = SRP_List('GetAt', WorksheetsObjects@, DocObjIndex)
WorksheetCount = SRP_FastArray('Count', WorksheetObjects@, DocObjIndex, 0)
If WorksheetCount GT 0 then
For WorksheetNum = 1 to WorksheetCount
WorksheetObject = SRP_FastArray('Extract', WorksheetObjects@, DocObjIndex, WorksheetNum, 1)
Free_Class.Net(WorksheetObject)
Next WorksheetCount
end
AllCellObjectKeyIDs = SRP_List('GetVariable', CellObjectsKeyIDs@, @FM)
Convert '*' to @VM in AllCellObjectKeyIDs
AllCellDocumentObjs = SRP_Array('Rotate', AllCellObjectKeyIDs, @FM, @VM)<1>
Convert @VM to @FM in AllCellDocumentObjs
NumCells = DCount(AllCellDocumentObjs, @FM)
For CellIndex = NumCells to 1 Step -1
If AllCellDocumentObjs<CellIndex> EQ DocumentObject then
SRP_List('RemoveAt', CellObjectsKeyIDs@, CellIndex)
SRP_List('RemoveAt', CellObjects@, CellIndex)
end
Next CellIndex
SRP_FastArray('Delete', CellsObjects@, DocObjIndex, 0, 0)
SRP_FastArray('Delete', RowObjects@, DocObjIndex, 0, 0)
SRP_FastArray('Delete', RowsObjects@, DocObjIndex, 0, 0)
SRP_FastArray('Delete', WorksheetObjects@, DocObjIndex, 0, 0)
SRP_FastArray('Delete', WorksheetObjectsNames@, DocObjIndex, 0, 0)
ExcelFileFactoryObject = SRP_List('GetAt', ExcelFileFactoryObjects@, DocObjIndex)
XlsxSaveOptionsObject = SRP_List('GetAt', SaveOptionsObjects@, DocObjIndex)
Free_Class.Net(WorksheetsObject)
Free_Class.Net(ExcelFileFactoryObject)
Free_Class.Net(DocumentObject)
Free_Class.Net(XlsxSaveOptionsObject)
SRP_List('RemoveAt', WorksheetsObjects@, DocObjIndex)
SRP_List('RemoveAt', DocumentPaths@, DocObjIndex)
SRP_List('RemoveAt', ExcelFileFactoryObjects@, DocObjIndex)
SRP_List('RemoveAt', DocumentObjects@, DocObjIndex)
SRP_List('RemoveAt', SaveOptionsObjects@, DocObjIndex)
end
end else
Error_Services('Add', 'DocumentObject argument was missing in the ' : Service : ' service.')
end
end service
//----------------------------------------------------------------------------------------------------------------------
// DocumentExists
//
// Returns a boolean result as to whether the indicated excel document exists.
//----------------------------------------------------------------------------------------------------------------------
Service DocumentExists(DocumentPath)
Exists = False$ ; // Assume false for now.
If DocumentPath NE '' then
DocumentInfo = Dir(DocumentPath)
If DocumentInfo EQ '' then
Exists = False$
end else
Exists = True$
end
end else
Error_Services('Add', 'DocumentPath argument was missing in the ' : Service : ' service.')
end
Response = Exists
end service
//----------------------------------------------------------------------------------------------------------------------
// GetWorksheet
//
// Returns an object handle to a worksheet.
//----------------------------------------------------------------------------------------------------------------------
Service GetWorksheet(DocumentObject, WorksheetName, AddIfMissing)
If AddIfMissing NE True$ then AddIfMissing = False$
WorksheetObject = Excel_Services_Dev('GetWorksheetObject', DocumentObject, WorksheetName)
If WorksheetObject EQ '' then
If (DocumentObject NE '') AND (WorksheetName NE '') then
If AddIfMissing then
WorksheetObject = Excel_Services_Dev('AddWorksheet', DocumentObject, WorksheetName)
end
end else
Error_Services('Add', 'DocumentObject or WorksheetName argument was missing in the ' : Service : ' service.')
end
end
Response = WorksheetObject
end service
//----------------------------------------------------------------------------------------------------------------------
// AddWorksheet
//
// Attempts to add a worksheet to the indicated excel document object. If successful, the object to the worksheet will
// be returned.
//----------------------------------------------------------------------------------------------------------------------
Service AddWorksheet(DocumentObject, WorksheetName)
WorksheetObject = ''
If (DocumentObject NE '') AND (WorksheetName NE '') then
WorksheetsObject = Excel_Services_Dev('GetWorksheetsObject', DocumentObject)
If Error_Services('NoError') then
rv = Send_Message.Net(WorksheetsObject, 'Add', WorksheetName)
If Get_Status(StatusCode) then
Error_Services('Add', 'Error calling the Add method in the ' : Service : ' service. Status: ' : StatusCode)
end else
WorksheetObject = Excel_Services_Dev('GetWorksheetObject', DocumentObject, WorksheetName)
end
end
end else
Error_Services('Add', 'DocumentObject or WorksheetName argument was missing in the ' : Service : ' service.')
end
Response = WorksheetObject
end service
//----------------------------------------------------------------------------------------------------------------------
// WorksheetExists
//
// Returns a boolean result as to whether the indicated worksheet exists.
//----------------------------------------------------------------------------------------------------------------------
Service WorksheetExists(DocumentObject, WorksheetName)
Exists = False$ ; // Assume false for now.
If (DocumentObject NE '') AND (WorksheetName NE '') then
WorksheetObject = Excel_Services_Dev('GetWorksheetObject', DocumentObject, WorksheetName)
If WorksheetObject EQ '' then
Exists = False$
end else
Exists = True$
end
end else
Error_Services('Add', 'DocumentObject or WorksheetName argument was missing in the ' : Service : ' service.')
end
Response = Exists
end service
//----------------------------------------------------------------------------------------------------------------------
// GetNumRows
//
//
//----------------------------------------------------------------------------------------------------------------------
Service GetNumRows(DocumentObject, WorksheetName)
NumRows = ''
If (DocumentObject NE '') AND (WorksheetName NE '') then
WorksheetObject = Excel_Services_Dev('GetWorksheetObject', DocumentObject, WorksheetName)
If Error_Services('NoError') then
NumRows = Get_Property.Net(WorksheetObject, 'Rows.Count')
If Get_Status(StatusCode) then
Error_Services('Add', 'Error sending message in the ' : Service : ' service. Status: ' : StatusCode)
end
end
end else
Error_Services('Add', 'DocumentObject or WorksheetName argument was missing in the ' : Service : ' service.')
end
Response = NumRows
end service
//----------------------------------------------------------------------------------------------------------------------
// GetCellValue
//
// Attempts to get the value in the indicated cell from the indicated worksheet.
//----------------------------------------------------------------------------------------------------------------------
Service GetCellValue(DocumentObject, WorksheetName, CellColumn, CellRow)
CellValue = ''
If (DocumentObject NE '') AND (WorksheetName NE '') AND (CellColumn NE '') AND (CellRow NE '') then
CellObject = Excel_Services_Dev('GetCellObject', DocumentObject, WorksheetName, CellColumn, CellRow)
If Error_Services('NoError') then
CellValue = Get_Property.Net(CellObject, 'Value')
If Get_Status(StatusCode) then
Error_Services('Add', 'Error getting Value property in the ' : Service : ' service. Status: ' : StatusCode)
end
end
end else
Error_Services('Add', 'DocumentObject, WorksheetName, CellColumn, or CellRow argument was missing in the ' : Service : ' service.')
end
Response = CellValue
end service
//----------------------------------------------------------------------------------------------------------------------
// SetCellValue
//
// Attempts to set the value in the indicated cell from the indicated worksheet.
//----------------------------------------------------------------------------------------------------------------------
Service SetCellValue(DocumentObject, WorksheetName, CellColumn, CellRow, CellValue)
If (DocumentObject NE '') AND (WorksheetName NE '') AND (CellColumn NE '') AND (CellRow NE '') AND (CellValue NE '') then
CellObject = Excel_Services_Dev('GetCellObject', DocumentObject, WorksheetName, CellColumn, CellRow)
If Error_Services('NoError') then
* rv = Set_Property.Net(CellObject, 'Value', CellValue)
If Num(CellValue) then
If Index(CellValue, '.', 1) then
CellType = 'System.Double'
end else
CellType = 'System.Int32'
end
end else
CellType = 'System.String'
end
rv = Send_Message.Net(CellObject, 'SetValue', CellValue, CellType)
If Get_Status(StatusCode) then
Error_Services('Add', 'Error getting Value property in the ' : Service : ' service. Status: ' : StatusCode)
end
end
end else
Error_Services('Add', 'DocumentObject, WorksheetName, CellColumn, CellRow, or CellValue argument was missing in the ' : Service : ' service.')
end
end service
//----------------------------------------------------------------------------------------------------------------------
// GetDocumentObject
//
// DocumentPath - Path to where the log file is located. - [Optional]
// DocumentPassword - Password to Excel Spreadsheet - [Optional]
//
// Returns an object handle to an excel document. If DocumentPath is empty then an object to a new excel document
// is created.
//----------------------------------------------------------------------------------------------------------------------
Service GetDocumentObject(DocumentPath, DocumentPassword)
debug
DocumentObject = ''
XlsxSaveOptionsObject = ''
// Start the .NET engine.
DotNetObject = StartDotNet('')
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create DotNetObject in the ' : Service : ' service. Status: ' : StatusCode)
end else
// Load a .NET assembly. This creates the system object (DotNetObject).
rv = Set_Property.Net(DotNetObject, 'AssemblyName', GemBoxDLLPath)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to load the GemBox .NET assembly in the ' : Service : ' service. Status: ' : StatusCode)
end else
// Create a Spreadsheet handle/class directly from the system object. This is necessary to activate the product license.
If SpreadsheetInfoObject@ EQ '' then
SpreadsheetInfoObject@ = Create_Class.Net(DotNetObject, 'GemBox.Spreadsheet.SpreadsheetInfo', 0)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create SpreadsheetInfoObject in the ' : Service : ' service. Status: ' : StatusCode)
end else
// Set the product license.
rv = Send_Message.Net(SpreadsheetInfoObject@, 'SetLicense', License)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to set license. Status: ' : StatusCode)
end
end
end
If Error_Services('NoError') then
// Create an Excel factory file handle/class directly from the system object.
ExcelFileFactoryObject = Create_Class.Net(DotNetObject, 'GemBox.Spreadsheet.ExcelFile', 0)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create ExcelFileFactoryObject in the ' : Service : ' service. Status: ' : StatusCode)
end else
If DocumentPath NE '' then
// This is is an existing document, use the Load method to create a document object.
If DocumentPassword NE '' then
// This document has a password, use the XlsxLoadOptions class to pass in the password
// via an XlsxLoadOptions object.
XlsxLoadOptionsObject = Create_Class.Net(DotNetObject, 'GemBox.Spreadsheet.XlsxLoadOptions')
rv = Send_Message.Net(XlsxLoadOptionsObject, 'set_Password', DocumentPassword, 'System.String', 1)
XlsxSaveOptionsObject = Create_Class.Net(DotNetObject, 'GemBox.Spreadsheet.XlsxSaveOptions')
rv = Send_Message.Net(XlsxSaveOptionsObject, 'set_Password', DocumentPassword, 'System.String', 1)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create XlsxLoadOptionsObject in the ' : Service : ' service. Status: ' : StatusCode)
end else
DocParams = DocumentPath:@FM:XlsxLoadOptionsObject
ParamTypes = 'System.String':@FM:'RevDotNet'
DocumentObject = Send_Message.Net(ExcelFileFactoryObject, 'Load', DocParams, ParamTypes, 1)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create DocumentObject in the ' : Service : ' service. Status: ' : StatusCode)
end
end
Free_Class.Net(XlsxLoadOptionsObject)
end else
DocumentObject = Send_Message.Net(ExcelFileFactoryObject, 'Load', DocumentPath, 'System.String', 1)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create DocumentObject in the ' : Service : ' service. Status: ' : StatusCode)
end
end
end else
// This this is a new document, the document object will be the excel file factory object.
DocumentObject = ExcelFileFactoryObject
end
end
end
end
end
If Error_Services('NoError') then
DocObjIndex = SRP_List('Add', DocumentObjects@, DocumentObject)
SRP_List('SetAt', ExcelFileFactoryObjects@, DocObjIndex, ExcelFileFactoryObject)
SRP_List('SetAt', DocumentPaths@, DocObjIndex, DocumentPath)
SRP_List('SetAt', SaveOptionsObjects@, DocObjIndex, XlsxSaveOptionsObject)
end else
If Assigned(ExcelFileFactoryObject) then Free_Class.Net(ExcelFileFactoryObject)
If Assigned(DocumentObject) then Free_Class.Net(DocumentObject)
If Assigned(XlsxSaveOptionsObject) then Free_Class.Net(XlsxSaveOptionsObject)
end
Response = DocumentObject
end service
//----------------------------------------------------------------------------------------------------------------------
// GetWorksheetsObject
//
// Returns the worksheets (plural) object for the indicated excel document object.
//----------------------------------------------------------------------------------------------------------------------
Service GetWorksheetsObject(DocumentObject)
WorksheetsObject = ''
DocObjIndex = SRP_List('Locate', DocumentObjects@, DocumentObject)
If DocObjIndex GT 0 then
WorksheetsObject = SRP_List('GetAt', WorksheetsObjects@, DocObjIndex)
If WorksheetsObject EQ '' then
WorksheetsObject = Get_Property.Net(DocumentObject, 'Worksheets', 1)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create WorksheetsObject in the ' : Service : ' service. Status: ' : StatusCode)
end else
SRP_List('SetAt', WorksheetsObjects@, DocObjIndex, WorksheetsObject)
end
end
end else
Error_Services('Add', 'DocumentObject is missing or does not appear to be valid in the ' : Service : ' service.')
end
Response = WorksheetsObject
end service
//----------------------------------------------------------------------------------------------------------------------
// GetWorksheetObject
//
// Returns an object handle to a worksheet.
//----------------------------------------------------------------------------------------------------------------------
Service GetWorksheetObject(DocumentObject, WorksheetName)
WorksheetObject = ''
DocObjIndex = SRP_List('Locate', DocumentObjects@, DocumentObject)
If DocObjIndex GT 0 then
If Worksheetname NE '' then
WSObjsIndex = 0
SRP_FastArray('Match', WorksheetObjectsNames@, WorksheetName, DocObjIndex : '', WSObjsIndex, 0, 'MatchAll')
If WSObjsIndex GT 0 then
WorksheetObject = SRP_FastArray('Extract', WorksheetObjects@, DocObjIndex, WSObjsIndex, 0)
end
If WorksheetObject EQ '' then
WorksheetsObject = Excel_Services_Dev('GetWorksheetsObject', DocumentObject)
If Error_Services('NoError') then
WorksheetCount = Get_Property.Net(WorksheetsObject, 'Count')
If Get_Status(StatusCode) then
Error_Services('Add', 'Error getting WorksheetCount property in the ' : Service : ' service. Status: ' : StatusCode)
end else
WorksheetCount -= 1 ; // This uses zero-based indexing so the first worksheet is 0 rather than 1.
For WorksheetNum = 0 to WorksheetCount
CurrentWorksheetObject = Get_Property.Net(WorksheetsObject, 'Item[' : WorksheetNum : ']', 1)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create CurrentWorksheetObject in the ' : Service : ' service. Status: ' : StatusCode)
end else
Name = Get_Property.Net(CurrentWorksheetObject, 'Name')
If Get_Status(StatusCode) then
Error_Services('Add', 'Error getting Name property in the ' : Service : ' service. Status: ' : StatusCode)
end else
If WorksheetName EQ Name then
WorksheetObject = CurrentWorksheetObject
end
WSObjsIndex = 0
SRP_FastArray('Match', WorksheetObjectsNames@, Name, DocObjIndex : '', WSObjsIndex, 0, 'MatchAll')
If WSObjsIndex EQ 0 then
// Cache the known worksheet objects and associated names for quicker retrieval later.
SRP_FastArray('Insert', WorksheetObjects@, DocObjIndex, -1, 1, CurrentWorksheetObject)
SRP_FastArray('Insert', WorksheetObjectsNames@, DocObjIndex, -1, 1, Name)
end
end
end
While Error_Services('NoError')
Next WorksheetCount
If WorksheetObject EQ '' then
Error_Services('Add', 'Unable to find worksheet ' : WorksheetName : ' in the current excel document in the ' : Service : ' service.')
end
end
end
end
end else
Error_Services('Add', 'WorksheetName argument was missing in the ' : Service : ' service.')
end
end else
Error_Services('Add', 'DocumentObject is missing or does not appear to be valid in the ' : Service : ' service.')
end
Response = WorksheetObject
end service
//----------------------------------------------------------------------------------------------------------------------
// GetCellObject
//
// Attempts to get the value in the indicated cell from the indicated worksheet.
//----------------------------------------------------------------------------------------------------------------------
Service GetCellObject(DocumentObject, WorksheetName, CellColumn, CellRow)
CellObject = ''
DocObjIndex = SRP_List('Locate', DocumentObjects@, DocumentObject)
If DocObjIndex GT 0 then
If (WorksheetName NE '') AND (CellColumn NE '') AND (CellRow NE '') then
OrigCellColumn = CellColumn
OrigCellRow = CellRow
If Not(Num(CellColumn)) then
// CellColumn is presented in alpha format. Convert to number.
Convert @Lower_Case to @Upper_Case in CellColumn
NumColumn = 0
LenCellColumn = Len(CellColumn)
For Int = 1 to LenCellColumn
NumColumn = NumColumn * 26
Char = CellColumn[Int, 1]
NumColumn += (Seq(Char) - Seq('A')) + 1
Next Int
Transfer NumColumn to CellColumn
end
CellColumn -= 1 ; // Adjust or 0-based indexing.
CellRow -= 1 ; // Adjust or 0-based indexing.
WorksheetObject = Excel_Services_Dev('GetWorksheetObject', DocumentObject, WorksheetName)
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'Before debug #1'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
If Error_Services('NoError') then
WSObjsIndex = 0
SRP_FastArray('Match', WorksheetObjectsNames@, WorksheetName, DocObjIndex : '', WSObjsIndex, 0, 'MatchAll')
If WSObjsIndex GT 0 then
// There is enough information to create the flat Key ID that links to this CellObject if it has
// already been created. Look for it now before moving forward.
CellObjectKeyID = DocumentObject : '*' : WorksheetName : '*' : OrigCellColumn : '*' : OrigCellRow
CellObjIndex = SRP_List('Locate', CellObjectsKeyIDs@, CellObjectKeyID)
If CellObjIndex GT 0 then
CellObject = SRP_List('GetAt', CellObjects@, CellObjIndex)
end
end
end
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'After debug #1'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'Before debug #2'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
If Error_Services('NoError') AND (CellObject EQ '') then
// The RowsObject has a 1-to-1 relationship with the WorksheetObject. See if it already exists at the
// same index in WorksheetObjects (WSObjsIndex) that the current WorksheetObject is located in.
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'Before debug #2.1'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
RowsObject = SRP_FastArray('Extract', RowsObjects@, DocObjIndex, WSObjsIndex, 0)
If RowsObject EQ '' then
RowsObject = Get_Property.Net(WorksheetObject, 'Rows', 1)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create the Rows object in the ' : Service : ' service. Status: ' : StatusCode)
end else
SRP_FastArray('Replace', RowsObjects@, DocObjIndex, WSObjsIndex, 0, RowsObject)
end
end
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'After debug #2.1'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
If Error_Services('NoError') then
// The RowObject has a 1-to-Many relationship with the RowsObject. So the same DocumentObject index
// (DocObjIndex) and WorksheetObjects index (WSObjsIndex) will be used. The cell row will be used
// as the third index to find the RowObject.
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'Before debug #2.2'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
RowObject = SRP_FastArray('Extract', RowObjects@, DocObjIndex, WSObjsIndex, OrigCellRow)
If RowObject EQ '' then
RowObject = Get_Property.Net(RowsObject, 'Item[' : CellRow : ']', 1)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create the Item object (Rows) in the ' : Service : ' service. Status: ' : StatusCode)
end else
SRP_FastArray('Replace', RowObjects@, DocObjIndex, WSObjsIndex, OrigCellRow, RowObject)
end
end
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'After debug #2.2'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
If Error_Services('NoError') then
// The CellsObject has a 1-to-1 relationship with the RowObject. Use the same indexes to see if
// it already exists.
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'Before debug #2.3'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
CellsObject = SRP_FastArray('Extract', CellsObjects@, DocObjIndex, WSObjsIndex, OrigCellRow)
If CellsObject EQ '' then
CellsObject = Get_Property.Net(RowObject, 'Cells', 1)
If Get_Status(StatusCode) then
Error_Services('Add', 'Unable to create the Cells object in the ' : Service : ' service. Status: ' : StatusCode)
end else
SRP_FastArray('Replace', CellsObjects@, DocObjIndex, WSObjsIndex, OrigCellRow, CellsObject)
end
end
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'After debug #2.3'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
If Error_Services('NoError') then
// The CellObject has a 1-to-Many relationship with the CellsObject. Since this extends the
// hierarchical relationship to the fourth tier (relatively to the document object, the
// SRP_FastArray function cannot be used. Therefore, a multi-part Key ID will be created
// and this will be stored in a simple list. This list will contain the index to another
// list which stores the cell objects.
LogData = LoggingDTM
LogData<2> = Service
LogData<3> = 'Begin Debug Log'
LogData<4> = 'WorksheetName: ':WorksheetName
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
* LogData<3> = 'Before debug #2.4'
LogData<3> = 'Debug line 1'
LogData<4> = 'CellsObject: ':CellsObject:'CellColumn: ':CellColumn
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
CellObject = Get_Property.Net(CellsObject, 'Item[' : CellColumn : ']', 1)
LogData<3> = 'Debug line 2'
LogData<4> = 'CellObject: ':CellObject:' CellsObject: ':CellsObject:'CellColumn: ':CellColumn
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
If Get_Status(StatusCode) then
LogData<3> = 'Debug line 2.1'
LogData<4> = 'StatusCode: ':StatusCode
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
Error_Services('Add', 'Unable to create the Item object (Cells) in the ' : Service : ' service. Status: ' : StatusCode)
end else
LogData<3> = 'Debug line 2.2'
LogData<4> = 'DocumentObject: ':DocumentObject:' WorksheetName: ':WorksheetName:' OrigCellColumn: ':OrigCellColumn:' OrigCellRow: ':OrigCellRow
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
CellObjectKeyID = DocumentObject : '*' : WorksheetName : '*' : OrigCellColumn : '*' : OrigCellRow
LogData<3> = 'Debug line 2.3'
LogData<4> = 'CellObjectsKeyIDs@: ':CellObjectsKeyIDs@:' CellObjectKeyID: ':CellObjectKeyID
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
SRP_List('Add', CellObjectsKeyIDs@, CellObjectKeyID)
LogData<3> = 'Debug line 2.4'
LogData<4> = 'CellObjects@: ':CellObjects@: 'CellObject: ':CellObject
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
SRP_List('Add', CellObjects@, CellObject)
LogData<3> = 'Debug line 2.5'
Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
end
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'After debug #2.4'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
end
end
end
end
* LogData = LoggingDTM
* LogData<2> = Service
* LogData<3> = 'After debug #2'
* Logging_Services('AppendLog', objLog, LogData, @RM, @FM)
end else
Error_Services('Add', 'WorksheetName, CellColumn, or CellRow argument was missing in the ' : Service : ' service.')
end
end else
Error_Services('Add', 'DocumentObject is missing or does not appear to be valid in the ' : Service : ' service.')
end
Response = CellObject
end service
//----------------------------------------------------------------------------------------------------------------------
// DestroyAllObjects
//
// Destroys all .NET objects that were created. Note: this destroys other.NET objects that may have been created in
// other BASIC+ routines. Use this service when a quick clean slate is needed.
//----------------------------------------------------------------------------------------------------------------------
Service DestroyAllObjects()
Free_Class.Net()
SRP_List('Release', DocumentObjects@)
SRP_List('Release', ExcelFileFactoryObjects@)
SRP_List('Release', DocumentPaths@)
SRP_List('Release', WorksheetsObjects@)
SRP_List('Release', DotNetObjects@)
SRP_FastArray('Release', WorksheetObjects@)
SRP_FastArray('Release', WorksheetObjectsNames@)
SRP_FastArray('Release', RowsObjects@)
SRP_FastArray('Release', RowObjects@)
SRP_FastArray('Release', CellsObjects@)
SRP_List('Release', CellObjectsKeyIDs@)
SRP_List('Release', CellObjects@)
FreeCommon 'EXCELSERVICES'
Memory_Services('ReleaseHashTable')
end service
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Internal GoSubs
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////