OpenOffice рд╕реНрд╡рдЪрд╛рд▓рди: рдЖрд░рдВрдн рдХрд░рдирд╛

рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХреНрд╕реЗрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЙрддрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореБрдХреНрдд рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реЛред
рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, OLE рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рддрдЪреАрдд рдХрд╛ рддрдВрддреНрд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рдерд╛ред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, OpenOffice рдХреЛ C ++ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдкреАрдЖрдИ рддрдХ рд╕реАрдзреЗ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред

рд▓рд┐рдирдХреНрд╕ рдкрд░ рдХрд╛рд░реНрдпрд╛рд▓рдп рдПрдкреАрдЖрдИ рдЦреЛрд▓реЗрдВ

рдкреНрд░рд▓реЗрдЦрди рдмрд╣реБрдд рджреБрд░реНрд▓рдн рдирд┐рдХрд▓рд╛, рдФрд░ OLE рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХреЗ рд▓рдЧрднрдЧ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдереЗред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╣рдм рдкрд░ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рдЕрдкрдиреЗ рд╕рднреА рд╢реЛрдзреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛

рд▓реЗрдЦ рдХреА рдирдореВрдирд╛ рд░реВрдкрд░реЗрдЦрд╛:
1. C ++ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ OpenOffice API рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛
1.1ред рд╣реИрдбрд░ рдЬреЗрдирд░реЗрд╢рди
1.2ред RDB рдЯрд╛рдЗрдк рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдирд╛
1.3ред рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2008 рд╕реЗрдЯрдЕрдк
1.4ред рдПрдХ рдЧрддрд┐рд╢реАрд▓ dll рдмрдирд╛рдПрдБ
2. рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ DLL рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
2.1ред рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЕрдЧрд░ DLL рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ, рддреЛ рдЪрд░рдг 1 рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред


1. C ++ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ OpenOffice API рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛


рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдХрд╛рд░реНрдпрд╛рд▓рдп рд╡рд┐рдХрд┐ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: wiki.services.openoffice.org/wiki/SDKInstallation ред

рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрд╕рдбреАрдХреЗ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╕рд░реНрд╡рд┐рд╕реЗрдЬрд╝ редopenoffice.org/files/able рдкрддрд╛ред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрд╕рдбреАрдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдПрд╕рдбреАрдХреЗ рдХреЛ рдХрд┐рд╕реА рднреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рд╕рд╣рд╛рдпрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ gnu make, zip (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ)

1.1ред рд╣реИрдбрд░ рдЬреЗрдирд░реЗрд╢рди

рдПрд╕рдбреАрдХреЗ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ рдПрдХ setdkenv_windows.bat рдмреИрдЪ рдлрд╝рд╛рдЗрд▓ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рдФрд░ рдмреИрдЪ рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХрд░рддреА рд╣реИред
рд╣рдо рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рджреЗрдХрд░ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред
рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдмреИрдЪ рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рдПрдЧреАред
рд╣рдо рдХрдВрд╕реЛрд▓ рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рдЙрддреНрдкрдиреНрди рдмреИрдЪ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрд╕реА рддреИрдпрд╛рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╣рдо рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред

рдЬрдирд░реЗрд╢рди рдЯреАрдо:
cppumaker -Gc -BUCR -O "c:\Program Files\OpenOffice_SDK\sdk\inludecpp" "c:\Program Files\OpenOffice.org 3\URE\misc\types.rdb" "c:\Program Files\OpenOffice.org 3\Basis\program\offapi.rdb"

рдЬрд╣рд╛рдБ
c: \ Program Files \ OpenOffice_SDK \ sdk \ inludecpp - рд╡рд╣ рдлрд╝реЛрд▓реНрдбрд░ рдЬрд╣рд╛рдБ рд╣рдо рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВрдЧреЗ
c: \ Program Files \ OpenOffice.org 3 \ - рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдкрде

1.2ред RDB рдлрд╝рд╛рдЗрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЖрд░рдбреАрдмреА рдлрд╝рд╛рдЗрд▓ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
RDB рдлрд╝рд╛рдЗрд▓ OpenOffice рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреА рддрд░рд╣ рд╣реИред

рдпрд╣ рдХрдорд╛рдВрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
"C:\Program Files\OpenOffice.org 3\URE\bin\regmerge" "d:\oo\OOAPI\Debug\OOAPI.rdb" / "c:\Program Files\OpenOffice.org 3\URE\misc\types.rdb"

рдЬрд╣рд╛рдБ C: \ Program Files \ OpenOffice.org 3 \ _ рдХрд╛рд░реНрдпрд╛рд▓рдп рдХрд╛ рдорд╛рд░реНрдЧ рд╣реИ
d: \ oo \ OOAPI \ Debug \ - рд╡рд╣ рдкрде рдЬрд╣рд╛рдБ рдлрд╝рд╛рдЗрд▓ рдЬреЗрдирд░реЗрдЯ рдХреА рдЬрд╛рдПрдЧреА

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ:
"C:\Program Files\OpenOffice.org 3\URE\bin\regcomp" -register -r "d:\oo\OOAPI\Debug\OOAPI.rdb" -c connector.uno.dll
"C:\Program Files\OpenOffice.org 3\URE\bin\regcomp" -register -r "d:\oo\OOAPI\Debug\OOAPI.rdb" -c remotebridge.uno.dll
"C:\Program Files\OpenOffice.org 3\URE\bin\regcomp" -register -r "d:\oo\OOAPI\Debug\OOAPI.rdb" -c bridgefac.uno.dll
"C:\Program Files\OpenOffice.org 3\URE\bin\regcomp" -register -r "d:\oo\OOAPI\Debug\OOAPI.rdb" -c uuresolver.uno.dll


1.3ред рд╡рд┐рдЬреБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2008 рд╕реЗрдЯрдЕрдк

рд╣рдо рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓реЗрдВ рдФрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

рдЙрдкрдХрд░рдг -> рд╡рд┐рдХрд▓реНрдк-> рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ>> рдХреБрд▓рдкрддрд┐ + рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ -> рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
рдЙрддреНрдкрдиреНрди рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝реЛрд▓реНрдбрд░ рдЬреЛрдбрд╝реЗрдВ: <oo_sdk_path> \ inludecpp
рдЙрдкрдХрд░рдг -> рд╡рд┐рдХрд▓реНрдк-> рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ>> рдХреБрд▓рдкрддрд┐ + рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ -> рдкреБрд╕реНрддрдХрд╛рд▓рдп рдлрд╛рдЗрд▓реЗрдВ
<oo_sdk_path> \ lib рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬреЛрдбрд╝реЗрдВ

рдЙрдкрдХрд░рдг -> рд╡рд┐рдХрд▓реНрдк-> рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ>> рдХреБрд▓рдкрддрд┐ + рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ -> рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдлрд╛рдЗрд▓реЗрдВ
<office_programm_dir> \ Program рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬреЛрдбрд╝реЗрдВ

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЧреБрдг:
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ "рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди" рдореЗрдВ рдмрджрд▓реЗрдВ
рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдЬреЛрдбрд╝реЗрдВ
рдЧреБрдг-> рд▓рд┐рдВрдХрд░-> рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдХреЛрдорд╛рдВрдбрд▓рд╛рдЗрди
рдпрд╛ рддреЛ рдЬреЛрдбрд╝реЗрдВ:
isal.lib icppu.lib icppuhelper.lib рдЗрд╕рд╛рд▓.рд▓рд┐рдм isalhelper.lib ireg.lib irmcxt.lib stlport_vc71.lib

рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред

1.4ред рдПрдХ рдЧрддрд┐рд╢реАрд▓ dll рдмрдирд╛рдПрдБ

рдХрдИ рдЙрдкрдпреЛрдЧреА рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: wiki.services.openoffice.org/wiki/Calc/API-Programming

DLL рдХреА рдХрд╛рд░реНрдп рдпреЛрдЬрдирд╛ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
- рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо рдЖрд░рдбреАрдмреА рдлрд╝рд╛рдЗрд▓ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреАрдврд╝реА рд╣реЛрддреА рд╣реИред
рдХрдиреЗрдХреНрдЯ, genRdb рдлрд╝рдВрдХреНрд╢рди
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдХрд╛рд░реНрдпрд╛рд▓рдп рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЖрд░рдбреАрдмреА рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
- рд╣рдо рдУрдкрдирдСрдлрд┐рд╕ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ
startServer, getOOPath рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕реЗ рдХрд╛рд░реНрдпрд╛рд▓рдп рд╕рд░реНрд╡рд░ рдХрд╛ рдкрддрд╛ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛рд░реНрдпрд╛рд▓рдп рд╕рд░реНрд╡рд░ рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ
- рдПрдХ рдирдпрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдп рдлрд╝реНрд░реЗрдо рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдпрд╛ xls рдлрд╝рд╛рдЗрд▓ рдЖрдпрд╛рдд рдХреА рдЬрд╛рддреА рд╣реИред
- рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ
рдирд┐рд░реНрдпрд╛рдд рдбрд┐рд╕реНрдХ рдХреЗ рд▓рд┐рдП xls рдлрд╝рд╛рдЗрд▓
рдлрдВрдХреНрд╢рди ExportToUrl
- рд░рд┐рд╡рд░реНрд╕ рдореЗрдХреЗрдирд┐рдЬреНрдо рднреА рд╕рдВрднрд╡ рд╣реИ: xls рдлрд╛рдЗрд▓ рдФрд░ рдЙрд╕рд╕реЗ рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛
рдлрд╝рдВрдХреНрд╢рди getVal, getText

рдореИрдВ DLL рдХреЛрдб рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реВрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╣реЛрдВрдЧреАред рдкреВрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

ooapi.h:
 //    #define OOAPI3 __declspec(dllexport) #define WNT 1 #include <stdio.h> #include <wchar.h> #include <sal/main.h> #include <cppuhelper/bootstrap.hxx> #include <osl/file.hxx> #include <osl/process.h> // ,    #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/bridge/XUnoUrlResolver.hpp> #include <com/sun/star/frame/XComponentLoader.hpp> #include <com/sun/star/lang/XMultiComponentFactory.hpp> #include <com/sun/star/registry/XSimpleRegistry.hpp> #include <com/sun/star/sheet/XSpreadsheetDocument.hpp> #include <com/sun/star/sheet/XSpreadsheet.hpp> #include <com/sun/star/container/XIndexAccess.hpp> #include <com/sun/star/table/XCellRange.hpp> #include <com/sun/star/table/BorderLine.hpp> #include <com/sun/star/table/CellHoriJustify.hpp> #include <com/sun/star/table/XColumnRowRange.hpp> #include <com/sun/star/table/XMergeableCell.hpp> #include <com/sun/star/table/XMergeableCellRange.hpp> #include <com/sun/star/table/TableBorder.hpp> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/frame/XStorable.hpp> #include <com/sun/star/util/XMergeable.hpp> #include <string> #include <locale> #include <io.h> #include <iostream> #include <sstream> using namespace rtl; using namespace std; using namespace com::sun::star::uno; using namespace com::sun::star::lang; using namespace com::sun::star::beans; using namespace com::sun::star::bridge; using namespace com::sun::star::frame; using namespace com::sun::star::registry; using namespace com::sun::star::sheet; using namespace com::sun::star::table; using namespace com::sun::star::container; using namespace com::sun::star::util; //  OOAPI3 bool connect(const char *file, bool hidden); OOAPI3 void disconnect(); OOAPI3 bool selectSheet(short sheet); OOAPI3 void setVal(int, int, double); OOAPI3 void setText(int x, int y, const wchar_t *text); OOAPI3 bool setBold(int x, int y); OOAPI3 bool setFontColor(int x, int y, int r, int g, int b); OOAPI3 bool setBgColor(int x, int y, int r, int g, int b); OOAPI3 bool setFontSize(int x, int y, short size); OOAPI3 bool setItalic(int x, int y); OOAPI3 bool setHoriz(int x, int y, short hor); OOAPI3 bool setBorders(int x, int y, bool lft, bool tp, bool rt, bool dn, short r, short g, short b); OOAPI3 bool setColWidth(int col, long width); OOAPI3 bool mergeRange(const char *range); OOAPI3 bool exportToUrl(const wchar_t *url); OOAPI3 double getVal(int x, int y); OOAPI3 wchar_t* getText(int x, int y); OOAPI3 bool isWin(); OOAPI3 bool isInstall(); 


ooapi.cpp:
 #include "stdafx.h" //  wine, ,     bool isWin() { // wine #ifdef ISWIN return ISWIN; #endif HMODULE h = LoadLibrary(L"ntdll.dll"); bool win = (h != NULL); if(h != NULL) { win = GetProcAddress(h, "wine_get_version") == NULL; FreeLibrary(h); } #define ISWIN win printf("module load on win: %u\n", win); return win; } //    ,     string getOOPath() { //   ,        #ifdef OOPATH return OOPATH; #endif string path; //     HKEY hKey = NULL; wchar_t * buf = NULL; ULONG dim = 0; RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Classes\\opendocument.CalcDocument.1\\protocol\\StdFileEditing\\server"), 0, KEY_ALL_ACCESS, &hKey ); RegQueryValueEx(hKey, TEXT(""), NULL, NULL, NULL, &dim); buf = new wchar_t[dim + 1]; RegQueryValueEx(hKey, TEXT(""), NULL, NULL, (UCHAR*)buf, &dim); RegCloseKey(hKey); // unicode  string wstring upath(buf); ostringstream stm ; const ctype<char>& ctfacet = use_facet< ctype<char> >( stm.getloc() ) ; for( size_t i=0 ; i < upath.size() ; ++i ) stm << ctfacet.narrow( upath[i], 0 ) ; path = stm.str(); delete buf; if(path == "") return ""; // ,     path = path.substr(0, path.length()-20); printf("server path: %s\n", path.c_str()); #define OOPATH path return path; } //  void createProcess(string app) { STARTUPINFO StartupInfo; ZeroMemory(&StartupInfo,sizeof(StartupInfo)); StartupInfo.cb = sizeof(StartupInfo); StartupInfo.dwFlags = STARTF_USESHOWWINDOW; StartupInfo.wShowWindow = SW_MAXIMIZE; PROCESS_INFORMATION ProcessInfo; // //      wine,    RDB    int len = lstrlenA(app.c_str()); BSTR utext = SysAllocStringLen(NULL, len); ::MultiByteToWideChar(CP_ACP, 0, app.c_str(), len, utext, len); ::SysFreeString(utext); //  if (CreateProcess(NULL, utext,NULL,NULL,false,CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS, NULL,NULL,&StartupInfo,&ProcessInfo)) { if (ProcessInfo.hProcess != NULL) { //,     while (WaitForSingleObject(ProcessInfo.hProcess,200) == WAIT_TIMEOUT) { Sleep(100); } } } } //  RDB   void genRDB() { string rdb = "OOAPI.rdb"; if(access("OOAPI.rdb",0) != -1) { //rdb   return; } printf("generate RDB\n"); //    wine // RDB  string oopath = getOOPath(); string oogen = "\"" + oopath + "\\URE\\bin\\regmerge\" \"" + rdb + "\" / \"" + oopath + "\\URE\\misc\\types.rdb\" \"" + oopath + "\\Basis\\program\\offapi.rdb\""; createProcess(oogen); // string regpath; regpath = "\"" + oopath + "\\URE\\bin\\regcomp\" -register -r \"" + rdb + "\" -c connector.uno.dll"; createProcess(regpath); regpath = "\"" + oopath + "\\URE\\bin\\regcomp\" -register -r \"" + rdb + "\" -c remotebridge.uno.dll"; createProcess(regpath); regpath = "\"" + oopath + "\\URE\\bin\\regcomp\" -register -r \"" + rdb + "\" -c bridgefac.uno.dll"; createProcess(regpath); regpath = "\"" + oopath + "\\URE\\bin\\regcomp\" -register -r \"" + rdb + "\" -c uuresolver.uno.dll"; createProcess(regpath); } //  ,      ,   -  :) bool isInstall() { return getOOPath() != ""; } // ,      void startServer() { string server_path; server_path = "\"" + getOOPath() + "\\program\\soffice\" \"-accept=socket,host=localhost,port=2083;urp;StarOffice.ServiceManager\""; //createProcess(server_path); //  WinExec(server_path.c_str(), SW_HIDE); } //#########   // Reference< XComponent > xComponent; //  Any rSheet; Reference< XMultiComponentFactory > xMultiComponentFactoryClient_copy; //  ,        bool connect(const char *file, bool hidden) { //    SAL_IMPLEMENT_MAIN_WITH_ARGS //  sal_main() sal_detail_initialize(NULL, NULL); //  ,     OUString sConnectionString(RTL_CONSTASCII_USTRINGPARAM("uno:socket,host=localhost,port=2083;urp;StarOffice.ServiceManager")); //  OUString sFileString = OUString::createFromAscii(file); //     genRDB(); //   startServer(); printf("init server start OK\n"); // RDB  Reference< XSimpleRegistry > xSimpleRegistry(::cppu::createSimpleRegistry() ); xSimpleRegistry->open( OUString( RTL_CONSTASCII_USTRINGPARAM( "OOAPI.rdb") ), sal_True, sal_False ); printf("init rdb OK\n"); //-  , //           UNO  open office Reference< XComponentContext > xComponentContext(::cppu::bootstrap_InitialComponentContext( xSimpleRegistry ) ); Reference< XMultiComponentFactory > xMultiComponentFactoryClient( xComponentContext->getServiceManager() ); xMultiComponentFactoryClient_copy = xMultiComponentFactoryClient; Reference< XInterface > xInterface = xMultiComponentFactoryClient->createInstanceWithContext( OUString::createFromAscii( "com.sun.star.bridge.UnoUrlResolver" ), xComponentContext ); Reference< XUnoUrlResolver > resolver( xInterface, UNO_QUERY ); printf("init OK\n"); // ,       -     int i = 200; while(i > 0) { try { Sleep(300); xInterface = Reference< XInterface >( resolver->resolve( sConnectionString ), UNO_QUERY ); i = 0; } catch ( Exception& e ) { i--; if(i == 0) { //    printf("can not connect to server FAIL\n"); return false; } } } printf("connect to server OK\n"); Reference< XPropertySet > xPropSet( xInterface, UNO_QUERY ); xPropSet->getPropertyValue( OUString::createFromAscii("DefaultContext") ) >>= xComponentContext; Reference< XMultiComponentFactory > xMultiComponentFactoryServer( xComponentContext->getServiceManager() ); Reference < XComponentLoader > xComponentLoader( xMultiComponentFactoryServer->createInstanceWithContext( OUString( RTL_CONSTASCII_USTRINGPARAM("com.sun.star.frame.Desktop" ) ), xComponentContext ), UNO_QUERY ); printf("before create OK\n"); string fl = file; if(fl.find(".xls") != string::npos) { // xls  Sequence<PropertyValue> props(2); props[0].Name = OUString::createFromAscii( "FilterName" ); props[0].Value <<= OUString::createFromAscii( "MS Excel 97" ); // wine ,     if(hidden) { props[1].Name = OUString::createFromAscii( "Hidden" ); props[1].Value <<= hidden; } xComponent = xComponentLoader->loadComponentFromURL(sFileString, OUString( RTL_CONSTASCII_USTRINGPARAM("_blank") ), 0, props); } else { //         Sequence<PropertyValue> props(1); if(hidden) { props[0].Name = OUString::createFromAscii( "Hidden" ); props[0].Value <<= hidden; } //   xComponent = xComponentLoader->loadComponentFromURL(sFileString, OUString( RTL_CONSTASCII_USTRINGPARAM("_blank") ), 0, props); } printf("create oocalc OK\n"); return true; } //   bool selectSheet(short sheet) { //  Reference< XSpreadsheetDocument > rSheetDoc (xComponent, UNO_QUERY); Reference< XSpreadsheets > rSheets = rSheetDoc->getSheets(); //    Reference< XIndexAccess > rSheetsByIndex (rSheets, UNO_QUERY); try { rSheet = rSheetsByIndex->getByIndex( (short)sheet ); } catch( Exception &e ) { disconnect(); return false; } return true; } //   void setVal(int x, int y, double val) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); //   Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); //   rCell->setValue(val); } //    void setText(int x, int y, const wchar_t *text) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); rCell->setFormula(OUString::OUString(text)); } //    bool setBold(int x, int y) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); try { Reference< XPropertySet > rCellProps (rCell, UNO_QUERY); Any mPropVal; mPropVal <<= makeAny((short)150); rCellProps->setPropertyValue(OUString::createFromAscii("CharWeight"), mPropVal); return true; } catch( Exception &e ) { return false; } } //  bool setItalic(int x, int y) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); try { Reference< XPropertySet > rCellProps (rCell, UNO_QUERY); Any mPropVal4; mPropVal4 <<= makeAny((short)2); rCellProps->setPropertyValue(OUString::createFromAscii("CharPosture"), mPropVal4); return true; } catch( Exception &e ) { return false; } } //   bool setFontColor(int x, int y, int r, int g, int b) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); try { Reference< XPropertySet > rCellProps (rCell, UNO_QUERY); Any mPropVal1; mPropVal1 <<= makeAny(RGB(b,g,r)); rCellProps->setPropertyValue(OUString::createFromAscii("CharColor"), mPropVal1); return true; } catch( Exception &e ) { return false; } } //   bool setBgColor(int x, int y, int r, int g, int b) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); try { Reference< XPropertySet > rCellProps (rCell, UNO_QUERY); Any mPropVal1; mPropVal1 <<= makeAny(RGB(b,g,r)); rCellProps->setPropertyValue(OUString::createFromAscii("CellBackColor"), mPropVal1); return true; } catch( Exception &e ) { return false; } } //   bool setFontSize(int x, int y, short size) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); try { Reference< XPropertySet > rCellProps (rCell, UNO_QUERY); Any mPropVal3; mPropVal3 <<= makeAny((short)size); rCellProps->setPropertyValue(OUString::createFromAscii("CharHeight"), mPropVal3); return true; } catch( Exception &e ) { return false; } } //    bool setHoriz(int x, int y, short hor) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); try { Reference< XPropertySet > rCellProps (rCell, UNO_QUERY); Any mPropVal5; mPropVal5 <<= makeAny((short)hor); rCellProps->setPropertyValue(OUString::createFromAscii("HoriJustify"), mPropVal5); return true; } catch( Exception &e ) { return false; } } //    bool setBorders(int x, int y, bool lft, bool tp, bool rt, bool dn, short r, short g, short b) { try { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); Reference< XPropertySet > rCellProps (rCell, UNO_QUERY); BorderLine bl; bl.Color = RGB(b,g,r); //rgb   ? bl.OuterLineWidth = 10; TableBorder b; if(lft) b.LeftLine = bl; if(tp) b.TopLine = bl; if(rt) b.RightLine = bl; if(dn) b.BottomLine = bl; b.VerticalLine = b.HorizontalLine = bl; b.IsVerticalLineValid = true; b.IsHorizontalLineValid = true; b.IsLeftLineValid = lft; b.IsRightLineValid = rt; b.IsTopLineValid = tp; b.IsBottomLineValid = dn; rCellProps->setPropertyValue(OUString::createFromAscii("TableBorder"),makeAny(b)); return true; } catch( Exception &e ) { return false; } } //     bool setColWidth(int col, long width) { try { Reference< XColumnRowRange > rSheetColRange (rSheet, UNO_QUERY); Reference< XTableColumns > rSheetColumns = rSheetColRange->getColumns(); Any rCol = rSheetColumns->getByIndex(col); Reference< XPropertySet > rColProps (rCol, UNO_QUERY); rColProps->setPropertyValue(OUString::createFromAscii("Width"),makeAny(width*100)); return true; } catch( Exception &e ) { return false; } } //  bool mergeRange(const char *range) { try { Reference< XCellRange > rSheetCellRange (rSheet, UNO_QUERY); Reference< XCellRange> rCellRange = rSheetCellRange->getCellRangeByName(OUString::createFromAscii(range)); Reference< XMergeable > rSheetCellMerge (rCellRange, UNO_QUERY); rSheetCellMerge->merge(true); return true; } catch( Exception &e ) { return false; } } // xls    bool exportToUrl(const wchar_t *url) { try { Reference<XStorable> xStore (xComponent, UNO_QUERY); Sequence<PropertyValue> storeProps(1); storeProps[0].Name = OUString::createFromAscii( "FilterName" ); storeProps[0].Value <<= OUString::createFromAscii( "MS Excel 97" ); xStore->storeToURL( OUString::OUString(url), storeProps ); return true; } catch( Exception &e ) { return false; } } //    double getVal(int x, int y) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); return rCell->getValue(); } //    () wchar_t* getText(int x, int y) { Reference< XSpreadsheet > rSpSheet (rSheet, UNO_QUERY); Reference< XCell > rCell = rSpSheet->getCellByPosition(x, y); OUString buf = rCell->getFormula(); return buf.pData->buffer; } // void disconnect() { Reference< XComponent >::query( xMultiComponentFactoryClient_copy )->dispose(); sal_detail_deinitialize(); } 


рдЕрдВрддрд┐рдо рдЪреИрдЯ: Excel рдореЗрдВ рд▓реЛрдб рдФрд░ рдЕрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП DLL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

Source: https://habr.com/ru/post/In116151/


All Articles