Hi,
a C# wrapper DLL was created. All required DLLs have been provided and copied to the PBW path. I imported the DLL using the .NET DLL Importer as .NET Framework.
Then I created the PowerBuilder source code.
The NVO from the import is correct. The PowerBuilder code in the script has been created.
When executing, the Excel handler is created. When I call the method now, an error always occurs:
"A .NET error has occurred: Object instance does not exist at line 34 in clicked event of object pb_l of w_excelhelper."
I have created the same thing with different code many times. A .NET error always occurs. What am I doing wrong?
Thanks for the help. ( hardcopys attached )
André
w_excel_handler:
// Declaration of a .NET object
// Replace 'PbClosedXmlWrapper' with the namespace of your C# DLL
// Replace 'ExcelHandler' with the name of your C# class
nvo_excelhandler lo_excel_handler
// Data for export (example as a 2D string array)
string ls_data[3,2] // PowerBuilder only natively knows one-dimensional arrays, but .NET interop can pass 2D arrays.
ls_data[1,1] = "Name"
ls_data[1,2] = "Alter"
ls_data[2,1] = "Max Mustermann"
ls_data[2,2] = "30"
ls_data[3,1] = "Erika Musterfrau"
ls_data[3,2] = "25"
string ls_file_path
string ls_sheet_name
string ls_result
ls_file_path = "C:\Temp\MyPowerBuilderExport.xlsx" // Adjust the path!
ls_sheet_name = "PB_Daten"
TRY
// Instantiate the C# class
// lo_excel_handler = CREATE nvo_excelhandler
lo_excel_handler = CREATE USING "nvo_excelhandler"
IF IsNull(lo_excel_handler) THEN
MessageBox("Fehler", "Konnte ExcelHandler nicht instanziieren.")
RETURN
END IF
// Calling the method to create a simple Excel file
//of_createsimpleexcelfile(string as_filepath,string as_sheetname,any as_data,ref string as_errormessage)
ls_result = lo_excel_handler.of_CreateSimpleExcelFile(ls_file_path, ls_sheet_name, ls_data)
MessageBox("Ergebnis", ls_result)
// Example of another method: Excel with Header
string ls_header_text = "Verkaufsbericht Q1"
string ls_sales_data[2,3]
ls_sales_data[1,1] = "Produkt A"
ls_sales_data[1,2] = "100"
ls_sales_data[1,3] = "2000"
ls_sales_data[2,1] = "Produkt B"
ls_sales_data[2,2] = "150"
ls_sales_data[2,3] = "3000"
// of_createexcelwithheaderandformat(string as_filepath,string as_sheetname,string as_headertext,any as_data,ref string as_errormessage)
ls_result = lo_excel_handler.of_CreateExcelWithHeaderAndFormat("C:\Temp\SalesReport.xlsx", "Umsatz", ls_header_text, ls_sales_data)
MessageBox("Ergebnis Header", ls_result)
// Example for reading a value
string ls_read_value
// of_readcellvalue(string as_filepath,string as_sheetname,long al_row,long al_col,ref string as_errormessage)
ls_read_value = lo_excel_handler.of_ReadCellValue(ls_file_path, ls_sheet_name, 2, 1) // Zeile 2, Spalte 1 = "Max Mustermann"
MessageBox("Gelesener Wert", "Wert aus Excel (2,1): " + ls_read_value)
CATCH(Runtimeerror lcx_ex)
MessageBox("Laufzeitfehler", "Ein .NET-Fehler ist aufgetreten: " + lcx_ex.GetMessage())
END TRY
// Cleanup (optional, .NET GC handles references)
IF Not IsNull(lo_excel_handler) THEN
DESTROY lo_excel_handler
END IF
return 0
nvo_excel_handler:
forward
global type nvo_excelhandler from dotnetobject
end type
end forward
global type nvo_excelhandler from dotnetobject
end type
global nvo_excelhandler nvo_excelhandler
type variables
PUBLIC:
String is_assemblypath = "C:\Temp\Projekte\PB\PbClosedXmlWrapper.dll"
String is_classname = "PbClosedXmlWrapper.ExcelHandler"
end variables
forward prototypes
public function boolean of_createsimpleexcelfile(string as_filepath,string as_sheetname,any as_data,ref string as_errormessage)
public function string of_readcellvalue(string as_filepath,string as_sheetname,long al_row,long al_col,ref string as_errormessage)
public function boolean of_createexcelwithheaderandformat(string as_filepath,string as_sheetname,string as_headertext,any as_data,ref string as_errormessage)
end prototypes
...
...