Merge branch 'main' into fix-issue-1013-part2

This commit is contained in:
Domi Bigl 2024-08-30 19:17:16 +02:00 committed by GitHub
commit 8a463e9378
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
51 changed files with 1407 additions and 385 deletions

17
.github/workflows/unit.yml vendored Normal file
View File

@ -0,0 +1,17 @@
name: unit
on:
pull_request:
permissions:
contents: read
jobs:
unit:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm install
- run: npm test

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
node_modules/
package-lock.json
output
foo.zip
foo.xlsx
foo

1
.npmrc Normal file
View File

@ -0,0 +1 @@
ignore-scripts=true

View File

@ -186,7 +186,7 @@ Apache License
same "printed page" as the copyright notice for easier same "printed page" as the copyright notice for easier
identification within third-party archives. identification within third-party archives.
Copyright {yyyy} {name of copyright owner} Copyright 2010 abap2xlsx Contributors
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.

61
abap_transpile.json Normal file
View File

@ -0,0 +1,61 @@
{
"input_folder": "{src,test}",
"input_filter": [
"src/zcl_excel_a",
"src/zcl_excel_c",
"src/zcl_excel_d",
"src/zcl_excel_fill_template",
"src/zcl_excel_font TODO, missing TDFONTSIZE",
"src/zcl_excel_g",
"src/zcl_excel_h",
"src/zcl_excel_l",
"src/zcl_excel_o",
"src/zcl_excel_r",
"src/zcl_excel_s",
"src/zcl_excel_t",
"src/zcl_excel_w",
"src/zcl_excel.clas",
"src/zcx_",
"src/zexcel_.*doma",
"src/zexcel_.*dtel",
"src/not_cloud/zexcel_.*dtel",
"src/not_cloud/zexcel_.*doma",
"src/zexcel_c",
"src/zexcel_p",
"src/zexcel_s",
"src/zexcel_t",
"src/zif_",
"test/"
],
"output_folder": "output",
"lib": "https://github.com/open-abap/open-abap",
"write_unit_tests": true,
"write_source_map": true,
"options": {
"ignoreSyntaxCheck": false,
"addFilenames": true,
"addCommonJS": true,
"unknownTypes": "runtimeError",
"skip": [
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_number", "note": "SXML in open-abap currently only handles json, todo"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_shared_string", "note": "SXML in open-abap currently only handles json, todo"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_shared_string_missing", "note": "??"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_inline_string", "note": "??"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_empty_cells", "note": "??"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_boolean", "note": "SXML in open-abap currently only handles json, todo"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_style", "note": "??"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_style_missing", "note": "??"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_formula", "note": "??"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_read_shared_strings", "note": "??"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_shared_string_some_empty", "note": "??"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_shared_string_multi_style", "note": "??"},
{"object": "ZCL_EXCEL_READER_HUGE_FILE", "class": "lcl_test", "method": "test_skip_to_inexistent", "note": "??"},
{"object": "ZCL_EXCEL_WRITER_2007", "class": "ltc_column_formula", "method": "one_column_formula", "note": "?? CALL TRANSFORMATION xml_header = 'no'"},
{"object": "ZCL_EXCEL_WRITER_2007", "class": "ltc_column_formula", "method": "two_column_formulas", "note": "??"},
{"object": "ZCL_EXCEL_COMMON", "class": "ltc_utclong_to_excel_string", "method": "simple", "note": "?? missing method CL_ABAP_TSTMP=>UTCLONG2TSTMP_SHORT, I'm too lazy to add it today"},
{"object": "ZCL_EXCEL_COMMON", "class": "lcl_excel_common_test", "method": "convert_column2int_oob_empty", "note": "?? sy value defaults"}
]
}
}

16
package.json Normal file
View File

@ -0,0 +1,16 @@
{
"license": "MIT",
"private": true,
"scripts": {
"test": "rm -rf output && abap_transpile abap_transpile.json && echo RUNNING && node output/index.mjs"
},
"repository": {
"type": "git",
"url": "git+https://github.com/abap2xlsx/abap2xlsx.git"
},
"devDependencies": {
"@abaplint/cli": "^2.112.10",
"@abaplint/transpiler-cli": "^2.10.9",
"@abaplint/runtime": "^2.10.9"
}
}

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD04V>
<ROLLNAME>ZEXCEL_COLUMN_ID</ROLLNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<HEADLEN>30</HEADLEN>
<SCRLEN1>10</SCRLEN1>
<SCRLEN2>15</SCRLEN2>
<SCRLEN3>20</SCRLEN3>
<DDTEXT>ALV control: Column ID</DDTEXT>
<REPTEXT>Column ID</REPTEXT>
<SCRTEXT_S>Column ID</SCRTEXT_S>
<SCRTEXT_M>Column ID</SCRTEXT_M>
<SCRTEXT_L>Column ID</SCRTEXT_L>
<DTELMASTER>D</DTELMASTER>
<DATATYPE>INT4</DATATYPE>
<LENG>000010</LENG>
<OUTPUTLEN>000011</OUTPUTLEN>
</DD04V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD04V>
<ROLLNAME>ZEXCEL_COMPONENT_POSITION</ROLLNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<HEADLEN>06</HEADLEN>
<SCRLEN1>10</SCRLEN1>
<SCRLEN2>15</SCRLEN2>
<SCRLEN3>20</SCRLEN3>
<DDTEXT>Position of the field in the table</DDTEXT>
<REPTEXT>TabPos</REPTEXT>
<SCRTEXT_S>Table pos.</SCRTEXT_S>
<SCRTEXT_M>Table position</SCRTEXT_M>
<SCRTEXT_L>Table position</SCRTEXT_L>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
<DTELMASTER>D</DTELMASTER>
<DATATYPE>NUMC</DATATYPE>
<LENG>000004</LENG>
<OUTPUTLEN>000004</OUTPUTLEN>
</DD04V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD01V>
<DOMNAME>ZEXCEL_CONVEXIT</DOMNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DATATYPE>CHAR</DATATYPE>
<LENG>000005</LENG>
<OUTPUTLEN>000005</OUTPUTLEN>
<DDTEXT>Conversion routine</DDTEXT>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
</DD01V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD04V>
<ROLLNAME>ZEXCEL_CONVEXIT</ROLLNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DOMNAME>ZEXCEL_CONVEXIT</DOMNAME>
<HEADLEN>30</HEADLEN>
<SCRLEN1>10</SCRLEN1>
<SCRLEN2>15</SCRLEN2>
<SCRLEN3>20</SCRLEN3>
<DDTEXT>Conversion Routine</DDTEXT>
<REPTEXT>Conversion Routine</REPTEXT>
<SCRTEXT_S>Conv.Rout.</SCRTEXT_S>
<SCRTEXT_M>Convers. Rout.</SCRTEXT_M>
<SCRTEXT_L>Conversion Routine</SCRTEXT_L>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
<DTELMASTER>D</DTELMASTER>
<REFKIND>D</REFKIND>
</DD04V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD01V>
<DOMNAME>ZEXCEL_DDIC_FLAG</DOMNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DATATYPE>CHAR</DATATYPE>
<LENG>000001</LENG>
<OUTPUTLEN>000001</OUTPUTLEN>
<VALEXI>X</VALEXI>
<DDTEXT>Flag (X or blank)</DDTEXT>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
</DD01V>
<DD07V_TAB>
<DD07V>
<VALPOS>0001</VALPOS>
<DDLANGUAGE>E</DDLANGUAGE>
<DDTEXT>Do not set flag</DDTEXT>
</DD07V>
<DD07V>
<VALPOS>0002</VALPOS>
<DDLANGUAGE>E</DDLANGUAGE>
<DOMVALUE_L>X</DOMVALUE_L>
<DDTEXT>Set flag</DDTEXT>
</DD07V>
</DD07V_TAB>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD01V>
<DOMNAME>ZEXCEL_DISP_TEXT_LONG</DOMNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DATATYPE>CHAR</DATATYPE>
<LENG>000040</LENG>
<OUTPUTLEN>000040</OUTPUTLEN>
<LOWERCASE>X</LOWERCASE>
<DDTEXT>Long keyword</DDTEXT>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
</DD01V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD04V>
<ROLLNAME>ZEXCEL_DISP_TEXT_LONG</ROLLNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DOMNAME>ZEXCEL_DISP_TEXT_LONG</DOMNAME>
<HEADLEN>30</HEADLEN>
<SCRLEN1>10</SCRLEN1>
<SCRLEN2>15</SCRLEN2>
<SCRLEN3>20</SCRLEN3>
<DDTEXT>Long Field Label</DDTEXT>
<REPTEXT>Long Field Label</REPTEXT>
<SCRTEXT_S>Long</SCRTEXT_S>
<SCRTEXT_M>Long Fld Label</SCRTEXT_M>
<SCRTEXT_L>Long field label</SCRTEXT_L>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
<DTELMASTER>D</DTELMASTER>
<DEFFDNAME>SCRTEXT_L</DEFFDNAME>
<REFKIND>D</REFKIND>
</DD04V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD01V>
<DOMNAME>ZEXCEL_DISP_TEXT_MEDIUM</DOMNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DATATYPE>CHAR</DATATYPE>
<LENG>000020</LENG>
<OUTPUTLEN>000020</OUTPUTLEN>
<LOWERCASE>X</LOWERCASE>
<DDTEXT>Medium keyword</DDTEXT>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
</DD01V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD04V>
<ROLLNAME>ZEXCEL_DISP_TEXT_MEDIUM</ROLLNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DOMNAME>ZEXCEL_DISP_TEXT_MEDIUM</DOMNAME>
<HEADLEN>30</HEADLEN>
<SCRLEN1>10</SCRLEN1>
<SCRLEN2>15</SCRLEN2>
<SCRLEN3>20</SCRLEN3>
<DDTEXT>Medium Field Label</DDTEXT>
<REPTEXT>Medium Field Label</REPTEXT>
<SCRTEXT_S>Medium</SCRTEXT_S>
<SCRTEXT_M>Medium Label</SCRTEXT_M>
<SCRTEXT_L>Medium Field Label</SCRTEXT_L>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
<DTELMASTER>D</DTELMASTER>
<DEFFDNAME>SCRTEXT_M</DEFFDNAME>
<REFKIND>D</REFKIND>
</DD04V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DOMA" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD01V>
<DOMNAME>ZEXCEL_DISP_TEXT_SHORT</DOMNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DATATYPE>CHAR</DATATYPE>
<LENG>000010</LENG>
<OUTPUTLEN>000010</OUTPUTLEN>
<LOWERCASE>X</LOWERCASE>
<DDTEXT>Short keyword</DDTEXT>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
</DD01V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD04V>
<ROLLNAME>ZEXCEL_DISP_TEXT_SHORT</ROLLNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DOMNAME>ZEXCEL_DISP_TEXT_SHORT</DOMNAME>
<HEADLEN>30</HEADLEN>
<SCRLEN1>10</SCRLEN1>
<SCRLEN2>15</SCRLEN2>
<SCRLEN3>20</SCRLEN3>
<DDTEXT>Short Field Label</DDTEXT>
<REPTEXT>Short field label</REPTEXT>
<SCRTEXT_S>Short</SCRTEXT_S>
<SCRTEXT_M>ShortFieldLabel</SCRTEXT_M>
<SCRTEXT_L>Short field label</SCRTEXT_L>
<APPLCLASS>SDIC</APPLCLASS>
<AUTHCLASS>01</AUTHCLASS>
<DTELMASTER>D</DTELMASTER>
<DEFFDNAME>SCRTEXT_S</DEFFDNAME>
<REFKIND>D</REFKIND>
</DD04V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD04V>
<ROLLNAME>ZEXCEL_KEY_COLOR_OVERRIDE</ROLLNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DOMNAME>CHAR1</DOMNAME>
<DDTEXT>ALV control: Override key color</DDTEXT>
<DTELMASTER>D</DTELMASTER>
<REFKIND>D</REFKIND>
</DD04V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -7,6 +7,7 @@
<DDLANGUAGE>E</DDLANGUAGE> <DDLANGUAGE>E</DDLANGUAGE>
<TABCLASS>INTTAB</TABCLASS> <TABCLASS>INTTAB</TABCLASS>
<DDTEXT>Color information for cells</DDTEXT> <DDTEXT>Color information for cells</DDTEXT>
<MASTERLANG>E</MASTERLANG>
<EXCLASS>3</EXCLASS> <EXCLASS>3</EXCLASS>
</DD02V> </DD02V>
<DD03P_TABLE> <DD03P_TABLE>
@ -36,7 +37,7 @@
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>NOKEYCOL</FIELDNAME> <FIELDNAME>NOKEYCOL</FIELDNAME>
<ROLLNAME>LVC_NOKEYC</ROLLNAME> <ROLLNAME>ZEXCEL_KEY_COLOR_OVERRIDE</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>

View File

@ -7,15 +7,14 @@
<DDLANGUAGE>E</DDLANGUAGE> <DDLANGUAGE>E</DDLANGUAGE>
<TABCLASS>INTTAB</TABCLASS> <TABCLASS>INTTAB</TABCLASS>
<DDTEXT>Field catalog for converter</DDTEXT> <DDTEXT>Field catalog for converter</DDTEXT>
<MASTERLANG>E</MASTERLANG>
<EXCLASS>4</EXCLASS> <EXCLASS>4</EXCLASS>
</DD02V> </DD02V>
<DD03P_TABLE> <DD03P_TABLE>
<DD03P> <DD03P>
<FIELDNAME>TABNAME</FIELDNAME> <FIELDNAME>TABNAME</FIELDNAME>
<ROLLNAME>TABNAME</ROLLNAME> <ROLLNAME>TABNAME</ROLLNAME>
<CHECKTABLE>DD02L</CHECKTABLE>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<SHLPORIGIN>P</SHLPORIGIN>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
<DD03P> <DD03P>
@ -32,7 +31,7 @@
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>POSITION</FIELDNAME> <FIELDNAME>POSITION</FIELDNAME>
<ROLLNAME>TABFDPOS</ROLLNAME> <ROLLNAME>ZEXCEL_COMPONENT_POSITION</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
@ -54,19 +53,19 @@
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>SCRTEXT_S</FIELDNAME> <FIELDNAME>SCRTEXT_S</FIELDNAME>
<ROLLNAME>SCRTEXT_S</ROLLNAME> <ROLLNAME>ZEXCEL_DISP_TEXT_SHORT</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>SCRTEXT_M</FIELDNAME> <FIELDNAME>SCRTEXT_M</FIELDNAME>
<ROLLNAME>SCRTEXT_M</ROLLNAME> <ROLLNAME>ZEXCEL_DISP_TEXT_MEDIUM</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>SCRTEXT_L</FIELDNAME> <FIELDNAME>SCRTEXT_L</FIELDNAME>
<ROLLNAME>SCRTEXT_L</ROLLNAME> <ROLLNAME>ZEXCEL_DISP_TEXT_LONG</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
@ -160,53 +159,17 @@
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>COL_ID</FIELDNAME> <FIELDNAME>COL_ID</FIELDNAME>
<ROLLNAME>LVC_COLID</ROLLNAME> <ROLLNAME>ZEXCEL_COLUMN_ID</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>CONVEXIT</FIELDNAME> <FIELDNAME>CONVEXIT</FIELDNAME>
<ROLLNAME>CONVEXIT</ROLLNAME> <ROLLNAME>ZEXCEL_CONVEXIT</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
</DD03P_TABLE> </DD03P_TABLE>
<DD05M_TABLE>
<DD05M>
<FIELDNAME>TABNAME</FIELDNAME>
<FORTABLE>ZEXCEL_S_CONVERTER_FCAT</FORTABLE>
<FORKEY>TABNAME</FORKEY>
<CHECKTABLE>DD02L</CHECKTABLE>
<CHECKFIELD>TABNAME</CHECKFIELD>
<PRIMPOS>0001</PRIMPOS>
<DOMNAME>AS4TAB</DOMNAME>
<DATATYPE>CHAR</DATATYPE>
</DD05M>
<DD05M>
<FIELDNAME>TABNAME</FIELDNAME>
<FORTABLE>&apos;A&apos;</FORTABLE>
<CHECKTABLE>DD02L</CHECKTABLE>
<CHECKFIELD>AS4LOCAL</CHECKFIELD>
<PRIMPOS>0002</PRIMPOS>
<DOMNAME>AS4LOCAL</DOMNAME>
<DATATYPE>CHAR</DATATYPE>
</DD05M>
<DD05M>
<FIELDNAME>TABNAME</FIELDNAME>
<FORTABLE>&apos;0000&apos;</FORTABLE>
<CHECKTABLE>DD02L</CHECKTABLE>
<CHECKFIELD>AS4VERS</CHECKFIELD>
<PRIMPOS>0003</PRIMPOS>
<DOMNAME>AS4VERS</DOMNAME>
<DATATYPE>NUMC</DATATYPE>
</DD05M>
</DD05M_TABLE>
<DD08V_TABLE>
<DD08V>
<FIELDNAME>TABNAME</FIELDNAME>
<CHECKTABLE>DD02L</CHECKTABLE>
</DD08V>
</DD08V_TABLE>
</asx:values> </asx:values>
</asx:abap> </asx:abap>
</abapGit> </abapGit>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_DTEL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD04V>
<ROLLNAME>ZEXCEL_SCREEN_DISPLAY</ROLLNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<DOMNAME>ZEXCEL_DDIC_FLAG</DOMNAME>
<HEADLEN>02</HEADLEN>
<SCRLEN1>10</SCRLEN1>
<SCRLEN2>15</SCRLEN2>
<SCRLEN3>20</SCRLEN3>
<DDTEXT>Flag: Field is displayed on dynpro</DDTEXT>
<REPTEXT>SF</REPTEXT>
<SCRTEXT_S>Dynpro</SCRTEXT_S>
<SCRTEXT_M>Screen field</SCRTEXT_M>
<SCRTEXT_L>Screen field</SCRTEXT_L>
<APPLCLASS>SDIC</APPLCLASS>
<DTELMASTER>D</DTELMASTER>
<REFKIND>D</REFKIND>
</DD04V>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -3,7 +3,7 @@
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"> <asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values> <asx:values>
<DEVC> <DEVC>
<CTEXT>Spreadsheet libraries</CTEXT> <CTEXT>ABAP2XLSX</CTEXT>
</DEVC> </DEVC>
</asx:values> </asx:values>
</asx:abap> </asx:abap>

View File

@ -19,7 +19,7 @@ CLASS zcl_excel_autofilter DEFINITION
tr_textfilter2 TYPE RANGE OF string, tr_textfilter2 TYPE RANGE OF string,
END OF ts_filter . END OF ts_filter .
TYPES: TYPES:
tt_filters TYPE HASHED TABLE OF ts_filter WITH UNIQUE KEY column . tt_filters TYPE SORTED TABLE OF ts_filter WITH UNIQUE KEY column .
DATA filter_area TYPE zexcel_s_autofilter_area . DATA filter_area TYPE zexcel_s_autofilter_area .
CONSTANTS mc_filter_rule_single_values TYPE tv_filter_rule VALUE 'single_values'. "#EC NOTEXT CONSTANTS mc_filter_rule_single_values TYPE tv_filter_rule VALUE 'single_values'. "#EC NOTEXT
@ -208,9 +208,6 @@ CLASS zcl_excel_autofilter IMPLEMENTATION.
METHOD is_row_hidden. METHOD is_row_hidden.
DATA: lr_filter TYPE REF TO ts_filter,
lv_col TYPE i.
FIELD-SYMBOLS: <ls_filter> TYPE ts_filter. FIELD-SYMBOLS: <ls_filter> TYPE ts_filter.
rv_is_hidden = abap_false. rv_is_hidden = abap_false.
@ -219,29 +216,25 @@ CLASS zcl_excel_autofilter IMPLEMENTATION.
* 1st row of filter area is never hidden, because here the filter * 1st row of filter area is never hidden, because here the filter
* symbol is being shown * symbol is being shown
*--------------------------------------------------------------------* *--------------------------------------------------------------------*
IF iv_row = me->filter_area-row_start. IF iv_row <= me->filter_area-row_start OR
iv_row > me->filter_area-row_end.
RETURN. RETURN.
ENDIF. ENDIF.
lv_col = me->filter_area-col_start. LOOP AT mt_filters ASSIGNING <ls_filter> WHERE column >= me->filter_area-col_start
AND column <= me->filter_area-col_end.
WHILE lv_col <= me->filter_area-col_end.
lr_filter = me->get_column_filter( lv_col ).
ASSIGN lr_filter->* TO <ls_filter>.
CASE <ls_filter>-rule. CASE <ls_filter>-rule.
WHEN mc_filter_rule_single_values. WHEN mc_filter_rule_single_values.
rv_is_hidden = me->is_row_hidden_single_values( iv_row = iv_row rv_is_hidden = me->is_row_hidden_single_values( iv_row = iv_row
iv_col = lv_col iv_col = <ls_filter>-column
is_filter = <ls_filter> ). is_filter = <ls_filter> ).
WHEN mc_filter_rule_text_pattern. WHEN mc_filter_rule_text_pattern.
rv_is_hidden = me->is_row_hidden_text_pattern( iv_row = iv_row rv_is_hidden = me->is_row_hidden_text_pattern( iv_row = iv_row
iv_col = lv_col iv_col = <ls_filter>-column
is_filter = <ls_filter> ). is_filter = <ls_filter> ).
ENDCASE. ENDCASE.
@ -250,10 +243,7 @@ CLASS zcl_excel_autofilter IMPLEMENTATION.
RETURN. RETURN.
ENDIF. ENDIF.
ENDLOOP.
ADD 1 TO lv_col.
ENDWHILE.
ENDMETHOD. ENDMETHOD.

View File

@ -5,29 +5,73 @@ CLASS zcl_excel_comment DEFINITION
PUBLIC SECTION. PUBLIC SECTION.
CONSTANTS default_right_column TYPE i VALUE 4. "#EC NOTEXT
CONSTANTS default_bottom_row TYPE i VALUE 15. "#EC NOTEXT
METHODS constructor . METHODS constructor .
METHODS get_name METHODS get_bottom_offset
RETURNING RETURNING
VALUE(r_name) TYPE string . VALUE(rp_result) TYPE i .
METHODS get_bottom_row
RETURNING
VALUE(rp_result) TYPE i .
METHODS get_index METHODS get_index
RETURNING RETURNING
VALUE(rp_index) TYPE string . VALUE(rp_index) TYPE string .
METHODS get_left_column
RETURNING
VALUE(rp_result) TYPE i .
METHODS get_left_offset
RETURNING
VALUE(rp_result) TYPE i .
METHODS get_name
RETURNING
VALUE(r_name) TYPE string .
METHODS get_ref METHODS get_ref
RETURNING RETURNING
VALUE(rp_ref) TYPE string . VALUE(rp_ref) TYPE string .
METHODS get_right_column
RETURNING
VALUE(rp_result) TYPE i .
METHODS get_right_offset
RETURNING
VALUE(rp_result) TYPE i .
METHODS get_text METHODS get_text
RETURNING RETURNING
VALUE(rp_text) TYPE string . VALUE(rp_text) TYPE string .
METHODS get_top_offset
RETURNING
VALUE(rp_result) TYPE i .
METHODS get_top_row
RETURNING
VALUE(rp_result) TYPE i .
METHODS set_text METHODS set_text
IMPORTING IMPORTING
!ip_text TYPE string !ip_text TYPE string
!ip_ref TYPE string OPTIONAL . !ip_ref TYPE string OPTIONAL
!ip_left_column TYPE i DEFAULT 2
!ip_left_offset TYPE i DEFAULT 15
!ip_top_row TYPE i DEFAULT 11
!ip_top_offset TYPE i DEFAULT 10
!ip_right_column TYPE i DEFAULT default_right_column
!ip_right_offset TYPE i DEFAULT 31
!ip_bottom_row TYPE i DEFAULT default_bottom_row
!ip_bottom_offset TYPE i DEFAULT 9.
PROTECTED SECTION. PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
DATA bottom_offset TYPE i .
DATA bottom_row TYPE i .
DATA index TYPE string . DATA index TYPE string .
DATA ref TYPE string . DATA ref TYPE string .
DATA left_column TYPE i .
DATA left_offset TYPE i .
DATA right_column TYPE i .
DATA right_offset TYPE i .
DATA text TYPE string . DATA text TYPE string .
DATA top_offset TYPE i .
DATA top_row TYPE i .
ENDCLASS. ENDCLASS.
@ -40,11 +84,31 @@ CLASS zcl_excel_comment IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD get_bottom_offset.
rp_result = bottom_offset.
ENDMETHOD.
METHOD get_bottom_row.
rp_result = bottom_row.
ENDMETHOD.
METHOD get_index. METHOD get_index.
rp_index = me->index. rp_index = me->index.
ENDMETHOD. ENDMETHOD.
METHOD get_left_column.
rp_result = left_column.
ENDMETHOD.
METHOD get_left_offset.
rp_result = left_offset.
ENDMETHOD.
METHOD get_name. METHOD get_name.
ENDMETHOD. ENDMETHOD.
@ -55,16 +119,57 @@ CLASS zcl_excel_comment IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD get_right_column.
rp_result = right_column.
ENDMETHOD.
METHOD get_right_offset.
rp_result = right_offset.
ENDMETHOD.
METHOD get_text. METHOD get_text.
rp_text = me->text. rp_text = me->text.
ENDMETHOD. ENDMETHOD.
METHOD get_top_offset.
rp_result = top_offset.
ENDMETHOD.
METHOD get_top_row.
rp_result = top_row.
ENDMETHOD.
METHOD set_text. METHOD set_text.
me->text = ip_text. me->text = ip_text.
IF ip_ref IS SUPPLIED. IF ip_ref IS SUPPLIED.
me->ref = ip_ref. me->ref = ip_ref.
ENDIF. ENDIF.
me->left_column = ip_left_column.
me->left_offset = ip_left_offset.
me->top_row = ip_top_row.
me->top_offset = ip_top_offset.
IF ip_right_column IS NOT INITIAL.
me->right_column = ip_right_column.
ELSE.
me->right_column = default_right_column.
ENDIF.
me->right_offset = ip_right_offset.
IF ip_bottom_row IS NOT INITIAL.
me->bottom_row = ip_bottom_row.
ELSE.
me->bottom_row = default_bottom_row.
ENDIF.
me->bottom_offset = ip_bottom_offset.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -102,9 +102,22 @@ CLASS zcl_excel_common DEFINITION
VALUE(ev_unescaped_string) TYPE string VALUE(ev_unescaped_string) TYPE string
RAISING RAISING
zcx_excel . zcx_excel .
"! <p class="shorttext synchronized" lang="en">Convert date from Excel format to SAP</p>
"! @parameter ip_value | String being an Excel number representing a date (e.g. 45141 means 2023/08/03,
"! 45141.58832 means 2023/08/03 14:07:11). Important: if the input is date +
"! time, use the additional parameter IP_EXACT = 'X'.
"! @parameter ip_exact | If the input value also contains the time i.e. a fractional part exists
"! (e.g. 45141.58832 means 2023/08/03 14:07:11), ip_exact = 'X' will
"! return the exact date (e.g. 2023/08/03), while ip_exact = ' ' (default) will
"! return the rounded-up date (e.g. 2023/08/04). NB: this rounding-up doesn't
"! happen if the time is before 12:00:00.
"! @parameter ep_value | Date corresponding to the input Excel number. It returns a null date if
"! the input value contains non-numeric characters.
"! @raising zcx_excel | The numeric input corresponds to a date before 1900/1/1 or after 9999/12/31.
CLASS-METHODS excel_string_to_date CLASS-METHODS excel_string_to_date
IMPORTING IMPORTING
!ip_value TYPE zexcel_cell_value !ip_value TYPE zexcel_cell_value
!ip_exact TYPE abap_bool DEFAULT abap_false
RETURNING RETURNING
VALUE(ep_value) TYPE d VALUE(ep_value) TYPE d
RAISING RAISING
@ -153,6 +166,11 @@ CLASS zcl_excel_common DEFINITION
!ip_value TYPE t !ip_value TYPE t
RETURNING RETURNING
VALUE(ep_value) TYPE zexcel_cell_value . VALUE(ep_value) TYPE zexcel_cell_value .
CLASS-METHODS utclong_to_excel_string
IMPORTING
!ip_utclong TYPE any
RETURNING
VALUE(ep_value) TYPE zexcel_cell_value .
TYPES: t_char10 TYPE c LENGTH 10. TYPES: t_char10 TYPE c LENGTH 10.
TYPES: t_char255 TYPE c LENGTH 255. TYPES: t_char255 TYPE c LENGTH 255.
CLASS-METHODS split_file CLASS-METHODS split_file
@ -860,11 +878,16 @@ CLASS zcl_excel_common IMPLEMENTATION.
METHOD excel_string_to_date. METHOD excel_string_to_date.
DATA: lv_date_int TYPE i. DATA: lv_date_int TYPE i.
DATA lv_error_text TYPE string.
CHECK ip_value IS NOT INITIAL AND ip_value CN ' 0'. CHECK ip_value IS NOT INITIAL AND ip_value CN ' 0'.
TRY. TRY.
IF ip_exact = abap_false.
lv_date_int = ip_value. lv_date_int = ip_value.
ELSE.
lv_date_int = trunc( ip_value ).
ENDIF.
IF lv_date_int NOT BETWEEN 1 AND 2958465. IF lv_date_int NOT BETWEEN 1 AND 2958465.
zcx_excel=>raise_text( 'Unable to interpret date' ). zcx_excel=>raise_text( 'Unable to interpret date' ).
ENDIF. ENDIF.
@ -876,7 +899,8 @@ CLASS zcl_excel_common IMPLEMENTATION.
ep_value = ep_value + 1. ep_value = ep_value + 1.
ENDIF. ENDIF.
CATCH cx_sy_conversion_error. CATCH cx_sy_conversion_error.
zcx_excel=>raise_text( 'Index out of bounds' ). lv_error_text = |String "{ ip_value }" is not a valid Excel date|.
zcx_excel=>raise_text( lv_error_text ).
ENDTRY. ENDTRY.
ENDMETHOD. ENDMETHOD.
@ -898,7 +922,7 @@ CLASS zcl_excel_common IMPLEMENTATION.
TRY. TRY.
lv_day_fraction = ip_value. lv_day_fraction = frac( ip_value ).
lv_seconds_in_day = lv_day_fraction * lc_seconds_in_day. lv_seconds_in_day = lv_day_fraction * lc_seconds_in_day.
ep_value = lv_seconds_in_day. ep_value = lv_seconds_in_day.
@ -1706,4 +1730,19 @@ CLASS zcl_excel_common IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD utclong_to_excel_string.
DATA lv_timestamp TYPE timestamp.
DATA lv_date TYPE d.
DATA lv_time TYPE t.
" The data type UTCLONG and the method UTCLONG2TSTMP_SHORT are not available before ABAP 7.54
" -> Need of a dynamic call to avoid compilation error before ABAP 7.54
CALL METHOD cl_abap_tstmp=>('UTCLONG2TSTMP_SHORT')
EXPORTING utclong = ip_utclong
RECEIVING timestamp = lv_timestamp.
CONVERT TIME STAMP lv_timestamp TIME ZONE 'UTC ' INTO DATE lv_date TIME lv_time.
ep_value = |{ date_to_excel_string( lv_date ) + time_to_excel_string( lv_time ) }|.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -55,6 +55,7 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING
METHODS excel_string_to_time3 FOR TESTING RAISING cx_static_check. METHODS excel_string_to_time3 FOR TESTING RAISING cx_static_check.
METHODS excel_string_to_time4 FOR TESTING RAISING cx_static_check. METHODS excel_string_to_time4 FOR TESTING RAISING cx_static_check.
METHODS excel_string_to_time5 FOR TESTING RAISING cx_static_check. METHODS excel_string_to_time5 FOR TESTING RAISING cx_static_check.
METHODS excel_string_to_time6 FOR TESTING RAISING cx_static_check.
METHODS time_to_excel_string1 FOR TESTING RAISING cx_static_check. METHODS time_to_excel_string1 FOR TESTING RAISING cx_static_check.
METHODS time_to_excel_string2 FOR TESTING RAISING cx_static_check. METHODS time_to_excel_string2 FOR TESTING RAISING cx_static_check.
METHODS time_to_excel_string3 FOR TESTING RAISING cx_static_check. METHODS time_to_excel_string3 FOR TESTING RAISING cx_static_check.
@ -125,12 +126,25 @@ CLASS lcl_excel_common_test DEFINITION FOR TESTING
METHODS is_cell_in_range_upperside_out FOR TESTING. METHODS is_cell_in_range_upperside_out FOR TESTING.
METHODS is_cell_in_range_rightside_out FOR TESTING. METHODS is_cell_in_range_rightside_out FOR TESTING.
METHODS is_cell_in_range_lowerside_out FOR TESTING. METHODS is_cell_in_range_lowerside_out FOR TESTING.
METHODS recursive_struct_to_class FOR TESTING RAISING cx_static_check.
METHODS escape_string_whitespace1 FOR TESTING. METHODS escape_string_whitespace1 FOR TESTING.
METHODS escape_string_whitespace2 FOR TESTING. METHODS escape_string_whitespace2 FOR TESTING.
METHODS escape_string_whitespace3 FOR TESTING. METHODS escape_string_whitespace3 FOR TESTING.
METHODS escape_string_quote FOR TESTING. METHODS escape_string_quote FOR TESTING.
METHODS escape_string_hyphen FOR TESTING. METHODS escape_string_hyphen FOR TESTING.
METHODS escape_string_regular FOR TESTING. METHODS escape_string_regular FOR TESTING.
ENDCLASS.
CLASS ltc_utclong_to_excel_string DEFINITION
FOR TESTING
RISK LEVEL HARMLESS
DURATION SHORT.
PRIVATE SECTION.
METHODS simple FOR TESTING.
ENDCLASS. ENDCLASS.
@ -686,6 +700,45 @@ CLASS lcl_excel_common_test IMPLEMENTATION.
level = if_aunit_constants=>fatal level = if_aunit_constants=>fatal
). ).
ENDTRY. ENDTRY.
* 45141.58832 (2023/08/03 14:07:11) ip_exact = abap_false -> 2023/08/04
TRY.
ep_value = zcl_excel_common=>excel_string_to_date( ip_value = '45141.58832'
ip_exact = abap_false ).
cl_abap_unit_assert=>assert_equals(
act = ep_value
exp = '20230804' ).
CATCH zcx_excel INTO lx_excel.
cl_abap_unit_assert=>fail(
msg = 'unexpected exception'
level = if_aunit_constants=>critical ).
ENDTRY.
* 45141.58832 (2023/08/03 14:07:11) ip_exact = abap_true -> 2023/08/03
TRY.
ep_value = zcl_excel_common=>excel_string_to_date( ip_value = '45141.58832'
ip_exact = abap_true ).
cl_abap_unit_assert=>assert_equals(
act = ep_value
exp = '20230803' ).
CATCH zcx_excel INTO lx_excel.
cl_abap_unit_assert=>fail(
msg = 'unexpected exception'
level = if_aunit_constants=>critical ).
ENDTRY.
* 45141.48832 (2023/08/03 11:43:11) ip_exact = abap_false -> 2023/08/03
TRY.
ep_value = zcl_excel_common=>excel_string_to_date( ip_value = '45141.48832'
ip_exact = abap_false ).
cl_abap_unit_assert=>assert_equals(
act = ep_value
exp = '20230803' ).
CATCH zcx_excel INTO lx_excel.
cl_abap_unit_assert=>fail(
msg = 'unexpected exception'
level = if_aunit_constants=>critical ).
ENDTRY.
ENDMETHOD. "excel_String_To_Date ENDMETHOD. "excel_String_To_Date
@ -765,6 +818,21 @@ CLASS lcl_excel_common_test IMPLEMENTATION.
ENDTRY. ENDTRY.
ENDMETHOD. ENDMETHOD.
METHOD excel_string_to_time6.
DATA ep_value TYPE t.
* 45141.58832 (2023/08/03 14:07:11) -> 14:07:11
TRY.
ep_value = zcl_excel_common=>excel_string_to_time( ip_value = '45141.58832' ).
cl_abap_unit_assert=>assert_equals(
act = ep_value
exp = '140711' ).
CATCH zcx_excel INTO lx_excel.
cl_abap_unit_assert=>fail( lx_excel->get_text( ) ).
ENDTRY.
ENDMETHOD.
METHOD time_to_excel_string1. METHOD time_to_excel_string1.
DATA ep_value TYPE zexcel_cell_value. DATA ep_value TYPE zexcel_cell_value.
@ -1647,6 +1715,29 @@ CLASS lcl_excel_common_test IMPLEMENTATION.
ENDTRY. ENDTRY.
ENDMETHOD. "is_cell_in_range_lowerside_out. ENDMETHOD. "is_cell_in_range_lowerside_out.
METHOD recursive_struct_to_class.
DATA style TYPE REF TO zcl_excel_style.
DATA complete_style TYPE zexcel_s_cstyle_complete.
DATA complete_stylex TYPE zexcel_s_cstylex_complete.
CREATE OBJECT style.
complete_style-number_format-format_code = 'hello'.
complete_stylex-number_format-format_code = abap_true.
zcl_excel_common=>recursive_struct_to_class(
EXPORTING
i_source = complete_style
i_sourcex = complete_stylex
CHANGING
e_target = style ).
cl_abap_unit_assert=>assert_equals(
act = style->number_format->format_code
exp = 'hello' ).
ENDMETHOD.
METHOD escape_string_hyphen. METHOD escape_string_hyphen.
DATA: name TYPE string, DATA: name TYPE string,
escaped_name TYPE string. escaped_name TYPE string.
@ -1732,3 +1823,33 @@ CLASS lcl_excel_common_test IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.
CLASS ltc_utclong_to_excel_string IMPLEMENTATION.
METHOD simple.
FIELD-SYMBOLS <lv_typekind_utclong> TYPE abap_typekind.
FIELD-SYMBOLS <lv_utclong> TYPE simple.
DATA lo_rtti_utclong TYPE REF TO cl_abap_datadescr.
DATA lv_variable_utclong TYPE REF TO data.
DATA lv_excel_string TYPE zexcel_cell_value.
" Skip this test before ABAP 7.54 (UTCLONG does not exist).
" Need of dynamic referencing and dynamic call to avoid compilation error before ABAP 7.54.
ASSIGN ('CL_ABAP_TYPEDESCR=>TYPEKIND_UTCLONG') TO <lv_typekind_utclong>.
IF sy-subrc <> 0.
RETURN.
ENDIF.
CALL METHOD cl_abap_elemdescr=>('GET_UTCLONG')
RECEIVING p_result = lo_rtti_utclong.
CREATE DATA lv_variable_utclong TYPE HANDLE lo_rtti_utclong.
ASSIGN lv_variable_utclong->* TO <lv_utclong>.
<lv_utclong> = '2024-08-04 19:47:00.9999999'.
lv_excel_string = zcl_excel_common=>utclong_to_excel_string( <lv_utclong> ).
cl_abap_unit_assert=>assert_equals( exp = '45508.82430555555556'
act = lv_excel_string ).
ENDMETHOD.
ENDCLASS.

View File

@ -5,6 +5,21 @@ CLASS zcl_excel_font DEFINITION
PUBLIC SECTION. PUBLIC SECTION.
TYPES ty_font_height TYPE n LENGTH 3.
CONSTANTS lc_default_font_height TYPE ty_font_height VALUE '110' ##NO_TEXT.
CONSTANTS lc_default_font_name TYPE zexcel_style_font_name VALUE 'Calibri' ##NO_TEXT.
CLASS-METHODS calculate_text_width
IMPORTING
!iv_font_name TYPE zexcel_style_font_name
!iv_font_height TYPE ty_font_height
!iv_flag_bold TYPE abap_bool
!iv_flag_italic TYPE abap_bool
!iv_cell_value TYPE zexcel_cell_value
RETURNING
VALUE(rv_width) TYPE f .
PROTECTED SECTION.
PRIVATE SECTION.
TYPES: TYPES:
BEGIN OF mty_s_font_metric, BEGIN OF mty_s_font_metric,
char TYPE c LENGTH 1, char TYPE c LENGTH 1,
@ -17,7 +32,7 @@ CLASS zcl_excel_font DEFINITION
TYPES: TYPES:
BEGIN OF mty_s_font_cache, BEGIN OF mty_s_font_cache,
font_name TYPE zexcel_style_font_name, font_name TYPE zexcel_style_font_name,
font_height TYPE tdfontsize, font_height TYPE ty_font_height,
flag_bold TYPE abap_bool, flag_bold TYPE abap_bool,
flag_italic TYPE abap_bool, flag_italic TYPE abap_bool,
th_font_metrics TYPE mty_th_font_metrics, th_font_metrics TYPE mty_th_font_metrics,
@ -27,21 +42,8 @@ CLASS zcl_excel_font DEFINITION
TYPE HASHED TABLE OF mty_s_font_cache TYPE HASHED TABLE OF mty_s_font_cache
WITH UNIQUE KEY font_name font_height flag_bold flag_italic . WITH UNIQUE KEY font_name font_height flag_bold flag_italic .
CONSTANTS lc_default_font_height TYPE tdfontsize VALUE '110' ##NO_TEXT.
CONSTANTS lc_default_font_name TYPE zexcel_style_font_name VALUE 'Calibri' ##NO_TEXT.
CLASS-DATA mth_font_cache TYPE mty_th_font_cache . CLASS-DATA mth_font_cache TYPE mty_th_font_cache .
CLASS-METHODS calculate_text_width
IMPORTING
!iv_font_name TYPE zexcel_style_font_name
!iv_font_height TYPE tdfontsize
!iv_flag_bold TYPE abap_bool
!iv_flag_italic TYPE abap_bool
!iv_cell_value TYPE zexcel_cell_value
RETURNING
VALUE(rv_width) TYPE f .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS. ENDCLASS.

View File

@ -106,6 +106,13 @@ CLASS zcl_excel_reader_2007 DEFINITION
END OF t_shared_string . END OF t_shared_string .
TYPES: TYPES:
t_shared_strings TYPE STANDARD TABLE OF t_shared_string WITH DEFAULT KEY . t_shared_strings TYPE STANDARD TABLE OF t_shared_string WITH DEFAULT KEY .
TYPES:
BEGIN OF t_table,
id TYPE string,
target TYPE string,
END OF t_table .
TYPES:
t_tables TYPE HASHED TABLE OF t_table WITH UNIQUE KEY id .
DATA shared_strings TYPE t_shared_strings . DATA shared_strings TYPE t_shared_strings .
DATA styles TYPE t_style_refs . DATA styles TYPE t_style_refs .
@ -268,6 +275,15 @@ CLASS zcl_excel_reader_2007 DEFINITION
!io_worksheet TYPE REF TO zcl_excel_worksheet !io_worksheet TYPE REF TO zcl_excel_worksheet
RAISING RAISING
zcx_excel . zcx_excel .
"! <p class="shorttext synchronized" lang="en">Load worksheet tables</p>
METHODS load_worksheet_tables
IMPORTING
io_ixml_worksheet TYPE REF TO if_ixml_document
io_worksheet TYPE REF TO zcl_excel_worksheet
iv_dirname TYPE string
it_tables TYPE t_tables
RAISING
zcx_excel .
CLASS-METHODS resolve_path CLASS-METHODS resolve_path
IMPORTING IMPORTING
!ip_path TYPE string !ip_path TYPE string
@ -291,6 +307,11 @@ CLASS zcl_excel_reader_2007 DEFINITION
!ip_excel TYPE REF TO zcl_excel !ip_excel TYPE REF TO zcl_excel
RAISING RAISING
zcx_excel. zcx_excel.
METHODS provided_string_is_escaped
IMPORTING
!value TYPE string
RETURNING
VALUE(is_escaped) TYPE abap_bool.
CONSTANTS: BEGIN OF namespace, CONSTANTS: BEGIN OF namespace,
x14ac TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac', x14ac TYPE string VALUE 'http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac',
@ -2169,6 +2190,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ENDIF. ENDIF.
WHEN OTHERS. WHEN OTHERS.
lo_range = <worksheet>-worksheet->add_new_range( ).
ENDCASE. ENDCASE.
ENDIF. ENDIF.
@ -2234,10 +2256,14 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
TYPES: BEGIN OF lty_sheetview, TYPES: BEGIN OF lty_sheetview,
showgridlines TYPE zexcel_show_gridlines, showgridlines TYPE zexcel_show_gridlines,
tabselected TYPE string, tabselected TYPE string,
zoomscale TYPE string,
zoomscalenormal TYPE string, zoomscalenormal TYPE string,
zoomscalepagelayoutview TYPE string,
zoomscalesheetlayoutview TYPE string,
workbookviewid TYPE string, workbookviewid TYPE string,
showrowcolheaders TYPE string, showrowcolheaders TYPE string,
righttoleft TYPE string, righttoleft TYPE string,
topleftcell TYPE string,
END OF lty_sheetview. END OF lty_sheetview.
TYPES: BEGIN OF lty_mergecell, TYPES: BEGIN OF lty_mergecell,
@ -2314,6 +2340,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lc_rel_hyperlink TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink', lc_rel_hyperlink TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink',
lc_rel_comments TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments', lc_rel_comments TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments',
lc_rel_printer TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings'. lc_rel_printer TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/printerSettings'.
CONSTANTS lc_rel_table TYPE string VALUE 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/table'.
DATA: lo_ixml_worksheet TYPE REF TO if_ixml_document, DATA: lo_ixml_worksheet TYPE REF TO if_ixml_document,
lo_ixml_cells TYPE REF TO if_ixml_node_collection, lo_ixml_cells TYPE REF TO if_ixml_node_collection,
@ -2408,6 +2435,8 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lt_datavalidation_range TYPE TABLE OF string, lt_datavalidation_range TYPE TABLE OF string,
lt_rtf TYPE zexcel_t_rtf, lt_rtf TYPE zexcel_t_rtf,
ex TYPE REF TO cx_root. ex TYPE REF TO cx_root.
DATA lt_tables TYPE t_tables.
DATA ls_table TYPE t_table.
FIELD-SYMBOLS: FIELD-SYMBOLS:
<ls_shared_string> TYPE t_shared_string. <ls_shared_string> TYPE t_shared_string.
@ -2478,6 +2507,10 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
CATCH zcx_excel. CATCH zcx_excel.
ENDTRY. ENDTRY.
WHEN lc_rel_table.
MOVE-CORRESPONDING ls_relationship TO ls_table.
INSERT ls_table INTO TABLE lt_tables.
WHEN OTHERS. WHEN OTHERS.
ENDCASE. ENDCASE.
@ -2501,6 +2534,16 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ENDIF. ENDIF.
ENDIF. ENDIF.
" Read tables (must be done before loading sheet contents)
TRY.
me->load_worksheet_tables( io_ixml_worksheet = lo_ixml_worksheet
io_worksheet = io_worksheet
iv_dirname = lv_dirname
it_tables = lt_tables ).
CATCH zcx_excel. " Ignore reading errors - pass everything we were able to identify
ENDTRY.
" Sheet contents
lo_ixml_rows = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'row' uri = namespace-main ). lo_ixml_rows = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'row' uri = namespace-main ).
lo_ixml_iterator = lo_ixml_rows->create_iterator( ). lo_ixml_iterator = lo_ixml_rows->create_iterator( ).
lo_ixml_row_elem ?= lo_ixml_iterator->get_next( ). lo_ixml_row_elem ?= lo_ixml_iterator->get_next( ).
@ -2516,6 +2559,7 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
lv_max_col = lv_index. lv_max_col = lv_index.
ENDIF. ENDIF.
lv_cell_row = ls_row-r. lv_cell_row = ls_row-r.
lv_cell_column = ''.
lo_row = io_worksheet->get_row( lv_cell_row ). lo_row = io_worksheet->get_row( lv_cell_row ).
IF ls_row-customheight = '1'. IF ls_row-customheight = '1'.
lo_row->set_row_height( ip_row_height = ls_row-ht ip_custom_height = abap_true ). lo_row->set_row_height( ip_row_height = ls_row-ht ip_custom_height = abap_true ).
@ -2552,6 +2596,26 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_cell_elem CHANGING cp_structure = ls_cell ). fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_cell_elem CHANGING cp_structure = ls_cell ).
" Determine the column number
IF ls_cell-r IS NOT INITIAL.
" Note that the row should remain unchanged = the one defined by <row>
" i.e. in <row r="1"...><c r="A1" s="2"><v>..., ls_cell-r would be "A1",
" the "1" of A1 should always be equal to the "1" of <row r="1"...
zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING
i_columnrow = ls_cell-r
IMPORTING
e_column = lv_cell_column
e_row = lv_cell_row ).
ELSE.
" The column is the column after the last cell previously initialized in the same row.
" NB: the row is unchanged = the one defined by <row> e.g. "1" in <row r="1"...><c r="" s="2"><v>...
IF lv_cell_column IS INITIAL.
lv_cell_column = 'A'.
ELSE.
lv_cell_column = zcl_excel_common=>convert_column2alpha( zcl_excel_common=>convert_column2int( lv_cell_column ) + 1 ).
ENDIF.
ENDIF.
lo_ixml_value_elem = lo_ixml_cell_elem->find_from_name_ns( name = 'v' uri = namespace-main ). lo_ixml_value_elem = lo_ixml_cell_elem->find_from_name_ns( name = 'v' uri = namespace-main ).
CASE ls_cell-t. CASE ls_cell-t.
@ -2600,11 +2664,6 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_formula_elem CHANGING cp_structure = ls_formula_attributes ). fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_formula_elem CHANGING cp_structure = ls_formula_attributes ).
IF ls_formula_attributes-t = 'shared'. IF ls_formula_attributes-t = 'shared'.
zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING
i_columnrow = ls_cell-r
IMPORTING
e_column = lv_cell_column
e_row = lv_cell_row ).
TRY. TRY.
CLEAR ls_ref_formula. CLEAR ls_ref_formula.
@ -2629,11 +2688,6 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
IF lv_cell_value IS NOT INITIAL IF lv_cell_value IS NOT INITIAL
OR lv_cell_formula IS NOT INITIAL OR lv_cell_formula IS NOT INITIAL
OR lv_style_guid IS NOT INITIAL. OR lv_style_guid IS NOT INITIAL.
zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING
i_columnrow = ls_cell-r
IMPORTING
e_column = lv_cell_column
e_row = lv_cell_row ).
io_worksheet->set_cell( ip_column = lv_cell_column " cell_elem Column io_worksheet->set_cell( ip_column = lv_cell_column " cell_elem Column
ip_row = lv_cell_row " cell_elem row_elem ip_row = lv_cell_row " cell_elem row_elem
ip_value = lv_cell_value " cell_elem Value ip_value = lv_cell_value " cell_elem Value
@ -2736,7 +2790,8 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
* issue #367 - hide columns from * issue #367 - hide columns from
IF ls_column-max = zcl_excel_common=>c_excel_sheet_max_col. " Max = very right column IF ls_column-max = zcl_excel_common=>c_excel_sheet_max_col. " Max = very right column
IF ls_column-hidden = 1 " all hidden IF ( ls_column-hidden = lc_xml_attr_true
OR ls_column-hidden = lc_xml_attr_true_int ) " all hidden
AND ls_column-min > 0. AND ls_column-min > 0.
io_worksheet->zif_excel_sheet_properties~hide_columns_from = zcl_excel_common=>convert_column2alpha( ls_column-min ). io_worksheet->zif_excel_sheet_properties~hide_columns_from = zcl_excel_common=>convert_column2alpha( ls_column-min ).
ELSEIF ls_column-style > ''. ELSEIF ls_column-style > ''.
@ -2767,7 +2822,13 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
OR ls_sheetview-righttoleft = lc_xml_attr_true_int. OR ls_sheetview-righttoleft = lc_xml_attr_true_int.
io_worksheet->zif_excel_sheet_properties~set_right_to_left( abap_true ). io_worksheet->zif_excel_sheet_properties~set_right_to_left( abap_true ).
ENDIF. ENDIF.
io_worksheet->zif_excel_sheet_properties~zoomscale = ls_sheetview-zoomscale.
io_worksheet->zif_excel_sheet_properties~zoomscale_normal = ls_sheetview-zoomscalenormal.
io_worksheet->zif_excel_sheet_properties~zoomscale_pagelayoutview = ls_sheetview-zoomscalepagelayoutview.
io_worksheet->zif_excel_sheet_properties~zoomscale_sheetlayoutview = ls_sheetview-zoomscalesheetlayoutview.
IF ls_sheetview-topleftcell IS NOT INITIAL.
io_worksheet->set_sheetview_top_left_cell( ls_sheetview-topleftcell ).
ENDIF.
"Add merge cell information "Add merge cell information
lo_ixml_mergecells = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'mergeCell' uri = namespace-main ). lo_ixml_mergecells = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'mergeCell' uri = namespace-main ).
@ -2884,21 +2945,12 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ENDIF. ENDIF.
" Start fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007
" Read pane " Read pane
lo_ixml_pane_elem = lo_ixml_sheetview_elem->find_from_name_ns( name = 'pane' uri = namespace-main ). lo_ixml_pane_elem = lo_ixml_sheetview_elem->find_from_name_ns( name = 'pane' uri = namespace-main ).
IF lo_ixml_pane_elem IS BOUND. IF lo_ixml_pane_elem IS BOUND.
fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_pane_elem CHANGING cp_structure = ls_excel_pane ). fill_struct_from_attributes( EXPORTING ip_element = lo_ixml_pane_elem CHANGING cp_structure = ls_excel_pane ).
" Issue #194 lv_pane_cell_col = ls_excel_pane-xsplit.
" Replace REGEX with method from the common class lv_pane_cell_row = ls_excel_pane-ysplit.
zcl_excel_common=>convert_columnrow2column_a_row( EXPORTING
i_columnrow = ls_excel_pane-topleftcell
IMPORTING
e_column = lv_pane_cell_col_a " Cell Column
e_row = lv_pane_cell_row ). " Natural number
lv_pane_cell_col = zcl_excel_common=>convert_column2int( lv_pane_cell_col_a ).
SUBTRACT 1 FROM: lv_pane_cell_col,
lv_pane_cell_row.
IF lv_pane_cell_col > 0 IF lv_pane_cell_col > 0
AND lv_pane_cell_row > 0. AND lv_pane_cell_row > 0.
io_worksheet->freeze_panes( ip_num_rows = lv_pane_cell_row io_worksheet->freeze_panes( ip_num_rows = lv_pane_cell_row
@ -2908,8 +2960,10 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ELSE. ELSE.
io_worksheet->freeze_panes( ip_num_columns = lv_pane_cell_col ). io_worksheet->freeze_panes( ip_num_columns = lv_pane_cell_col ).
ENDIF. ENDIF.
IF ls_excel_pane-topleftcell IS NOT INITIAL.
io_worksheet->set_pane_top_left_cell( ls_excel_pane-topleftcell ).
ENDIF.
ENDIF. ENDIF.
" End fix 194 Read attributes HIDDEN, OUTLINELEVEL, COLLAPSED in ZCL_EXCEL_READER_2007
" Start fix 276 Read data validations " Start fix 276 Read data validations
lo_ixml_datavalidations = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'dataValidation' uri = namespace-main ). lo_ixml_datavalidations = lo_ixml_worksheet->get_elements_by_tag_name_ns( name = 'dataValidation' uri = namespace-main ).
@ -3885,6 +3939,130 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD load_worksheet_tables.
DATA lo_ixml_table_columns TYPE REF TO if_ixml_node_collection.
DATA lo_ixml_table_column TYPE REF TO if_ixml_element.
DATA lo_ixml_table TYPE REF TO if_ixml_element.
DATA lo_ixml_table_style TYPE REF TO if_ixml_element.
DATA lt_field_catalog TYPE zexcel_t_fieldcatalog.
DATA ls_field_catalog TYPE zexcel_s_fieldcatalog.
DATA lo_ixml_iterator TYPE REF TO if_ixml_node_iterator.
DATA ls_table_settings TYPE zexcel_s_table_settings.
DATA lv_path TYPE string.
DATA lt_components TYPE abap_component_tab.
DATA ls_component TYPE abap_componentdescr.
DATA lo_rtti_table TYPE REF TO cl_abap_tabledescr.
DATA lv_dref_table TYPE REF TO data.
DATA lv_num_lines TYPE i.
DATA lo_line_type TYPE REF TO cl_abap_structdescr.
DATA: BEGIN OF ls_table,
id TYPE string,
name TYPE string,
displayname TYPE string,
ref TYPE string,
totalsrowshown TYPE string,
END OF ls_table.
DATA: BEGIN OF ls_table_style,
name TYPE string,
showrowstripes TYPE string,
showcolumnstripes TYPE string,
END OF ls_table_style.
DATA: BEGIN OF ls_table_column,
id TYPE string,
name TYPE string,
END OF ls_table_column.
FIELD-SYMBOLS <ls_table> LIKE LINE OF it_tables.
FIELD-SYMBOLS <lt_table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <ls_field> TYPE zexcel_s_fieldcatalog.
LOOP AT it_tables ASSIGNING <ls_table>.
CONCATENATE iv_dirname <ls_table>-target INTO lv_path.
lv_path = resolve_path( lv_path ).
lo_ixml_table = me->get_ixml_from_zip_archive( lv_path )->get_root_element( ).
fill_struct_from_attributes( EXPORTING
ip_element = lo_ixml_table
CHANGING
cp_structure = ls_table ).
lo_ixml_table_style ?= lo_ixml_table->find_from_name( 'tableStyleInfo' ).
fill_struct_from_attributes( EXPORTING
ip_element = lo_ixml_table_style
CHANGING
cp_structure = ls_table_style ).
ls_table_settings-table_name = ls_table-name.
ls_table_settings-table_style = ls_table_style-name.
ls_table_settings-show_column_stripes = boolc( ls_table_style-showcolumnstripes = '1' ).
ls_table_settings-show_row_stripes = boolc( ls_table_style-showrowstripes = '1' ).
zcl_excel_common=>convert_range2column_a_row(
EXPORTING
i_range = ls_table-ref
IMPORTING
e_column_start = ls_table_settings-top_left_column
e_column_end = ls_table_settings-bottom_right_column
e_row_start = ls_table_settings-top_left_row
e_row_end = ls_table_settings-bottom_right_row ).
lo_ixml_table_columns = lo_ixml_table->get_elements_by_tag_name( name = 'tableColumn' ).
lo_ixml_iterator = lo_ixml_table_columns->create_iterator( ).
lo_ixml_table_column ?= lo_ixml_iterator->get_next( ).
CLEAR lt_field_catalog.
WHILE lo_ixml_table_column IS BOUND.
CLEAR ls_table_column.
fill_struct_from_attributes( EXPORTING
ip_element = lo_ixml_table_column
CHANGING
cp_structure = ls_table_column ).
ls_field_catalog-position = lines( lt_field_catalog ) + 1.
ls_field_catalog-fieldname = |COMP_{ ls_field_catalog-position PAD = '0' ALIGN = RIGHT WIDTH = 4 }|.
ls_field_catalog-scrtext_l = ls_table_column-name.
ls_field_catalog-dynpfld = abap_true.
ls_field_catalog-abap_type = cl_abap_typedescr=>typekind_string.
APPEND ls_field_catalog TO lt_field_catalog.
lo_ixml_table_column ?= lo_ixml_iterator->get_next( ).
ENDWHILE.
CLEAR lt_components.
LOOP AT lt_field_catalog ASSIGNING <ls_field>.
CLEAR ls_component.
ls_component-name = <ls_field>-fieldname.
ls_component-type = cl_abap_elemdescr=>get_string( ).
APPEND ls_component TO lt_components.
ENDLOOP.
lo_line_type = cl_abap_structdescr=>get( lt_components ).
lo_rtti_table = cl_abap_tabledescr=>get( lo_line_type ).
CREATE DATA lv_dref_table TYPE HANDLE lo_rtti_table.
ASSIGN lv_dref_table->* TO <lt_table>.
lv_num_lines = ls_table_settings-bottom_right_row - ls_table_settings-top_left_row.
DO lv_num_lines TIMES.
APPEND INITIAL LINE TO <lt_table>.
ENDDO.
io_worksheet->bind_table(
EXPORTING
ip_table = <lt_table>
it_field_catalog = lt_field_catalog
is_table_settings = ls_table_settings ).
ENDLOOP.
ENDMETHOD.
METHOD read_from_applserver. METHOD read_from_applserver.
DATA: lv_filelength TYPE i, DATA: lv_filelength TYPE i,
@ -4123,17 +4301,21 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
METHOD unescape_string_value. METHOD unescape_string_value.
DATA: lt_character_positions TYPE TABLE OF i, DATA:
"Marks the Position before the searched Pattern occurs in the String
"For example in String A_X_TEST_X, the Table is filled with 1 and 8
lt_character_positions TYPE TABLE OF i,
lv_character_position TYPE i, lv_character_position TYPE i,
lv_character_position_plus_2 TYPE i, lv_character_position_plus_2 TYPE i,
lv_character_position_plus_6 TYPE i, lv_character_position_plus_6 TYPE i,
lv_unescaped_value TYPE string. lv_unescaped_value TYPE string.
" The text "_x...._", with "_x" not "_X", with exactly 4 ".", each being 0-9 a-f or A-F (case insensitive), is interpreted " The text "_x...._", with "_x" not "_X". Each "." represents one character, being 0-9 a-f or A-F (case insensitive),
" like Unicode character U+.... (e.g. "_x0041_" is rendered like "A") is for characters. " is interpreted like Unicode character U+.... (e.g. "_x0041_" is rendered like "A") is for characters.
" To not interpret it, Excel replaces the first "_" with "_x005f_". " To not interpret it, Excel replaces the first "_" with "_x005f_".
result = i_value. result = i_value.
IF result CS '_x'.
IF provided_string_is_escaped( i_value ) = abap_true.
CLEAR lt_character_positions. CLEAR lt_character_positions.
APPEND sy-fdpos TO lt_character_positions. APPEND sy-fdpos TO lt_character_positions.
lv_character_position = sy-fdpos + 1. lv_character_position = sy-fdpos + 1.
@ -4146,11 +4328,12 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
LOOP AT lt_character_positions INTO lv_character_position. LOOP AT lt_character_positions INTO lv_character_position.
lv_character_position_plus_2 = lv_character_position + 2. lv_character_position_plus_2 = lv_character_position + 2.
lv_character_position_plus_6 = lv_character_position + 6. lv_character_position_plus_6 = lv_character_position + 6.
IF substring( val = result off = lv_character_position_plus_2 len = 4 ) CO '0123456789ABCDEFGHIJKLMNOPQRSTUVWabcdefghijklmnopqrstuvw' IF substring( val = result off = lv_character_position_plus_2 len = 4 ) CO '0123456789ABCDEFabcdef'.
AND substring( val = result off = lv_character_position_plus_6 len = 1 ) = '_'. IF substring( val = result off = lv_character_position_plus_6 len = 1 ) = '_'.
lv_unescaped_value = cl_abap_conv_in_ce=>uccp( to_upper( substring( val = result off = lv_character_position_plus_2 len = 4 ) ) ). lv_unescaped_value = cl_abap_conv_in_ce=>uccp( to_upper( substring( val = result off = lv_character_position_plus_2 len = 4 ) ) ).
REPLACE SECTION OFFSET lv_character_position LENGTH 7 OF result WITH lv_unescaped_value. REPLACE SECTION OFFSET lv_character_position LENGTH 7 OF result WITH lv_unescaped_value.
ENDIF. ENDIF.
ENDIF.
ENDLOOP. ENDLOOP.
ENDIF. ENDIF.
@ -4272,4 +4455,19 @@ CLASS zcl_excel_reader_2007 IMPLEMENTATION.
iv_zcl_excel_classname = iv_zcl_excel_classname ). iv_zcl_excel_classname = iv_zcl_excel_classname ).
ENDMETHOD. ENDMETHOD.
METHOD provided_string_is_escaped.
"Check if passed value is really an escaped Character
IF value CS '_x'.
is_escaped = abap_true.
TRY.
IF substring( val = value off = sy-fdpos + 6 len = 1 ) <> '_'.
is_escaped = abap_false.
ENDIF.
CATCH cx_sy_range_out_of_bounds.
is_escaped = abap_false.
ENDTRY.
ENDIF.
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -15,6 +15,7 @@ CLASS ltc_unescape_string_value DEFINITION
METHODS no_escaping FOR TESTING. METHODS no_escaping FOR TESTING.
METHODS one_escaped_character FOR TESTING. METHODS one_escaped_character FOR TESTING.
METHODS two_escaped_characters FOR TESTING. METHODS two_escaped_characters FOR TESTING.
METHODS skip_when_not_escaped FOR TESTING RAISING cx_static_check.
METHODS run_cut METHODS run_cut
IMPORTING IMPORTING
@ -52,4 +53,18 @@ CLASS ltc_unescape_string_value IMPLEMENTATION.
run_cut( input = '_x0000_ and _xFFFF_' exp = |{ cl_abap_conv_in_ce=>uccp( '0000' ) } and { cl_abap_conv_in_ce=>uccp( 'FFFF' ) }| ). run_cut( input = '_x0000_ and _xFFFF_' exp = |{ cl_abap_conv_in_ce=>uccp( '0000' ) } and { cl_abap_conv_in_ce=>uccp( 'FFFF' ) }| ).
ENDMETHOD. ENDMETHOD.
METHOD skip_when_not_escaped.
DATA: lo_excel TYPE REF TO zcl_excel_reader_2007,
value TYPE string VALUE 'TEST_X'.
CREATE OBJECT lo_excel.
"Method is used to check for "_x", but its not an escaped charcater, output should input.
lo_excel->unescape_string_value( i_value = value ).
cl_abap_unit_assert=>assert_equals(
exp = value
act = value ).
ENDMETHOD.
ENDCLASS. ENDCLASS.

View File

@ -253,6 +253,11 @@
<LANGU>E</LANGU> <LANGU>E</LANGU>
<DESCRIPT>Loads pagemargings of worksheet</DESCRIPT> <DESCRIPT>Loads pagemargings of worksheet</DESCRIPT>
</SEOCOMPOTX> </SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>LOAD_WORKSHEET_TABLES</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Load worksheet tables</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX> <SEOCOMPOTX>
<CMPNAME>MT_DXF_STYLES</CMPNAME> <CMPNAME>MT_DXF_STYLES</CMPNAME>
<LANGU>E</LANGU> <LANGU>E</LANGU>

View File

@ -135,10 +135,10 @@ CLASS zcl_excel_style_fill IMPLEMENTATION.
gradtype-type = c_fill_gradient_path. gradtype-type = c_fill_gradient_path.
gradtype-position1 = '0'. gradtype-position1 = '0'.
gradtype-position2 = '1'. gradtype-position2 = '1'.
gradtype-bottom = '0.5'. gradtype-bottom = '1'.
gradtype-top = '0.5'. gradtype-top = '1'.
gradtype-left = '0.5'. gradtype-left = '1'.
gradtype-right = '0.5'. gradtype-right = '1'.
ENDCASE. ENDCASE.
ENDMETHOD. "build_gradient ENDMETHOD. "build_gradient

View File

@ -25,7 +25,10 @@ CLASS zcl_excel_style_number_format DEFINITION
CONSTANTS c_format_currency_simple2 TYPE zexcel_number_format VALUE '$#,##0.00_);($#,##0.00)'. "#EC NOTEXT CONSTANTS c_format_currency_simple2 TYPE zexcel_number_format VALUE '$#,##0.00_);($#,##0.00)'. "#EC NOTEXT
CONSTANTS c_format_currency_simple_red2 TYPE zexcel_number_format VALUE '$#,##0.00_);[Red]($#,##0.00)'. "#EC NOTEXT CONSTANTS c_format_currency_simple_red2 TYPE zexcel_number_format VALUE '$#,##0.00_);[Red]($#,##0.00)'. "#EC NOTEXT
CONSTANTS c_format_date_datetime TYPE zexcel_number_format VALUE 'd/m/y h:mm'. "#EC NOTEXT CONSTANTS c_format_date_datetime TYPE zexcel_number_format VALUE 'd/m/y h:mm'. "#EC NOTEXT
"! Deprecated. Do not use this one, its value is dd/mm/yy, instead use the constant *_ddmmyyyy_new
CONSTANTS c_format_date_ddmmyyyy TYPE zexcel_number_format VALUE 'dd/mm/yy'. "#EC NOTEXT CONSTANTS c_format_date_ddmmyyyy TYPE zexcel_number_format VALUE 'dd/mm/yy'. "#EC NOTEXT
CONSTANTS c_format_date_ddmmyyyy_new TYPE zexcel_number_format VALUE 'dd/mm/yyyy'. "#EC NOTEXT
CONSTANTS c_format_date_ddmmyy TYPE zexcel_number_format VALUE 'dd/mm/yy'. "#EC NOTEXT
CONSTANTS c_format_date_ddmmyyyydot TYPE zexcel_number_format VALUE 'dd\.mm\.yyyy'. "#EC NOTEXT CONSTANTS c_format_date_ddmmyyyydot TYPE zexcel_number_format VALUE 'dd\.mm\.yyyy'. "#EC NOTEXT
CONSTANTS c_format_date_dmminus TYPE zexcel_number_format VALUE 'd-m'. "#EC NOTEXT CONSTANTS c_format_date_dmminus TYPE zexcel_number_format VALUE 'd-m'. "#EC NOTEXT
CONSTANTS c_format_date_dmyminus TYPE zexcel_number_format VALUE 'd-m-y'. "#EC NOTEXT CONSTANTS c_format_date_dmyminus TYPE zexcel_number_format VALUE 'd-m-y'. "#EC NOTEXT

View File

@ -71,10 +71,7 @@ CLASS zcl_excel_theme DEFINITION
DATA extlst TYPE REF TO zcl_excel_theme_extlst . DATA extlst TYPE REF TO zcl_excel_theme_extlst .
PRIVATE SECTION. PRIVATE SECTION.
DATA theme_changed TYPE abap_bool .
DATA theme_read TYPE abap_bool .
DATA name TYPE string . DATA name TYPE string .
DATA xmls_a TYPE string .
ENDCLASS. ENDCLASS.
@ -100,7 +97,6 @@ CLASS zcl_excel_theme IMPLEMENTATION.
lo_node_theme = io_theme_xml->get_root_element( )." find_from_name( name = c_theme ). lo_node_theme = io_theme_xml->get_root_element( )." find_from_name( name = c_theme ).
IF lo_node_theme IS BOUND. IF lo_node_theme IS BOUND.
name = lo_node_theme->get_attribute( name = c_theme_name ). name = lo_node_theme->get_attribute( name = c_theme_name ).
xmls_a = lo_node_theme->get_attribute( name = c_theme_xmlns ).
lo_theme_children = lo_node_theme->get_children( ). lo_theme_children = lo_node_theme->get_children( ).
lo_theme_iterator = lo_theme_children->create_iterator( ). lo_theme_iterator = lo_theme_children->create_iterator( ).
lo_theme_element ?= lo_theme_iterator->get_next( ). lo_theme_element ?= lo_theme_iterator->get_next( ).
@ -208,7 +204,6 @@ CLASS zcl_excel_theme IMPLEMENTATION.
lo_document = lo_ixml->create_document( ). lo_document = lo_ixml->create_document( ).
lo_document->set_encoding( lo_encoding ). lo_document->set_encoding( lo_encoding ).
lo_document->set_standalone( abap_true ). lo_document->set_standalone( abap_true ).
lo_document->set_namespace_prefix( prefix = 'a' ).
lo_element_root = lo_document->create_simple_element_ns( prefix = c_theme_prefix lo_element_root = lo_document->create_simple_element_ns( prefix = c_theme_prefix
name = c_theme name = c_theme

View File

@ -104,6 +104,8 @@ CLASS zcl_excel_worksheet DEFINITION
formula_in_other_column TYPE string, formula_in_other_column TYPE string,
END OF c_messages . END OF c_messages .
DATA mt_merged_cells TYPE mty_ts_merge READ-ONLY . DATA mt_merged_cells TYPE mty_ts_merge READ-ONLY .
DATA pane_top_left_cell TYPE string READ-ONLY.
DATA sheetview_top_left_cell TYPE string READ-ONLY.
METHODS add_comment METHODS add_comment
IMPORTING IMPORTING
@ -551,6 +553,11 @@ CLASS zcl_excel_worksheet DEFINITION
!ip_formula TYPE zexcel_cell_formula OPTIONAL "added parameter !ip_formula TYPE zexcel_cell_formula OPTIONAL "added parameter
RAISING RAISING
zcx_excel . zcx_excel .
METHODS set_pane_top_left_cell
IMPORTING
!iv_columnrow TYPE csequence
RAISING
zcx_excel.
METHODS set_print_gridlines METHODS set_print_gridlines
IMPORTING IMPORTING
!i_print_gridlines TYPE zexcel_print_gridlines . !i_print_gridlines TYPE zexcel_print_gridlines .
@ -567,6 +574,11 @@ CLASS zcl_excel_worksheet DEFINITION
!iv_collapsed TYPE abap_bool !iv_collapsed TYPE abap_bool
RAISING RAISING
zcx_excel . zcx_excel .
METHODS set_sheetview_top_left_cell
IMPORTING
!iv_columnrow TYPE csequence
RAISING
zcx_excel.
METHODS set_show_gridlines METHODS set_show_gridlines
IMPORTING IMPORTING
!i_show_gridlines TYPE zexcel_show_gridlines . !i_show_gridlines TYPE zexcel_show_gridlines .
@ -698,6 +710,11 @@ CLASS zcl_excel_worksheet DEFINITION
*"* private components of class ZCL_EXCEL_WORKSHEET *"* private components of class ZCL_EXCEL_WORKSHEET
*"* do not include other source files here!!! *"* do not include other source files here!!!
TYPES ty_table_settings TYPE STANDARD TABLE OF zexcel_s_table_settings WITH DEFAULT KEY. TYPES ty_table_settings TYPE STANDARD TABLE OF zexcel_s_table_settings WITH DEFAULT KEY.
CONSTANTS typekind_utclong TYPE abap_typekind VALUE 'p'.
CLASS-DATA variable_utclong TYPE REF TO data.
DATA active_cell TYPE zexcel_s_cell_data . DATA active_cell TYPE zexcel_s_cell_data .
DATA charts TYPE REF TO zcl_excel_drawings . DATA charts TYPE REF TO zcl_excel_drawings .
DATA columns TYPE REF TO zcl_excel_columns . DATA columns TYPE REF TO zcl_excel_columns .
@ -1073,6 +1090,10 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ). lv_column_alpha = zcl_excel_common=>convert_column2alpha( lv_column_int ).
IF <ls_field_catalog>-width IS NOT INITIAL.
set_column_width( ip_column = lv_column_alpha ip_width_fix = <ls_field_catalog>-width ).
ENDIF.
" First of all write column header " First of all write column header
IF <ls_field_catalog>-style_header IS NOT INITIAL. IF <ls_field_catalog>-style_header IS NOT INITIAL.
me->set_cell( ip_column = lv_column_alpha me->set_cell( ip_column = lv_column_alpha
@ -1285,7 +1306,9 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
ld_flag_italic TYPE abap_bool VALUE abap_false, ld_flag_italic TYPE abap_bool VALUE abap_false,
ld_date TYPE d, ld_date TYPE d,
ld_date_char TYPE c LENGTH 50, ld_date_char TYPE c LENGTH 50,
ld_font_height TYPE tdfontsize VALUE zcl_excel_font=>lc_default_font_height, ld_time TYPE t,
ld_time_char TYPE c LENGTH 20,
ld_font_height TYPE zcl_excel_font=>ty_font_height VALUE zcl_excel_font=>lc_default_font_height,
ld_font_name TYPE zexcel_style_font_name VALUE zcl_excel_font=>lc_default_font_name. ld_font_name TYPE zexcel_style_font_name VALUE zcl_excel_font=>lc_default_font_name.
" Determine cell content and cell style " Determine cell content and cell style
@ -1330,8 +1353,8 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
" If the current cell contains the default date format, " If the current cell contains the default date format,
" convert the cell value to a date and calculate its length " convert the cell value to a date and calculate its length
IF ls_stylemapping-complete_style-number_format-format_code = CASE ls_stylemapping-complete_style-number_format-format_code.
zcl_excel_style_number_format=>c_format_date_std. WHEN zcl_excel_style_number_format=>c_format_date_std.
" Convert excel date to ABAP date " Convert excel date to ABAP date
ld_date = ld_date =
@ -1343,7 +1366,14 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
" Remember the formatted date to calculate the cell size " Remember the formatted date to calculate the cell size
ld_cell_value = ld_date_char. ld_cell_value = ld_date_char.
ENDIF. WHEN get_default_excel_time_format( ).
ld_time = zcl_excel_common=>excel_string_to_time( ld_cell_value ).
WRITE ld_time TO ld_time_char.
ld_cell_value = ld_time_char.
ENDCASE.
" Read the font size and convert it to the font height " Read the font size and convert it to the font height
" used by SAPscript (multiplication by 10) " used by SAPscript (multiplication by 10)
@ -2009,12 +2039,20 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
METHOD class_constructor. METHOD class_constructor.
FIELD-SYMBOLS <lv_typekind> TYPE abap_typekind.
DATA lo_rtti TYPE REF TO cl_abap_datadescr.
c_messages-formula_id_only_is_possible = |{ 'If Formula ID is used, value and formula must be empty'(008) }|. c_messages-formula_id_only_is_possible = |{ 'If Formula ID is used, value and formula must be empty'(008) }|.
c_messages-column_formula_id_not_found = |{ 'The Column Formula does not exist'(009) }|. c_messages-column_formula_id_not_found = |{ 'The Column Formula does not exist'(009) }|.
c_messages-formula_not_in_this_table = |{ 'The cell uses a Column Formula which should be part of the same table'(010) }|. c_messages-formula_not_in_this_table = |{ 'The cell uses a Column Formula which should be part of the same table'(010) }|.
c_messages-formula_in_other_column = |{ 'The cell uses a Column Formula which is in a different column'(011) }|. c_messages-formula_in_other_column = |{ 'The cell uses a Column Formula which is in a different column'(011) }|.
ASSIGN ('CL_ABAP_TYPEDESCR=>TYPEKIND_UTCLONG') TO <lv_typekind>.
IF sy-subrc = 0.
CALL METHOD cl_abap_elemdescr=>('GET_UTCLONG') RECEIVING p_result = lo_rtti.
CREATE DATA variable_utclong TYPE HANDLE lo_rtti.
ENDIF.
ENDMETHOD. ENDMETHOD.
@ -2318,7 +2356,8 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
IF sy-subrc EQ 0. IF sy-subrc EQ 0.
CASE ls_style_conv-abap_type. CASE ls_style_conv-abap_type.
WHEN cl_abap_typedescr=>typekind_date. WHEN cl_abap_typedescr=>typekind_date.
<lv_data> = zcl_excel_common=>excel_string_to_date( <ls_sheet_content>-cell_value ). <lv_data> = zcl_excel_common=>excel_string_to_date( ip_value = <ls_sheet_content>-cell_value
ip_exact = abap_true ).
WHEN cl_abap_typedescr=>typekind_time. WHEN cl_abap_typedescr=>typekind_time.
<lv_data> = zcl_excel_common=>excel_string_to_time( <ls_sheet_content>-cell_value ). <lv_data> = zcl_excel_common=>excel_string_to_time( <ls_sheet_content>-cell_value ).
ENDCASE. ENDCASE.
@ -3832,6 +3871,7 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
<fs_typekind_int8> TYPE abap_typekind. <fs_typekind_int8> TYPE abap_typekind.
FIELD-SYMBOLS: <fs_column_formula> TYPE mty_s_column_formula. FIELD-SYMBOLS: <fs_column_formula> TYPE mty_s_column_formula.
FIELD-SYMBOLS: <ls_fieldcat> TYPE zexcel_s_fieldcatalog. FIELD-SYMBOLS: <ls_fieldcat> TYPE zexcel_s_fieldcatalog.
FIELD-SYMBOLS <lv_utclong> TYPE simple.
IF ip_value IS NOT SUPPLIED IF ip_value IS NOT SUPPLIED
AND ip_formula IS NOT SUPPLIED AND ip_formula IS NOT SUPPLIED
@ -3975,6 +4015,13 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
* ENDIF. * ENDIF.
* End of change issue #152 - don't touch exisiting style if only value is passed * End of change issue #152 - don't touch exisiting style if only value is passed
WHEN typekind_utclong.
ASSIGN variable_utclong->* TO <lv_utclong>.
IF sy-subrc = 0.
<lv_utclong> = <fs_value>.
lv_value = zcl_excel_common=>utclong_to_excel_string( <lv_utclong> ).
ENDIF.
WHEN OTHERS. WHEN OTHERS.
zcx_excel=>raise_text( 'Invalid data type of input value' ). zcx_excel=>raise_text( 'Invalid data type of input value' ).
ENDCASE. ENDCASE.
@ -4080,6 +4127,21 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
ip_row = lv_row ip_row = lv_row
ip_number_format_format_code = lo_format_code_datetime ). ip_number_format_format_code = lo_format_code_datetime ).
WHEN typekind_utclong.
TRY.
stylemapping = me->excel->get_style_to_guid( <fs_sheet_content>-cell_style ).
CATCH zcx_excel .
ENDTRY.
IF stylemapping-complete_stylex-number_format-format_code IS INITIAL OR
stylemapping-complete_style-number_format-format_code IS INITIAL.
lo_format_code_datetime = zcl_excel_style_number_format=>c_format_date_datetime.
ELSE.
lo_format_code_datetime = stylemapping-complete_style-number_format-format_code.
ENDIF.
me->change_cell_style( ip_column = lv_column
ip_row = lv_row
ip_number_format_format_code = lo_format_code_datetime ).
ENDCASE. ENDCASE.
* End of change issue #152 - don't touch exisiting style if only value is passed * End of change issue #152 - don't touch exisiting style if only value is passed
@ -4312,6 +4374,25 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
ENDMETHOD. "set_merge_style ENDMETHOD. "set_merge_style
METHOD set_pane_top_left_cell.
DATA lv_column_int TYPE zexcel_cell_column.
DATA lv_row TYPE zexcel_cell_row.
" Validate input value
zcl_excel_common=>convert_columnrow2column_a_row(
EXPORTING
i_columnrow = iv_columnrow
IMPORTING
e_column_int = lv_column_int
e_row = lv_row ).
IF lv_column_int NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_col AND zcl_excel_common=>c_excel_sheet_max_col
OR lv_row NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_row AND zcl_excel_common=>c_excel_sheet_max_row.
RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Invalid column/row coordinates (valid values: A1 to XFD1048576)'.
ENDIF.
pane_top_left_cell = iv_columnrow.
ENDMETHOD.
METHOD set_print_gridlines. METHOD set_print_gridlines.
me->print_gridlines = i_print_gridlines. me->print_gridlines = i_print_gridlines.
ENDMETHOD. "SET_PRINT_GRIDLINES ENDMETHOD. "SET_PRINT_GRIDLINES
@ -4368,6 +4449,25 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
ENDMETHOD. "SET_ROW_OUTLINE ENDMETHOD. "SET_ROW_OUTLINE
METHOD set_sheetview_top_left_cell.
DATA lv_column_int TYPE zexcel_cell_column.
DATA lv_row TYPE zexcel_cell_row.
" Validate input value
zcl_excel_common=>convert_columnrow2column_a_row(
EXPORTING
i_columnrow = iv_columnrow
IMPORTING
e_column_int = lv_column_int
e_row = lv_row ).
IF lv_column_int NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_col AND zcl_excel_common=>c_excel_sheet_max_col
OR lv_row NOT BETWEEN zcl_excel_common=>c_excel_sheet_min_row AND zcl_excel_common=>c_excel_sheet_max_row.
RAISE EXCEPTION TYPE zcx_excel EXPORTING error = 'Invalid column/row coordinates (valid values: A1 to XFD1048576)'.
ENDIF.
sheetview_top_left_cell = iv_columnrow.
ENDMETHOD.
METHOD set_show_gridlines. METHOD set_show_gridlines.
me->show_gridlines = i_show_gridlines. me->show_gridlines = i_show_gridlines.
ENDMETHOD. "SET_SHOW_GRIDLINES ENDMETHOD. "SET_SHOW_GRIDLINES
@ -4385,7 +4485,7 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
METHOD set_table. METHOD set_table.
DATA: lo_tabdescr TYPE REF TO cl_abap_structdescr, DATA: lo_structdescr TYPE REF TO cl_abap_structdescr,
lr_data TYPE REF TO data, lr_data TYPE REF TO data,
lt_dfies TYPE ddfields, lt_dfies TYPE ddfields,
lv_row_int TYPE zexcel_cell_row, lv_row_int TYPE zexcel_cell_row,
@ -4403,9 +4503,9 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
CREATE DATA lr_data LIKE LINE OF ip_table. CREATE DATA lr_data LIKE LINE OF ip_table.
lo_tabdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ). lo_structdescr ?= cl_abap_structdescr=>describe_by_data_ref( lr_data ).
lt_dfies = lo_tabdescr->get_ddic_field_list( ). lt_dfies = zcl_excel_common=>describe_structure( io_struct = lo_structdescr ).
* It is better to loop column by column * It is better to loop column by column
LOOP AT lt_dfies ASSIGNING <fs_dfies>. LOOP AT lt_dfies ASSIGNING <fs_dfies>.
@ -4452,27 +4552,8 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
METHOD set_title. METHOD set_title.
*--------------------------------------------------------------------*
* ToDos:
* 2do §1 The current coding for replacing a named ranges name
* after renaming a sheet should be checked if it is
* really working if sheetname should be escaped
*--------------------------------------------------------------------*
*--------------------------------------------------------------------*
* issue #230 - Pimp my Code
* - Stefan Schmoecker, (wip ) 2012-12-08
* - ...
* changes: aligning code
* message made to support multilinguality
*--------------------------------------------------------------------*
* issue#243 - ' is not allowed as first character in sheet title
* - Stefan Schmoecker, 2012-12-02
* changes: added additional check for ' as first character
*--------------------------------------------------------------------*
DATA: lo_worksheets_iterator TYPE REF TO zcl_excel_collection_iterator, DATA: lo_worksheets_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_worksheet TYPE REF TO zcl_excel_worksheet, lo_worksheet TYPE REF TO zcl_excel_worksheet,
errormessage TYPE string,
lv_rangesheetname_old TYPE string, lv_rangesheetname_old TYPE string,
lv_rangesheetname_new TYPE string, lv_rangesheetname_new TYPE string,
lo_ranges_iterator TYPE REF TO zcl_excel_collection_iterator, lo_ranges_iterator TYPE REF TO zcl_excel_collection_iterator,
@ -4502,14 +4583,14 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
* Check whether title is unique in workbook * Check whether title is unique in workbook
*--------------------------------------------------------------------* *--------------------------------------------------------------------*
lo_worksheets_iterator = me->excel->get_worksheets_iterator( ). lo_worksheets_iterator = me->excel->get_worksheets_iterator( ).
WHILE lo_worksheets_iterator->has_next( ) = 'X'. WHILE lo_worksheets_iterator->has_next( ) = abap_true.
lo_worksheet ?= lo_worksheets_iterator->get_next( ). lo_worksheet ?= lo_worksheets_iterator->get_next( ).
CHECK me->guid <> lo_worksheet->get_guid( ). " Don't check against itself CHECK me->guid <> lo_worksheet->get_guid( ). " Don't check against itself
IF ip_title = lo_worksheet->get_title( ). " Not unique --> raise exception IF ip_title = lo_worksheet->get_title( ). " Not unique --> raise exception
errormessage = 'Duplicate sheetname &'. lv_errormessage = 'Duplicate sheetname &'.
REPLACE '&' IN errormessage WITH ip_title. REPLACE '&' IN lv_errormessage WITH ip_title.
zcx_excel=>raise_text( errormessage ). zcx_excel=>raise_text( lv_errormessage ).
ENDIF. ENDIF.
ENDWHILE. ENDWHILE.
@ -4517,21 +4598,17 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
*--------------------------------------------------------------------* *--------------------------------------------------------------------*
* Remember old sheetname and rename sheet to desired name * Remember old sheetname and rename sheet to desired name
*--------------------------------------------------------------------* *--------------------------------------------------------------------*
CONCATENATE me->title '!' INTO lv_rangesheetname_old. lv_rangesheetname_old = zcl_excel_common=>escape_string( me->title ) && '!'.
me->title = ip_title. me->title = ip_title.
*--------------------------------------------------------------------* *--------------------------------------------------------------------*
* After changing this worksheet's title we have to adjust * After changing this worksheet's title we have to adjust
* all ranges that are referring to this worksheet. * all ranges that are referring to this worksheet.
*--------------------------------------------------------------------* *--------------------------------------------------------------------*
* 2do §1 - Check if the following quickfix is solid lv_rangesheetname_new = zcl_excel_common=>escape_string( me->title ) && '!'.
* I fear it isn't - but this implementation is better then
* nothing at all since it handles a supposed majority of cases
*--------------------------------------------------------------------*
CONCATENATE me->title '!' INTO lv_rangesheetname_new.
lo_ranges_iterator = me->excel->get_ranges_iterator( ). lo_ranges_iterator = me->excel->get_ranges_iterator( ). "workbookglobal ranges
WHILE lo_ranges_iterator->has_next( ) = 'X'. WHILE lo_ranges_iterator->has_next( ) = abap_true.
lo_range ?= lo_ranges_iterator->get_next( ). lo_range ?= lo_ranges_iterator->get_next( ).
lv_range_value = lo_range->get_value( ). lv_range_value = lo_range->get_value( ).
@ -4542,6 +4619,20 @@ CLASS ZCL_EXCEL_WORKSHEET IMPLEMENTATION.
ENDWHILE. ENDWHILE.
IF me->ranges IS BOUND. "not yet bound if called from worksheet's constructor
lo_ranges_iterator = me->get_ranges_iterator( ). "sheetlocal ranges, repeat rows and columns
WHILE lo_ranges_iterator->has_next( ) = abap_true.
lo_range ?= lo_ranges_iterator->get_next( ).
lv_range_value = lo_range->get_value( ).
REPLACE ALL OCCURRENCES OF lv_rangesheetname_old IN lv_range_value WITH lv_rangesheetname_new.
IF sy-subrc = 0.
lo_range->set_range_value( lv_range_value ).
ENDIF.
ENDWHILE.
ENDIF.
ENDMETHOD. "SET_TITLE ENDMETHOD. "SET_TITLE

View File

@ -145,8 +145,10 @@ CLASS zcl_excel_writer_2007 DEFINITION
METHODS create_xl_sheet_rels METHODS create_xl_sheet_rels
IMPORTING IMPORTING
!io_worksheet TYPE REF TO zcl_excel_worksheet !io_worksheet TYPE REF TO zcl_excel_worksheet
!iv_drawing_index TYPE i !iv_drawing_index TYPE i OPTIONAL
!iv_comment_index TYPE i !iv_comment_index TYPE i OPTIONAL
!iv_cmnt_vmlindex TYPE i OPTIONAL
!iv_hdft_vmlindex TYPE i OPTIONAL
RETURNING RETURNING
VALUE(ep_content) TYPE xstring . VALUE(ep_content) TYPE xstring .
METHODS create_xl_styles METHODS create_xl_styles
@ -267,6 +269,11 @@ CLASS zcl_excel_writer_2007 DEFINITION
!ip_flag TYPE flag !ip_flag TYPE flag
RETURNING RETURNING
VALUE(ep_boolean) TYPE tv_charbool . VALUE(ep_boolean) TYPE tv_charbool .
METHODS number2string
IMPORTING
!ip_number TYPE numeric
RETURNING
VALUE(ep_string) TYPE string.
ENDCLASS. ENDCLASS.
@ -323,10 +330,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_iterator TYPE REF TO zcl_excel_collection_iterator, lo_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_nested_iterator TYPE REF TO zcl_excel_collection_iterator, lo_nested_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_table TYPE REF TO zcl_excel_table, lo_table TYPE REF TO zcl_excel_table,
lo_drawing TYPE REF TO zcl_excel_drawing, lo_drawing TYPE REF TO zcl_excel_drawing.
lo_drawings TYPE REF TO zcl_excel_drawings,
lo_comment TYPE REF TO zcl_excel_comment, " (+) Issue #180
lo_comments TYPE REF TO zcl_excel_comments. " (+) Issue #180
DATA: lv_content TYPE xstring, DATA: lv_content TYPE xstring,
lv_active TYPE flag, lv_active TYPE flag,
@ -339,8 +343,13 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lv_index_str TYPE string, lv_index_str TYPE string,
lv_value TYPE string, lv_value TYPE string,
lv_sheet_index TYPE i, lv_sheet_index TYPE i,
lv_drawing_counter TYPE i,
lv_comment_counter TYPE i,
lv_vml_counter TYPE i,
lv_drawing_index TYPE i, lv_drawing_index TYPE i,
lv_comment_index TYPE i. " (+) Issue #180 lv_comment_index TYPE i, " (+) Issue #180
lv_cmnt_vmlindex TYPE i,
lv_hdft_vmlindex TYPE i.
********************************************************************** **********************************************************************
@ -433,37 +442,44 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
* Begin - Add - Issue #180 * Begin - Add - Issue #180
* Add comments ********************************** * Add comments **********************************
lo_comments = lo_worksheet->get_comments( ). IF lo_worksheet->get_comments( )->is_empty( ) = abap_false.
IF lo_comments->is_empty( ) = abap_false.
lv_comment_index = lv_comment_index + 1.
" Create comment itself " Create comment itself
lv_content = me->create_xl_comments( lo_worksheet ). ADD 1 TO lv_comment_counter.
lv_xl_comment = me->c_xl_comments. lv_comment_index = lv_comment_counter.
lv_index_str = lv_comment_index. lv_index_str = lv_comment_index.
CONDENSE lv_index_str NO-GAPS. CONDENSE lv_index_str NO-GAPS.
lv_content = me->create_xl_comments( lo_worksheet ).
lv_xl_comment = me->c_xl_comments.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_comment WITH lv_index_str. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_comment WITH lv_index_str.
lo_zip->add( name = lv_xl_comment lo_zip->add( name = lv_xl_comment
content = lv_content ). content = lv_content ).
" Create vmlDrawing that will host the comment " Create vmlDrawing that will host the comment
ADD 1 TO lv_vml_counter.
lv_cmnt_vmlindex = lv_vml_counter.
lv_index_str = lv_cmnt_vmlindex.
CONDENSE lv_index_str NO-GAPS.
lv_content = me->create_xl_drawing_for_comments( lo_worksheet ). lv_content = me->create_xl_drawing_for_comments( lo_worksheet ).
lv_xl_drawing_for_comment = me->cl_xl_drawing_for_comments. lv_xl_drawing_for_comment = me->cl_xl_drawing_for_comments.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_for_comment WITH lv_index_str. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_for_comment WITH lv_index_str.
lo_zip->add( name = lv_xl_drawing_for_comment lo_zip->add( name = lv_xl_drawing_for_comment
content = lv_content ). content = lv_content ).
ELSE.
CLEAR: lv_comment_index, lv_cmnt_vmlindex.
ENDIF. ENDIF.
* End - Add - Issue #180 * End - Add - Issue #180
* Add drawings ********************************** * Add drawings **********************************
lo_drawings = lo_worksheet->get_drawings( ). IF lo_worksheet->get_drawings( )->is_empty( ) = abap_false.
IF lo_drawings->is_empty( ) = abap_false. ADD 1 TO lv_drawing_counter.
lv_drawing_index = lv_drawing_index + 1. lv_drawing_index = lv_drawing_counter.
lv_index_str = lv_drawing_index.
CONDENSE lv_index_str NO-GAPS.
lv_content = me->create_xl_drawings( lo_worksheet ). lv_content = me->create_xl_drawings( lo_worksheet ).
lv_xl_drawing = me->c_xl_drawings. lv_xl_drawing = me->c_xl_drawings.
lv_index_str = lv_drawing_index.
CONDENSE lv_index_str NO-GAPS.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_index_str. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing WITH lv_index_str.
lo_zip->add( name = lv_xl_drawing lo_zip->add( name = lv_xl_drawing
content = lv_content ). content = lv_content ).
@ -473,15 +489,15 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_index_str. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_index_str.
lo_zip->add( name = lv_xl_drawing_rels lo_zip->add( name = lv_xl_drawing_rels
content = lv_content ). content = lv_content ).
ELSE.
CLEAR lv_drawing_index.
ENDIF. ENDIF.
* Add Header/Footer image * Add Header/Footer image
DATA: lt_drawings TYPE zexcel_t_drawings. IF lines( lo_worksheet->get_header_footer_drawings( ) ) > 0. "Header or footer image exist
lt_drawings = lo_worksheet->get_header_footer_drawings( ). ADD 1 TO lv_vml_counter.
IF lines( lt_drawings ) > 0. "Header or footer image exist lv_hdft_vmlindex = lv_vml_counter.
lv_index_str = lv_hdft_vmlindex.
lv_comment_index = lv_comment_index + 1.
lv_index_str = lv_comment_index.
CONDENSE lv_index_str NO-GAPS. CONDENSE lv_index_str NO-GAPS.
" Create vmlDrawing that will host the image " Create vmlDrawing that will host the image
@ -497,13 +513,17 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_index_str. REPLACE ALL OCCURRENCES OF '#' IN lv_xl_drawing_rels WITH lv_index_str.
lo_zip->add( name = lv_xl_drawing_rels lo_zip->add( name = lv_xl_drawing_rels
content = lv_content ). content = lv_content ).
ELSE.
CLEAR lv_hdft_vmlindex.
ENDIF. ENDIF.
lv_xl_sheet_rels = me->c_xl_sheet_rels. lv_xl_sheet_rels = me->c_xl_sheet_rels.
lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet lv_content = me->create_xl_sheet_rels( io_worksheet = lo_worksheet
iv_drawing_index = lv_drawing_index iv_drawing_index = lv_drawing_index
iv_comment_index = lv_comment_index ). " (+) Issue #180 iv_comment_index = lv_comment_index " (+) Issue #180
iv_cmnt_vmlindex = lv_cmnt_vmlindex
iv_hdft_vmlindex = lv_hdft_vmlindex ).
lv_index_str = lv_sheet_index. lv_index_str = lv_sheet_index.
CONDENSE lv_index_str NO-GAPS. CONDENSE lv_index_str NO-GAPS.
@ -2666,7 +2686,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
METHOD create_xl_drawings_vml. METHOD create_xl_drawings_vml.
DATA: DATA:
lo_xml_document TYPE REF TO cl_xml_document,
ld_stream TYPE string. ld_stream TYPE string.
@ -2677,11 +2696,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
* BODY * BODY
ld_stream = set_vml_string( ). ld_stream = set_vml_string( ).
CREATE OBJECT lo_xml_document.
CALL METHOD lo_xml_document->parse_string
EXPORTING
stream = ld_stream.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING' CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING EXPORTING
text = ld_stream text = ld_stream
@ -3166,6 +3180,15 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lv_int_value TYPE i, lv_int_value TYPE i,
lv_int_value_string TYPE string. lv_int_value_string TYPE string.
DATA: lv_rel_id TYPE i. DATA: lv_rel_id TYPE i.
DATA lv_anchor TYPE string.
DATA lv_bottom_row TYPE i.
DATA lv_right_column TYPE i.
DATA lv_bottom_row_str TYPE string.
DATA lv_right_column_str TYPE string.
DATA lv_top_row TYPE i.
DATA lv_left_column TYPE i.
DATA lv_top_row_str TYPE string.
DATA lv_left_column_str TYPE string.
********************************************************************** **********************************************************************
@ -3288,7 +3311,23 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_element_clientdata->append_child( new_child = lo_element_sizewithcells ). lo_element_clientdata->append_child( new_child = lo_element_sizewithcells ).
lo_element_anchor = lo_document->create_simple_element( name = lc_xml_node_anchor lo_element_anchor = lo_document->create_simple_element( name = lc_xml_node_anchor
parent = lo_document ). parent = lo_document ).
lo_element_anchor->set_value( '2, 15, 11, 10, 4, 31, 15, 9' ).
" Anchor represents 4 pairs of numbers:
" ( left column, left offset ), ( top row, top offset ),
" ( right column, right offset ), ( bottom row, botton offset )
" Offsets are a number of pixels.
" Reference: Anchor Class at
" https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.vml.spreadsheet.anchor?view=openxml-3.0.1
lv_anchor = number2string( lo_comment->get_left_column( ) )
&& `, ` && number2string( lo_comment->get_left_offset( ) )
&& `, ` && number2string( lo_comment->get_top_row( ) )
&& `, ` && number2string( lo_comment->get_top_offset( ) )
&& `, ` && number2string( lo_comment->get_right_column( ) )
&& `, ` && number2string( lo_comment->get_right_offset( ) )
&& `, ` && number2string( lo_comment->get_bottom_row( ) )
&& `, ` && number2string( lo_comment->get_bottom_offset( ) ).
lo_element_anchor->set_value( lv_anchor ).
lo_element_clientdata->append_child( new_child = lo_element_anchor ). lo_element_clientdata->append_child( new_child = lo_element_anchor ).
lo_element_autofill = lo_document->create_simple_element( name = lc_xml_node_autofill lo_element_autofill = lo_document->create_simple_element( name = lc_xml_node_autofill
parent = lo_document ). parent = lo_document ).
@ -3334,8 +3373,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ls_odd_footer TYPE zexcel_s_worksheet_head_foot, ls_odd_footer TYPE zexcel_s_worksheet_head_foot,
ls_even_header TYPE zexcel_s_worksheet_head_foot, ls_even_header TYPE zexcel_s_worksheet_head_foot,
ls_even_footer TYPE zexcel_s_worksheet_head_foot, ls_even_footer TYPE zexcel_s_worksheet_head_foot,
lv_content TYPE string, lv_content TYPE string.
lo_xml_document TYPE REF TO cl_xml_document.
* INIT_RESULT * INIT_RESULT
@ -3383,11 +3421,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ld_7 ld_7
INTO lv_content. INTO lv_content.
CREATE OBJECT lo_xml_document.
CALL METHOD lo_xml_document->parse_string
EXPORTING
stream = lv_content.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING' CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING EXPORTING
text = lv_content text = lv_content
@ -4002,8 +4035,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
DATA: lv_value TYPE string, DATA: lv_value TYPE string,
lv_relation_id TYPE i, lv_relation_id TYPE i,
lv_index_str TYPE string, lv_index_str TYPE string.
lv_comment_index TYPE i.
********************************************************************** **********************************************************************
* STEP 1: Create [Content_Types].xml into the root of the ZIP * STEP 1: Create [Content_Types].xml into the root of the ZIP
@ -4047,10 +4079,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ENDWHILE. ENDWHILE.
* drawing * drawing
DATA: lo_drawings TYPE REF TO zcl_excel_drawings. IF iv_drawing_index > 0.
lo_drawings = io_worksheet->get_drawings( ).
IF lo_drawings->is_empty( ) = abap_false.
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ). parent = lo_document ).
ADD 1 TO lv_relation_id. ADD 1 TO lv_relation_id.
@ -4074,18 +4103,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ENDIF. ENDIF.
* Begin - Add - Issue #180 * Begin - Add - Issue #180
DATA: lo_comments TYPE REF TO zcl_excel_comments. IF iv_cmnt_vmlindex > 0 AND iv_comment_index > 0.
lv_comment_index = iv_comment_index.
lo_comments = io_worksheet->get_comments( ).
IF lo_comments->is_empty( ) = abap_false.
" Drawing for comment " Drawing for comment
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ). parent = lo_document ).
ADD 1 TO lv_relation_id. ADD 1 TO lv_relation_id.
ADD 1 TO lv_comment_index.
lv_value = lv_relation_id. lv_value = lv_relation_id.
CONDENSE lv_value. CONDENSE lv_value.
@ -4095,7 +4117,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_element->set_attribute_ns( name = lc_xml_attr_type lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rid_drawing_cmt_tp ). value = lc_xml_node_rid_drawing_cmt_tp ).
lv_index_str = iv_comment_index. lv_index_str = iv_cmnt_vmlindex.
CONDENSE lv_index_str NO-GAPS. CONDENSE lv_index_str NO-GAPS.
lv_value = me->cl_xl_drawing_for_comments. lv_value = me->cl_xl_drawing_for_comments.
REPLACE 'xl' WITH '..' INTO lv_value. REPLACE 'xl' WITH '..' INTO lv_value.
@ -4130,13 +4152,12 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
********************************************************************** **********************************************************************
* header footer image * header footer image
DATA: lt_drawings TYPE zexcel_t_drawings. IF iv_hdft_vmlindex > 0. "Header or footer image exist
lt_drawings = io_worksheet->get_header_footer_drawings( ).
IF lines( lt_drawings ) > 0. "Header or footer image exist
ADD 1 TO lv_relation_id.
" Drawing for comment/header/footer " Drawing for comment/header/footer
lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship lo_element = lo_document->create_simple_element( name = lc_xml_node_relationship
parent = lo_document ). parent = lo_document ).
ADD 1 TO lv_relation_id.
lv_value = lv_relation_id. lv_value = lv_relation_id.
CONDENSE lv_value. CONDENSE lv_value.
CONCATENATE 'rId' lv_value INTO lv_value. CONCATENATE 'rId' lv_value INTO lv_value.
@ -4145,7 +4166,7 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_element->set_attribute_ns( name = lc_xml_attr_type lo_element->set_attribute_ns( name = lc_xml_attr_type
value = lc_xml_node_rid_drawing_cmt_tp ). value = lc_xml_node_rid_drawing_cmt_tp ).
lv_index_str = lv_comment_index. lv_index_str = iv_hdft_vmlindex.
CONDENSE lv_index_str NO-GAPS. CONDENSE lv_index_str NO-GAPS.
lv_value = me->cl_xl_drawing_for_comments. lv_value = me->cl_xl_drawing_for_comments.
REPLACE 'xl' WITH '..' INTO lv_value. REPLACE 'xl' WITH '..' INTO lv_value.
@ -4212,10 +4233,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
DATA: col_count TYPE int4, DATA: col_count TYPE int4,
lo_autofilters TYPE REF TO zcl_excel_autofilters, lo_autofilters TYPE REF TO zcl_excel_autofilters,
lo_autofilter TYPE REF TO zcl_excel_autofilter, lo_autofilter TYPE REF TO zcl_excel_autofilter,
l_autofilter_hidden TYPE flag,
lt_values TYPE zexcel_t_autofilter_values,
ls_values TYPE zexcel_s_autofilter_values,
ls_area TYPE zexcel_s_autofilter_area,
lo_iterator TYPE REF TO zcl_excel_collection_iterator, lo_iterator TYPE REF TO zcl_excel_collection_iterator,
lo_table TYPE REF TO zcl_excel_table, lo_table TYPE REF TO zcl_excel_table,
@ -4261,9 +4278,8 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_autofilters = excel->get_autofilters_reference( ). lo_autofilters = excel->get_autofilters_reference( ).
lo_autofilter = lo_autofilters->get( io_worksheet = io_worksheet ) . lo_autofilter = lo_autofilters->get( io_worksheet = io_worksheet ) .
IF lo_autofilter IS BOUND. IF lo_autofilter IS BOUND.
lt_values = lo_autofilter->get_values( ) . * Area not used here, but makes the validation for lo_autofilter->is_row_hidden
ls_area = lo_autofilter->get_filter_area( ) . lo_autofilter->get_filter_area( ) .
l_autofilter_hidden = abap_true. " First defautl is not showing
ENDIF. ENDIF.
*--------------------------------------------------------------------* *--------------------------------------------------------------------*
*issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 1 - start *issue #220 - If cell in tables-area don't use default from row or column or sheet - Coding 1 - start
@ -4326,14 +4342,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
CLEAR ls_sheet_content. CLEAR ls_sheet_content.
LOOP AT io_worksheet->sheet_content INTO ls_sheet_content. LOOP AT io_worksheet->sheet_content INTO ls_sheet_content.
IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much
CLEAR l_autofilter_hidden.
ELSE.
READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column.
IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value.
CLEAR l_autofilter_hidden.
ENDIF.
ENDIF.
CLEAR ls_style_mapping. CLEAR ls_style_mapping.
*Create row element *Create row element
*issues #346,#154, #195 - problems when we have information in row_dimension but no cell content in that row *issues #346,#154, #195 - problems when we have information in row_dimension but no cell content in that row
@ -4364,18 +4372,11 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ENDIF. ENDIF.
IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row. IF ls_last_row-cell_row NE <ls_sheet_content>-cell_row.
IF lo_autofilter IS BOUND.
IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header
ls_area-row_end < ls_last_row-cell_row .
CLEAR l_autofilter_hidden.
ENDIF.
ELSE.
CLEAR l_autofilter_hidden.
ENDIF.
IF ls_last_row-cell_row IS NOT INITIAL. IF ls_last_row-cell_row IS NOT INITIAL.
" Row visibility of previos row. " Row visibility of previos row.
IF lo_row->get_visible( io_worksheet ) = abap_false OR IF lo_row->get_visible( io_worksheet ) = abap_false OR
l_autofilter_hidden = abap_true. ( lo_autofilter IS BOUND AND
lo_autofilter->is_row_hidden( ls_last_row-cell_row ) = abap_true ).
lo_element_2->set_attribute_ns( name = 'hidden' value = 'true' ). lo_element_2->set_attribute_ns( name = 'hidden' value = 'true' ).
ENDIF. ENDIF.
rv_ixml_sheet_data_root->append_child( new_child = lo_element_2 ). " row node rv_ixml_sheet_data_root->append_child( new_child = lo_element_2 ). " row node
@ -4423,11 +4424,6 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
lo_element_2->set_attribute_ns( name = 's' value = lv_value ). lo_element_2->set_attribute_ns( name = 's' value = lv_value ).
lo_element_2->set_attribute_ns( name = 'customFormat' value = '1' ). lo_element_2->set_attribute_ns( name = 'customFormat' value = '1' ).
ENDIF. ENDIF.
IF lt_values IS INITIAL. " no values attached to autofilter " issue #368 autofilter filtering too much
CLEAR l_autofilter_hidden.
ELSE.
l_autofilter_hidden = abap_true. " First default is not showing
ENDIF.
ELSE. ELSE.
ENDIF. ENDIF.
@ -4540,21 +4536,10 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ls_last_row = <ls_sheet_content>. ls_last_row = <ls_sheet_content>.
ENDLOOP. ENDLOOP.
IF sy-subrc = 0. IF sy-subrc = 0.
READ TABLE lt_values INTO ls_values WITH KEY column = ls_last_row-cell_column.
IF sy-subrc = 0 AND ls_values-value = ls_last_row-cell_value.
CLEAR l_autofilter_hidden.
ENDIF.
IF lo_autofilter IS BOUND.
IF ls_area-row_start >= ls_last_row-cell_row OR " One less for header
ls_area-row_end < ls_last_row-cell_row .
CLEAR l_autofilter_hidden.
ENDIF.
ELSE.
CLEAR l_autofilter_hidden.
ENDIF.
" Row visibility of previos row. " Row visibility of previos row.
IF lo_row->get_visible( ) = abap_false OR IF lo_row->get_visible( ) = abap_false OR
l_autofilter_hidden = abap_true. ( lo_autofilter IS BOUND AND
lo_autofilter->is_row_hidden( ls_last_row-cell_row ) = abap_true ).
lo_element_2->set_attribute_ns( name = 'hidden' value = 'true' ). lo_element_2->set_attribute_ns( name = 'hidden' value = 'true' ).
ENDIF. ENDIF.
rv_ixml_sheet_data_root->append_child( new_child = lo_element_2 ). " row node rv_ixml_sheet_data_root->append_child( new_child = lo_element_2 ). " row node
@ -6208,6 +6193,12 @@ CLASS zcl_excel_writer_2007 IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD number2string.
ep_string = ip_number.
CONDENSE ep_string.
ENDMETHOD.
METHOD render_xml_document. METHOD render_xml_document.
DATA lo_streamfactory TYPE REF TO if_ixml_stream_factory. DATA lo_streamfactory TYPE REF TO if_ixml_stream_factory.
DATA lo_ostream TYPE REF TO if_ixml_ostream. DATA lo_ostream TYPE REF TO if_ixml_ostream.

View File

@ -327,6 +327,7 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION.
value = '0' ). value = '0' ).
ENDIF. ENDIF.
" Zoom scale " Zoom scale
IF o_worksheet->zif_excel_sheet_properties~zoomscale NE 0.
IF o_worksheet->zif_excel_sheet_properties~zoomscale GT 400. IF o_worksheet->zif_excel_sheet_properties~zoomscale GT 400.
o_worksheet->zif_excel_sheet_properties~zoomscale = 400. o_worksheet->zif_excel_sheet_properties~zoomscale = 400.
ELSEIF o_worksheet->zif_excel_sheet_properties~zoomscale LT 10. ELSEIF o_worksheet->zif_excel_sheet_properties~zoomscale LT 10.
@ -336,6 +337,7 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION.
CONDENSE lv_value. CONDENSE lv_value.
lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscale lo_element_2->set_attribute_ns( name = lc_xml_attr_zoomscale
value = lv_value ). value = lv_value ).
ENDIF.
IF o_worksheet->zif_excel_sheet_properties~zoomscale_normal NE 0. IF o_worksheet->zif_excel_sheet_properties~zoomscale_normal NE 0.
IF o_worksheet->zif_excel_sheet_properties~zoomscale_normal GT 400. IF o_worksheet->zif_excel_sheet_properties~zoomscale_normal GT 400.
o_worksheet->zif_excel_sheet_properties~zoomscale_normal = 400. o_worksheet->zif_excel_sheet_properties~zoomscale_normal = 400.
@ -393,6 +395,11 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION.
value = '0' ). value = '0' ).
ENDIF. ENDIF.
IF o_worksheet->sheetview_top_left_cell IS NOT INITIAL.
lo_element_2->set_attribute_ns( name = 'topLeftCell'
value = o_worksheet->sheetview_top_left_cell ).
ENDIF.
" freeze panes " freeze panes
o_worksheet->get_freeze_cell( IMPORTING ep_row = lv_freeze_cell_row o_worksheet->get_freeze_cell( IMPORTING ep_row = lv_freeze_cell_row
ep_column = lv_freeze_cell_column ). ep_column = lv_freeze_cell_column ).
@ -415,11 +422,15 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION.
value = lv_value ). value = lv_value ).
ENDIF. ENDIF.
lv_freeze_cell_column_alpha = zcl_excel_common=>convert_column2alpha( ip_column = lv_freeze_cell_column ). IF o_worksheet->pane_top_left_cell IS NOT INITIAL.
lv_value = zcl_excel_common=>number_to_excel_string( ip_value = lv_freeze_cell_row ). lo_element_3->set_attribute_ns( name = 'topLeftCell'
CONCATENATE lv_freeze_cell_column_alpha lv_value INTO lv_value. value = o_worksheet->pane_top_left_cell ).
ELSE.
lv_value = zcl_excel_common=>convert_column_a_row2columnrow( i_column = lv_freeze_cell_column
i_row = lv_freeze_cell_row ).
lo_element_3->set_attribute_ns( name = 'topLeftCell' lo_element_3->set_attribute_ns( name = 'topLeftCell'
value = lv_value ). value = lv_value ).
ENDIF.
lo_element_3->set_attribute_ns( name = 'activePane' lo_element_3->set_attribute_ns( name = 'activePane'
value = 'bottomRight' ). value = 'bottomRight' ).
@ -1719,7 +1730,7 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION.
value = lv_value ). value = lv_value ).
o_element_root->append_child( new_child = lo_element ). o_element_root->append_child( new_child = lo_element ).
ADD 1 TO v_relation_id. " +1 for comments (not referenced in XL sheet but let's reserve the rId) ADD 1 TO v_relation_id. "for xl/comments.xml (not referenced in XL sheet but counted in sheet rels)
ENDIF. ENDIF.
* End - Add - Issue #180 * End - Add - Issue #180
ENDMETHOD. ENDMETHOD.
@ -1742,7 +1753,6 @@ CLASS lcl_create_xl_sheet IMPLEMENTATION.
lo_element->set_attribute( name = 'r:id' lo_element->set_attribute( name = 'r:id'
value = lv_value ). value = lv_value ).
o_element_root->append_child( new_child = lo_element ). o_element_root->append_child( new_child = lo_element ).
ADD 1 TO v_relation_id. " +1 for comments (not referenced in XL sheet but let's reserve the rId)
ENDIF. ENDIF.
* *
ENDMETHOD. ENDMETHOD.

View File

@ -9,6 +9,9 @@ CLASS zcl_excel_writer_csv DEFINITION
INTERFACES zif_excel_writer . INTERFACES zif_excel_writer .
"! Default value for initial dates e.g. user's format (DD.MM.YYYY, MM.DD.YYYY, etc.)
CONSTANTS c_default TYPE c LENGTH 10 VALUE 'DEFAULT' ##NO_TEXT.
CLASS-METHODS set_delimiter CLASS-METHODS set_delimiter
IMPORTING IMPORTING
VALUE(ip_value) TYPE c DEFAULT ';' . VALUE(ip_value) TYPE c DEFAULT ';' .
@ -24,7 +27,10 @@ CLASS zcl_excel_writer_csv DEFINITION
CLASS-METHODS set_active_sheet_index_by_name CLASS-METHODS set_active_sheet_index_by_name
IMPORTING IMPORTING
!i_worksheet_name TYPE zexcel_worksheets_name . !i_worksheet_name TYPE zexcel_worksheets_name .
*"* protected components of class ZCL_EXCEL_WRITER_2007 CLASS-METHODS set_initial_ext_date
IMPORTING
!ip_value TYPE char10 DEFAULT c_default .
*"* protected components of class ZCL_EXCEL_WRITER_CSV
*"* do not include other source files here!!! *"* do not include other source files here!!!
PROTECTED SECTION. PROTECTED SECTION.
*"* private components of class ZCL_EXCEL_WRITER_CSV *"* private components of class ZCL_EXCEL_WRITER_CSV
@ -38,6 +44,7 @@ CLASS zcl_excel_writer_csv DEFINITION
eol TYPE c LENGTH 2 VALUE cl_abap_char_utilities=>cr_lf ##NO_TEXT. eol TYPE c LENGTH 2 VALUE cl_abap_char_utilities=>cr_lf ##NO_TEXT.
CLASS-DATA worksheet_name TYPE zexcel_worksheets_name . CLASS-DATA worksheet_name TYPE zexcel_worksheets_name .
CLASS-DATA worksheet_index TYPE zexcel_active_worksheet . CLASS-DATA worksheet_index TYPE zexcel_active_worksheet .
CLASS-DATA initial_ext_date TYPE char10 VALUE c_default.
METHODS create METHODS create
RETURNING RETURNING
@ -53,7 +60,7 @@ ENDCLASS.
CLASS zcl_excel_writer_csv IMPLEMENTATION. CLASS ZCL_EXCEL_WRITER_CSV IMPLEMENTATION.
METHOD create. METHOD create.
@ -220,6 +227,9 @@ CLASS zcl_excel_writer_csv IMPLEMENTATION.
CASE <fs_sheet_content>-data_type. CASE <fs_sheet_content>-data_type.
WHEN 'd' OR 'D'. WHEN 'd' OR 'D'.
IF <fs_sheet_content>-cell_value IS INITIAL AND initial_ext_date <> c_default.
lc_value = initial_ext_date.
ELSE.
lc_value = zcl_excel_common=>excel_string_to_date( ip_value = <fs_sheet_content>-cell_value ). lc_value = zcl_excel_common=>excel_string_to_date( ip_value = <fs_sheet_content>-cell_value ).
TRY. TRY.
lv_date = lc_value. lv_date = lc_value.
@ -238,6 +248,7 @@ CLASS zcl_excel_writer_csv IMPLEMENTATION.
CATCH cx_sy_conversion_no_number. CATCH cx_sy_conversion_no_number.
ENDTRY. ENDTRY.
ENDIF.
WHEN 't' OR 'T'. WHEN 't' OR 'T'.
lc_value = zcl_excel_common=>excel_string_to_time( ip_value = <fs_sheet_content>-cell_value ). lc_value = zcl_excel_common=>excel_string_to_time( ip_value = <fs_sheet_content>-cell_value ).
@ -302,6 +313,11 @@ CLASS zcl_excel_writer_csv IMPLEMENTATION.
ENDMETHOD. ENDMETHOD.
METHOD set_initial_ext_date.
initial_ext_date = ip_value.
ENDMETHOD.
METHOD zif_excel_writer~write_file. METHOD zif_excel_writer~write_file.
me->excel = io_excel. me->excel = io_excel.
ep_file = me->create( ). ep_file = me->create( ).

View File

@ -32,6 +32,11 @@
<LANGU>I</LANGU> <LANGU>I</LANGU>
<DESCRIPT>Create CSV ; Delimited format</DESCRIPT> <DESCRIPT>Create CSV ; Delimited format</DESCRIPT>
</SEOCOMPOTX> </SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>C_DEFAULT</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Constant for string &apos;DEFAULT&apos;</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX> <SEOCOMPOTX>
<CMPNAME>DELIMITER</CMPNAME> <CMPNAME>DELIMITER</CMPNAME>
<LANGU>E</LANGU> <LANGU>E</LANGU>
@ -72,6 +77,11 @@
<LANGU>I</LANGU> <LANGU>I</LANGU>
<DESCRIPT>Excel creator</DESCRIPT> <DESCRIPT>Excel creator</DESCRIPT>
</SEOCOMPOTX> </SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>INITIAL_EXT_DATE</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Initial External Date</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX> <SEOCOMPOTX>
<CMPNAME>SET_ACTIVE_SHEET_INDEX</CMPNAME> <CMPNAME>SET_ACTIVE_SHEET_INDEX</CMPNAME>
<LANGU>E</LANGU> <LANGU>E</LANGU>
@ -122,6 +132,11 @@
<LANGU>I</LANGU> <LANGU>I</LANGU>
<DESCRIPT>Set End Of Line character</DESCRIPT> <DESCRIPT>Set End Of Line character</DESCRIPT>
</SEOCOMPOTX> </SEOCOMPOTX>
<SEOCOMPOTX>
<CMPNAME>SET_INITIAL_EXT_DATE</CMPNAME>
<LANGU>E</LANGU>
<DESCRIPT>Set Initial External Date (replacing default &apos;00.00.0000&apos;)</DESCRIPT>
</SEOCOMPOTX>
<SEOCOMPOTX> <SEOCOMPOTX>
<CMPNAME>WORKSHEET_INDEX</CMPNAME> <CMPNAME>WORKSHEET_INDEX</CMPNAME>
<LANGU>E</LANGU> <LANGU>E</LANGU>
@ -143,6 +158,14 @@
<DESCRIPT>Worksheets name</DESCRIPT> <DESCRIPT>Worksheets name</DESCRIPT>
</SEOCOMPOTX> </SEOCOMPOTX>
</DESCRIPTIONS> </DESCRIPTIONS>
<DESCRIPTIONS_SUB>
<SEOSUBCOTX>
<CMPNAME>SET_INITIAL_EXT_DATE</CMPNAME>
<SCONAME>IP_VALUE</SCONAME>
<LANGU>E</LANGU>
<DESCRIPT>Input Value</DESCRIPT>
</SEOSUBCOTX>
</DESCRIPTIONS_SUB>
</asx:values> </asx:values>
</asx:abap> </asx:abap>
</abapGit> </abapGit>

View File

@ -262,8 +262,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION.
lo_ostream TYPE REF TO if_ixml_ostream, lo_ostream TYPE REF TO if_ixml_ostream,
lo_renderer TYPE REF TO if_ixml_renderer. lo_renderer TYPE REF TO if_ixml_renderer.
DATA: lv_subrc TYPE sysubrc, DATA: lv_contenttype TYPE string.
lv_contenttype TYPE string.
********************************************************************** **********************************************************************
* STEP 3: Create standard contentType * STEP 3: Create standard contentType
@ -273,7 +272,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION.
* STEP 2: modify XML adding the extension bin definition * STEP 2: modify XML adding the extension bin definition
CREATE OBJECT lo_document_xml. CREATE OBJECT lo_document_xml.
lv_subrc = lo_document_xml->parse_xstring( ep_content ). lo_document_xml->parse_xstring( ep_content ).
lo_document ?= lo_document_xml->m_document. lo_document ?= lo_document_xml->m_document.
lo_element_root = lo_document->if_ixml_node~get_first_child( ). lo_element_root = lo_document->if_ixml_node~get_first_child( ).
@ -342,7 +341,6 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION.
DATA: lv_xml_node_ridx_id TYPE string, DATA: lv_xml_node_ridx_id TYPE string,
lv_size TYPE i, lv_size TYPE i,
lv_subrc TYPE sysubrc,
lv_syindex(2) TYPE c. lv_syindex(2) TYPE c.
********************************************************************** **********************************************************************
@ -353,7 +351,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION.
* STEP 2: modify XML adding the vbaProject relation * STEP 2: modify XML adding the vbaProject relation
CREATE OBJECT lo_document_xml. CREATE OBJECT lo_document_xml.
lv_subrc = lo_document_xml->parse_xstring( ep_content ). lo_document_xml->parse_xstring( ep_content ).
lo_document ?= lo_document_xml->m_document. lo_document ?= lo_document_xml->m_document.
lo_element_root = lo_document->if_ixml_node~get_first_child( ). lo_element_root = lo_document->if_ixml_node~get_first_child( ).
@ -406,8 +404,6 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION.
lo_ostream TYPE REF TO if_ixml_ostream, lo_ostream TYPE REF TO if_ixml_ostream,
lo_renderer TYPE REF TO if_ixml_renderer. lo_renderer TYPE REF TO if_ixml_renderer.
DATA: lv_subrc TYPE sysubrc.
********************************************************************** **********************************************************************
* STEP 3: Create standard relationship * STEP 3: Create standard relationship
ep_content = super->create_xl_sheet( io_worksheet = io_worksheet ep_content = super->create_xl_sheet( io_worksheet = io_worksheet
@ -417,7 +413,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION.
* STEP 2: modify XML adding the vbaProject relation * STEP 2: modify XML adding the vbaProject relation
CREATE OBJECT lo_document_xml. CREATE OBJECT lo_document_xml.
lv_subrc = lo_document_xml->parse_xstring( ep_content ). lo_document_xml->parse_xstring( ep_content ).
lo_document ?= lo_document_xml->m_document. lo_document ?= lo_document_xml->m_document.
lo_element_root = lo_document->if_ixml_node~get_first_child( ). lo_element_root = lo_document->if_ixml_node~get_first_child( ).
@ -458,8 +454,6 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION.
lo_ostream TYPE REF TO if_ixml_ostream, lo_ostream TYPE REF TO if_ixml_ostream,
lo_renderer TYPE REF TO if_ixml_renderer. lo_renderer TYPE REF TO if_ixml_renderer.
DATA: lv_subrc TYPE sysubrc.
********************************************************************** **********************************************************************
* STEP 3: Create standard relationship * STEP 3: Create standard relationship
ep_content = super->create_xl_workbook( ). ep_content = super->create_xl_workbook( ).
@ -468,7 +462,7 @@ CLASS zcl_excel_writer_xlsm IMPLEMENTATION.
* STEP 2: modify XML adding the vbaProject relation * STEP 2: modify XML adding the vbaProject relation
CREATE OBJECT lo_document_xml. CREATE OBJECT lo_document_xml.
lv_subrc = lo_document_xml->parse_xstring( ep_content ). lo_document_xml->parse_xstring( ep_content ).
lo_document ?= lo_document_xml->m_document. lo_document ?= lo_document_xml->m_document.
lo_element_root = lo_document->if_ixml_node~get_first_child( ). lo_element_root = lo_document->if_ixml_node~get_first_child( ).

View File

@ -40,7 +40,7 @@
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>GRADTYPE</FIELDNAME> <FIELDNAME>GRADTYPE</FIELDNAME>
<ROLLNAME>ZEXCEL_S_CSTYLEX_GRADTYPE</ROLLNAME> <ROLLNAME>ZEXCEL_S_GRADIENT_TYPE</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<DATATYPE>STRU</DATATYPE> <DATATYPE>STRU</DATATYPE>
<MASK> STRUS</MASK> <MASK> STRUS</MASK>

View File

@ -25,31 +25,31 @@
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>POSITION</FIELDNAME> <FIELDNAME>POSITION</FIELDNAME>
<ROLLNAME>TABFDPOS</ROLLNAME> <ROLLNAME>ZEXCEL_COMPONENT_POSITION</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>SCRTEXT_S</FIELDNAME> <FIELDNAME>SCRTEXT_S</FIELDNAME>
<ROLLNAME>SCRTEXT_S</ROLLNAME> <ROLLNAME>ZEXCEL_DISP_TEXT_SHORT</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>SCRTEXT_M</FIELDNAME> <FIELDNAME>SCRTEXT_M</FIELDNAME>
<ROLLNAME>SCRTEXT_M</ROLLNAME> <ROLLNAME>ZEXCEL_DISP_TEXT_MEDIUM</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>SCRTEXT_L</FIELDNAME> <FIELDNAME>SCRTEXT_L</FIELDNAME>
<ROLLNAME>SCRTEXT_L</ROLLNAME> <ROLLNAME>ZEXCEL_DISP_TEXT_LONG</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
<DD03P> <DD03P>
<FIELDNAME>DYNPFLD</FIELDNAME> <FIELDNAME>DYNPFLD</FIELDNAME>
<ROLLNAME>DYNPROFLD</ROLLNAME> <ROLLNAME>ZEXCEL_SCREEN_DISPLAY</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<VALEXI>X</VALEXI> <VALEXI>X</VALEXI>
<SHLPORIGIN>F</SHLPORIGIN> <SHLPORIGIN>F</SHLPORIGIN>
@ -123,6 +123,12 @@
<ADMINFIELD>0</ADMINFIELD> <ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE> <COMPTYPE>E</COMPTYPE>
</DD03P> </DD03P>
<DD03P>
<FIELDNAME>WIDTH</FIELDNAME>
<ROLLNAME>INT4</ROLLNAME>
<ADMINFIELD>0</ADMINFIELD>
<COMPTYPE>E</COMPTYPE>
</DD03P>
</DD03P_TABLE> </DD03P_TABLE>
<I18N_LANGS> <I18N_LANGS>
<LANGU>1</LANGU> <LANGU>1</LANGU>

View File

@ -1,19 +0,0 @@
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates">
<tt:root name="ROOT"/>
<tt:template>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance" tt:ref="ROOT" tt:extensible="deep-dynamic">
<dc:creator tt:value-ref="CREATOR"/>
<dc:description tt:value-ref="DESCRIPTION"/>
<cp:lastModifiedBy tt:value-ref="LAST_MODIFIED_BY"/>
<dcterms:created tt:value-ref="CREATED" xsi:type="dcterms:W3CDTF"/>
<dcterms:modified tt:value-ref="MODIFIED" xsi:type="dcterms:W3CDTF"/>
</cp:coreProperties>
</tt:template>
</tt:transform>

View File

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_XSLT" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<ATTRIBUTES>
<XSLTDESC>ZEXCEL_TR_DOCPROPS_CORE</XSLTDESC>
<LANGU>E</LANGU>
<DESCRIPT>docProps/core.xml</DESCRIPT>
</ATTRIBUTES>
</asx:values>
</asx:abap>
</abapGit>

View File

@ -0,0 +1,37 @@
CLASS cl_excel_test DEFINITION PUBLIC.
PUBLIC SECTION.
CLASS-METHODS run
RETURNING VALUE(xdata) TYPE xstring
RAISING cx_static_check.
ENDCLASS.
CLASS cl_excel_test IMPLEMENTATION.
METHOD run.
DATA lo_excel TYPE REF TO zcl_excel.
DATA lo_worksheet TYPE REF TO zcl_excel_worksheet.
DATA lo_hyperlink TYPE REF TO zcl_excel_hyperlink.
DATA lo_column TYPE REF TO zcl_excel_column.
DATA lv_date TYPE d.
DATA lv_time TYPE t.
DATA li_writer TYPE REF TO zif_excel_writer.
CREATE OBJECT lo_excel.
lo_worksheet = lo_excel->get_active_worksheet( ).
lo_worksheet->set_cell( ip_column = 'B' ip_row = 2 ip_value = 'Hello world' ).
lv_date = '20211231'.
lv_time = '055817'.
lo_worksheet->set_cell( ip_column = 'B' ip_row = 3 ip_value = lv_date ).
lo_worksheet->set_cell( ip_column = 'C' ip_row = 3 ip_value = lv_time ).
lo_hyperlink = zcl_excel_hyperlink=>create_external_link( iv_url = 'https://abap2xlsx.github.io/abap2xlsx' ).
lo_worksheet->set_cell( ip_columnrow = 'B4' ip_value = 'Click here to visit abap2xlsx homepage' ip_hyperlink = lo_hyperlink ).
lo_worksheet->set_cell( ip_column = 'B' ip_row = 6 ip_value = '你好,世界' ).
lo_worksheet->set_cell( ip_column = 'C' ip_row = 6 ip_value = '(Chinese)' ).
lo_worksheet->set_cell( ip_column = 'B' ip_row = 7 ip_value = 'नमस्ते दुनिया' ).
lo_worksheet->set_cell( ip_column = 'C' ip_row = 7 ip_value = '(Hindi)' ).
lo_column = lo_worksheet->get_column( ip_column = 'B' ).
lo_column->set_width( ip_width = 11 ).
CREATE OBJECT li_writer TYPE zcl_excel_writer_2007.
xdata = li_writer->write_file( lo_excel ).
ENDMETHOD.
ENDCLASS.

View File

@ -0,0 +1,10 @@
CLASS ltcl DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATION SHORT.
PUBLIC SECTION.
METHODS test FOR TESTING RAISING cx_static_check.
ENDCLASS.
CLASS ltcl IMPLEMENTATION.
METHOD test.
cl_excel_test=>run( ).
ENDMETHOD.
ENDCLASS.

34
test/mimetypes.tabl.xml Normal file
View File

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<abapGit version="v1.0.0" serializer="LCL_OBJECT_TABL" serializer_version="v1.0.0">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<DD02V>
<TABNAME>MIMETYPES</TABNAME>
<DDLANGUAGE>E</DDLANGUAGE>
<TABCLASS>INTTAB</TABCLASS>
<DDTEXT>MIMETYPES</DDTEXT>
<EXCLASS>1</EXCLASS>
</DD02V>
<DD03P_TABLE>
<DD03P>
<FIELDNAME>TYPE</FIELDNAME>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000256</INTLEN>
<DATATYPE>CHAR</DATATYPE>
<LENG>000128</LENG>
<MASK> CHAR</MASK>
</DD03P>
<DD03P>
<FIELDNAME>EXTENSION</FIELDNAME>
<ADMINFIELD>0</ADMINFIELD>
<INTTYPE>C</INTTYPE>
<INTLEN>000128</INTLEN>
<DATATYPE>CHAR</DATATYPE>
<LENG>000064</LENG>
<MASK> CHAR</MASK>
</DD03P>
</DD03P_TABLE>
</asx:values>
</asx:abap>
</abapGit>

9
test/run.mjs Normal file
View File

@ -0,0 +1,9 @@
import {initializeABAP} from "../output/init.mjs";
import {cl_excel_test} from "../output/cl_excel_test.clas.mjs";
import * as fs from "node:fs";
await initializeABAP();
const test = new cl_excel_test();
const buf = Buffer.from((await test.run()).get().toLowerCase(), "hex");
fs.writeFileSync("foo.xlsx", buf);