Import initial din SVN ROAAUTO/Trunk @HEAD

This commit is contained in:
2026-04-11 17:11:32 +03:00
commit 656d98697f
1856 changed files with 163525 additions and 0 deletions

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,349 @@
#DEFINE CR CHR(13)
#DEFINE LF CHR(10)
#DEFINE CRLF CR+LF
#DEFINE TAB CHR(9)
#DEFINE False .F.
#DEFINE True .T.
#DEFINE FOF_SILENT 4
#DEFINE LIMITS_MAX_CELL_CHARS 32767
#DEFINE LIMITS_MAX_COLUMNS 16384
#DEFINE LIMITS_MAX_ROWS 1048576
#DEFINE LIMITS_MAX_ROW_HEIGHT 409
#DEFINE LIMITS_MAX_COLUMN_WIDTH 255
#DEFINE LIMITS_MAX_HDR_FTR_CHARS 255
#DEFINE LIMITS_MAX_CELL_FORMATS 200
#DEFINE LIMITS_MAX_FILL_STYLES 256
#DEFINE LIMITS_MAX_LINE_STYLES 256
#DEFINE LIMITS_MAX_FONTS 512
#DEFINE LIMITS_MAX_FORMULA_LENGTH 8192
#DEFINE LIMITS_MAX_SH_NAME 31 && Limit adjusted; found by Doug Hennig
#DEFINE INSERT_BEFORE "BEFORE"
#DEFINE INSERT_AFTER "AFTER"
#DEFINE INSERT_RIGHT "RIGHT"
#DEFINE INSERT_LEFT "LEFT"
#DEFINE SHIFT_CELLS_UP 1
#DEFINE SHIFT_CELLS_LEFT 2
#DEFINE FILTER_OP_EQUAL "equal"
#DEFINE FILTER_OP_GREATERTHAN "greaterThan"
#DEFINE FILTER_OP_GREATOREQUAL "greaterThanOrEqual"
#DEFINE FILTER_OP_LESSTHAN "lessThan"
#DEFINE FILTER_OP_LESSOREQUAL "lessThanOrEqual"
#DEFINE FILTER_OP_NOT_EQUAL "notEqual"
#DEFINE SHARED_FORMULA_COLUMN "C"
#DEFINE SHARED_FORMULA_ROW "R"
#DEFINE START_NUMERIC_FORMAT_ID 165
#DEFINE SCOPE_WB_NAMED_RANGE 0 && Scope of named range - workbook
#DEFINE SCOPE_SH_NAMED_RANGE 1 && Scope of named range - limited to sheet
#DEFINE VISIBLE_SHEET_STATE 0 && visible (default)
#DEFINE HIDDEN_SHEET_STATE 1 && hidden
#DEFINE VERYHIDDEN_SHEET_STATE 2 && veryHidden
#DEFINE NONE_VALID_TYPE 1 && none
#DEFINE WHOLE_VALID_TYPE 2 && whole
#DEFINE DECIMAL_VALID_TYPE 3 && decimal
#DEFINE LIST_VALID_TYPE 4 && list
#DEFINE DATE_VALID_TYPE 5 && date
#DEFINE TIME_VALID_TYPE 6 && time
#DEFINE TXTLEN_VALID_TYPE 7 && textLength
#DEFINE CUSTOM_VALID_TYPE 8 && custom
#DEFINE STOP_VALID_STYLE 1 && stop
#DEFINE WARN_VALID_STYLE 2 && warning
#DEFINE INFO_VALID_STYLE 3 && information
#DEFINE BETWEEN_VALID_OPER 1 && between
#DEFINE NOTBETW_VALID_OPER 2 && notBetween
#DEFINE EQUAL_VALID_OPER 3 && equal
#DEFINE NOTEQUAL_VALID_OPER 4 && notEqual
#DEFINE LESSTHAN_VALID_OPER 5 && lessThan
#DEFINE LESSOREQUAL_VALID_OPER 6 && lessThanOrEqual
#DEFINE GREATTHAN_VALID_OPER 7 && greaterThan
#DEFINE GREATOREQUAL_VALID_OPER 8 && greaterThanOrEqual
#DEFINE PORTRAIT_PRINT_ORIENTATION 1
#DEFINE LANDSCAPE_PRINT_ORIENTATION 2
#DEFINE PAPERSIZE_LTR 1 && Letter paper (8.5 in. BY 11 in.)
#DEFINE PAPERSIZE_LTR_SMALL 2 && Letter small paper (8.5 in. BY 11 in.)
#DEFINE PAPERSIZE_TABLOID 3 && Tabloid paper (11 in. BY 17 in.)
#DEFINE PAPERSIZE_LEDGER 4 && Ledger paper (17 in. BY 11 in.)
#DEFINE PAPERSIZE_LEGAL 5 && Legal paper (8.5 in. BY 14 in.)
#DEFINE PAPERSIZE_STATEMENT 6 && Statement paper (5.5 in. BY 8.5 in.)
#DEFINE PAPERSIZE_EXECUTIVE 7 && Executive paper (7.25 in. BY 10.5 in.)
#DEFINE PAPERSIZE_A3 8 && A3 paper (297 mm BY 420 mm)
#DEFINE PAPERSIZE_A4 9 && A4 paper (210 mm BY 297 mm)
#DEFINE PAPERSIZE_A4_SMALL 10 && A4 small paper (210 mm BY 297 mm)
#DEFINE PAPERSIZE_A5 11 && A5 paper (148 mm BY 210 mm)
#DEFINE PAPERSIZE_B4 12 && B4 paper (250 mm BY 353 mm)
#DEFINE PAPERSIZE_B5 13 && B5 paper (176 mm BY 250 mm)
#DEFINE PAPERSIZE_FOLIO 14 && Folio paper (8.5 in. BY 13 in.)
#DEFINE PAPERSIZE_QUARTO 15 && Quarto paper (215 mm BY 275 mm)
#DEFINE PAPERSIZE_STD10X14 16 && Standard paper (10 in. BY 14 in.)
#DEFINE PAPERSIZE_STD11X17 17 && Standard paper (11 in. BY 17 in.)
#DEFINE PAPERSIZE_NOTE 18 && NOTE paper (8.5 in. BY 11 in.)
#DEFINE PAPERSIZE_9ENV 19 && #9 envelope (3.875 in. BY 8.875 in.)
#DEFINE PAPERSIZE_10ENV 20 && #10 envelope (4.125 in. BY 9.5 in.)
#DEFINE PAPERSIZE_11ENV 21 && #11 envelope (4.5 in. BY 10.375 in.)
#DEFINE PAPERSIZE_12ENV 22 && #12 envelope (4.75 in. BY 11 in.)
#DEFINE PAPERSIZE_14ENV 23 && #14 envelope (5 in. BY 11.5 in.)
#DEFINE PAPERSIZE_C 24 && C paper (17 in. BY 22 in.)
#DEFINE PAPERSIZE_D 25 && D paper (22 in. BY 34 in.)
#DEFINE PAPERSIZE_E 26 && E paper (34 in. BY 44 in.)
#DEFINE PAPERSIZE_DL_ENV 27 && DL envelope (110 mm BY 220 mm)
#DEFINE PAPERSIZE_C5_ENV 28 && C5 envelope (162 mm BY 229 mm)
#DEFINE PAPERSIZE_C3_ENV 29 && C3 envelope (324 mm BY 458 mm)
#DEFINE PAPERSIZE_C4_ENV 30 && C4 envelope (229 mm BY 324 mm)
#DEFINE PAPERSIZE_C6_ENV 31 && C6 envelope (114 mm BY 162 mm)
#DEFINE PAPERSIZE_C65_ENV 32 && C65 envelope (114 mm BY 229 mm)
#DEFINE PAPERSIZE_B4_ENV 33 && B4 envelope (250 mm BY 353 mm)
#DEFINE PAPERSIZE_B5_ENV 34 && B5 envelope (176 mm BY 250 mm)
#DEFINE PAPERSIZE_B6_ENV 35 && B6 envelope (176 mm BY 125 mm)
#DEFINE PAPERSIZE_ITALY_ENV 36 && Italy envelope (110 mm BY 230 mm)
#DEFINE PAPERSIZE_MONARCH_ENV 37 && Monarch envelope (3.875 in. BY 7.5 in.).
#DEFINE PAPERSIZE_6_3_4_ENV 38 && 6 3/4 envelope (3.625 in. BY 6.5 in.)
#DEFINE PAPERSIZE_US_STD_FANFOLD 39 && US standard fanfold (14.875 in. BY 11 in.)
#DEFINE PAPERSIZE_GERMAN_STD_FANFOLD 40 && German standard fanfold (8.5 in. BY 12 in.)
#DEFINE PAPERSIZE_GERMAN_LGL_FANFOLD 41 && German legal fanfold (8.5 in. BY 13 in.)
#DEFINE PAPERSIZE_ISO_B4 42 && ISO B4 (250 mm BY 353 mm)
#DEFINE PAPERSIZE_JPN_DBL_POSTCARD 43 && JPN DOUBLE postcard (200 mm BY 148 mm)
#DEFINE PAPERSIZE_STD_PAPER9X11 44 && Standard paper (9 in. BY 11 in.)
#DEFINE PAPERSIZE_STD_PAPER10X11 45 && Standard paper (10 in. BY 11 in.)
#DEFINE PAPERSIZE_STD_PAPER15X11 46 && Standard paper (15 in. BY 11 in.)
#DEFINE PAPERSIZE_INVITE_ENV 47 && Invite envelope (220 mm BY 220 mm)
#DEFINE PAPERSIZE_LTR_XTRA_PAPER 50 && Letter extra paper (9.275 in. BY 12 in.)
#DEFINE PAPERSIZE_LEGAL_XTRA_PAPER 51 && Legal extra paper (9.275 in. BY 15 in.)
#DEFINE PAPERSIZE_TABLOID_XTRA_PAPER 52 && Tabloid extra paper (11.69 in. BY 18 in.)
#DEFINE PAPERSIZE_A4_XTRA_PAPER 53 && A4 extra paper (236 mm BY 322 mm)
#DEFINE PAPERSIZE_LTR_TRANSVERSE 54 && Letter transverse paper (8.275 in. BY 11 in.)
#DEFINE PAPERSIZE_A4_TRANSVERSE 55 && A4 transverse paper (210 mm BY 297 mm)
#DEFINE PAPERSIZE_LTR_XTRA_TRANSV 56 && Letter extra transverse paper (9.275 in. BY 12 in.)
#DEFINE PAPERSIZE_SUPERA_A4 57 && SuperA/SuperA/A4 paper (227 mm BY 356 mm)
#DEFINE PAPERSIZE_SUPERB_A3 58 && SuperB/SuperB/A3 paper (305 mm BY 487 mm)
#DEFINE PAPERSIZE_LTR_PLUS 59 && Letter plus paper (8.5 in. BY 12.69 in.)
#DEFINE PAPERSIZE_A4_PLUS 60 && A4 plus paper (210 mm BY 330 mm)
#DEFINE PAPERSIZE_A5_TRANSVERSE 61 && A5 transverse paper (148 mm BY 210 mm)
#DEFINE PAPERSIZE_JIS_B5_TRANSVERS 62 && JIS B5 transverse paper (182 mm BY 257 mm)
#DEFINE PAPERSIZE_A3_EXTRA 63 && A3 extra paper (322 mm BY 445 mm)
#DEFINE PAPERSIZE_A5_EXTRA 64 && A5 extra paper (174 mm BY 235 mm)
#DEFINE PAPERSIZE_ISO_B5_EXTRA 65 && ISO B5 extra paper (201 mm BY 276 mm)
#DEFINE PAPERSIZE_A2 66 && A2 paper (420 mm BY 594 mm)
#DEFINE PAPERSIZE_A3_TRANSVERSE 67 && A3 transverse paper (297 mm BY 420 mm)
#DEFINE PAPERSIZE_A3_EXTRA_TRANSVE 68 && A3 extra transverse paper (322 mm BY 445 mm)
#DEFINE PAPERSIZE_JPN_DOUBLE 69 && JPN DOUBLE Postcard (200 mm x 148 mm)
#DEFINE PAPERSIZE_A6 70 && A6 (105 mm x 148 mm)
#DEFINE PAPERSIZE_JPN_ENV_KAKU1 71 && JPN Envelope Kaku #2
#DEFINE PAPERSIZE_JPN_ENV_KAKU2 72 && JPN Envelope Kaku #3
#DEFINE PAPERSIZE_JPN_ENV_CHOU3 73 && JPN Envelope Chou #3
#DEFINE PAPERSIZE_JPN_ENV_CHOU4 74 && JPN Envelope Chou #4
#DEFINE PAPERSIZE_LTR_ROT 75 && Letter Rotated (11in x 8 1/2 11 IN)
#DEFINE PAPERSIZE_A3_ROT 76 && A3 Rotated (420 mm x 297 mm)
#DEFINE PAPERSIZE_A4_ROT 77 && A4 Rotated (297 mm x 210 mm)
#DEFINE PAPERSIZE_A5_ROT 78 && A5 Rotated (210 mm x 148 mm)
#DEFINE PAPERSIZE_B4_JIS_ROT 79 && B4 (JIS) Rotated (364 mm x 257 mm)
#DEFINE PAPERSIZE_B5_JIS_ROT 80 && B5 (JIS) Rotated (257 mm x 182 mm)
#DEFINE PAPERSIZE_JPN_POSTCARD 81 && JPN Postcard Rotated (148 mm x 100 mm)
#DEFINE PAPERSIZE_DOUBLE_JPN 82 && DOUBLE JPN Postcard Rotated (148 mm x 200 mm)
#DEFINE PAPERSIZE_A6_ROT 83 && A6 Rotated (148 mm x 105 mm)
#DEFINE PAPERSIZE_JPN_ENV_KAKU2_ROT 84 && JPN Envelope Kaku #2 Rotated
#DEFINE PAPERSIZE_JPN_ENV_KAKU3_ROT 85 && JPN Envelope Kaku #3 Rotated
#DEFINE PAPERSIZE_JPN_ENV_CHOU3_ROT 86 && JPN Envelope Chou #3 Rotated
#DEFINE PAPERSIZE_JPN_ENV_CHOU4_ROT 87 && JPN Envelope Chou #4 Rotated
#DEFINE PAPERSIZE_B6_JIS 88 && B6 (JIS) (128 mm x 182 mm)
#DEFINE PAPERSIZE_B6_JIS_ROT 89 && B6 (JIS) Rotated (182 mm x 128 mm)
#DEFINE PAPERSIZE_12X11 90 && (12 IN x 11 IN)
#DEFINE PAPERSIZE_JPN_ENV_YOU4 91 && JPN Envelope You #4
#DEFINE PAPERSIZE_JPN_ENV_YOU4_ROT 92 && JPN Envelope You #4 Rotated
#DEFINE PAPERSIZE_PRC_16K 93 && PRC 16K (146 mm x 215 mm)
#DEFINE PAPERSIZE_PRC_32K 94 && PRC 32K (97 mm x 151 mm)
#DEFINE PAPERSIZE_PRC_32K_BIG 95 && PRC 32K(Big) (97 mm x 151 mm)
#DEFINE PAPERSIZE_PRC_ENV_1 96 && PRC Envelope #1 (102 mm x 165 mm)
#DEFINE PAPERSIZE_PRC_ENV_2 97 && PRC Envelope #2 (102 mm x 176 mm)
#DEFINE PAPERSIZE_PRC_ENV_3 98 && PRC Envelope #3 (125 mm x 176 mm)
#DEFINE PAPERSIZE_PRC_ENV_4 99 && PRC Envelope #4 (110 mm x 208 mm)
#DEFINE PAPERSIZE_PRC_ENV_5 100 && PRC Envelope #5 (110 mm x 220 mm)
#DEFINE PAPERSIZE_PRC_ENV_6 101 && PRC Envelope #6 (120 mm x 230 mm)
#DEFINE PAPERSIZE_PRC_ENV_7 102 && PRC Envelope #7 (160 mm x 230 mm)
#DEFINE PAPERSIZE_PRC_ENV_8 103 && PRC Envelope #8 (120 mm x 309 mm)
#DEFINE PAPERSIZE_PRC_ENV_9 104 && PRC Envelope #9 (229 mm x 324 mm)
#DEFINE PAPERSIZE_PRC_ENV_10 105 && PRC Envelope #10 (324 mm x 458 mm)
#DEFINE PAPERSIZE_PRC_16K_ROT 106 && PRC 16K Rotated
#DEFINE PAPERSIZE_PRC_32K_ROT 107 && PRC 32K Rotated
#DEFINE PAPERSIZE_PRC_32K_BIG_ROT 108 && PRC 32K(Big) Rotated
#DEFINE PAPERSIZE_PRC_ENV_1_ROT 109 && PRC Envelope #1 Rotated (165 mm x 102 mm)
#DEFINE PAPERSIZE_PRC_ENV_2_ROT 110 && PRC Envelope #2 Rotated (176 mm x 102 mm)
#DEFINE PAPERSIZE_PRC_ENV_3_ROT 111 && PRC Envelope #3 Rotated (176 mm x 125 mm)
#DEFINE PAPERSIZE_PRC_ENV_4_ROT 112 && PRC Envelope #4 Rotated (208 mm x 110 mm)
#DEFINE PAPERSIZE_PRC_ENV_5_ROT 113 && PRC Envelope #5 Rotated (220 mm x 110 mm)
#DEFINE PAPERSIZE_PRC_ENV_6_ROT 114 && PRC Envelope #6 Rotated (230 mm x 120 mm)
#DEFINE PAPERSIZE_PRC_ENV_7_ROT 115 && PRC Envelope #7 Rotated (230 mm x 160 mm)
#DEFINE PAPERSIZE_PRC_ENV_8_ROT 116 && PRC Envelope #8 Rotated (309 mm x 120 mm)
#DEFINE PAPERSIZE_PRC_ENV_9_ROT 117 && PRC Envelope #9 Rotated (324 mm x 229 mm)
#DEFINE PAPERSIZE_PRC_ENV_10_ROT 118 && PRC Envelope #10 Rotated (458 mm x 324 mm)
#DEFINE HEADERFOOTER_SECT_HDR_LEFT 1
#DEFINE HEADERFOOTER_SECT_HDR_CENTER 2
#DEFINE HEADERFOOTER_SECT_HDR_RIGHT 3
#DEFINE HEADERFOOTER_SECT_FTR_LEFT 4
#DEFINE HEADERFOOTER_SECT_FTR_CENTER 5
#DEFINE HEADERFOOTER_SECT_FTR_RIGHT 6
#DEFINE HEADERFOOTER_FONT_STYLE_NORMAL 0
#DEFINE HEADERFOOTER_FONT_STYLE_BOLD 1
#DEFINE HEADERFOOTER_FONT_STYLE_ITALIC 2
#DEFINE HEADERFOOTER_FONT_STYLE_BOLDITALIC 3
#DEFINE HEADERFOOTER_FIRST_PAGE 0
#DEFINE HEADERFOOTER_ODD_PAGE 1
#DEFINE HEADERFOOTER_EVEN_PAGE 2
#DEFINE HEADERFOOTER_SAME_PAGE 3
#DEFINE HYPERLINK_TYPE_FILE "F"
#DEFINE HYPERLINK_TYPE_SHEET "S"
#DEFINE DATA_TYPE_NONE "X"
#DEFINE DATA_TYPE_DATE "D"
#DEFINE DATA_TYPE_DATETIME "T"
#DEFINE DATA_TYPE_CHAR "C"
#DEFINE DATA_TYPE_INT "I"
#DEFINE DATA_TYPE_FLOAT "N"
#DEFINE DATA_TYPE_CURRENCY "Y"
#DEFINE DATA_TYPE_GENERAL "G"
#DEFINE DATA_TYPE_FORMULA "F"
#DEFINE DATA_TYPE_TIME "Z"
#DEFINE DATA_TYPE_PERCENT "P"
#DEFINE DATA_TYPE_LOGICAL "L"
#DEFINE DATA_TYPE_VCHAR "V"
#DEFINE DATA_TYPE_TEXT "E"
#DEFINE FIELD_TYPE_DATE "D"
#DEFINE FIELD_TYPE_DATETIME "T"
#DEFINE FIELD_TYPE_CHAR "C"
#DEFINE FIELD_TYPE_INT "I"
#DEFINE FIELD_TYPE_FLOAT "F"
#DEFINE FIELD_TYPE_CURRENCY "Y"
#DEFINE FIELD_TYPE_LOGICAL "L"
#DEFINE FIELD_TYPE_DOUBLE "B"
#DEFINE FIELD_TYPE_MEMO "M"
#DEFINE FIELD_TYPE_NUMERIC "N"
#DEFINE FIELD_TYPE_VCHAR "V"
#DEFINE BORDER_LEFT 1
#DEFINE BORDER_RIGHT 2
#DEFINE BORDER_TOP 4
#DEFINE BORDER_BOTTOM 8
#DEFINE BORDER_DIAGDOWN 16
#DEFINE BORDER_DIAGUP 32
#DEFINE BORDER_STYLE_NONE "none"
#DEFINE BORDER_STYLE_THIN "thin"
#DEFINE BORDER_STYLE_HAIR "hair"
#DEFINE BORDER_STYLE_DOTTED "dotted"
#DEFINE BORDER_STYLE_DASHDOTDOT "dashDotDot"
#DEFINE BORDER_STYLE_DASHDOT "dashDot"
#DEFINE BORDER_STYLE_DASHED "dashed"
#DEFINE BORDER_STYLE_MEDIUMDASHDOTDOT "mediumDashDotDot"
#DEFINE BORDER_STYLE_SLANTDASHDOT "slantDashDot"
#DEFINE BORDER_STYLE_MEDIUMDASHDOT "mediumDashDot"
#DEFINE BORDER_STYLE_MEDIUMDASHED "mediumDashed"
#DEFINE BORDER_STYLE_MEDIUM "medium"
#DEFINE BORDER_STYLE_THICK "thick"
#DEFINE BORDER_STYLE_DOUBLE "double"
#DEFINE FILL_STYLE_NONE "none"
#DEFINE FILL_STYLE_SOLID "solid"
#DEFINE FILL_STYLE_GRAY125 "gray125"
#DEFINE CELL_HORIZ_ALIGN_LEFT "left"
#DEFINE CELL_HORIZ_ALIGN_RIGHT "right"
#DEFINE CELL_HORIZ_ALIGN_CENTER "center"
#DEFINE CELL_HORIZ_ALIGN_DISTRIB "distributed"
#DEFINE CELL_HORIZ_ALIGN_CTR_CONTIN "centerContinuous"
#DEFINE CELL_HORIZ_ALIGN_JUSTIFIED "justify"
#DEFINE CELL_HORIZ_ALIGN_GENERAL "general"
#DEFINE CELL_VERT_ALIGN_TOP "top"
#DEFINE CELL_VERT_ALIGN_BOTTOM "bottom"
#DEFINE CELL_VERT_ALIGN_CENTER "center"
#DEFINE CELL_VERT_ALIGN_DISTRIB "distributed"
#DEFINE CELL_VERT_ALIGN_JUSTIFIED "justify"
#DEFINE UNDERLINE_SINGLE "single"
#DEFINE UNDERLINE_DOUBLE "double"
#DEFINE UNDERLINE_SINGLEACCOUNTING "singleAccounting"
#DEFINE UNDERLINE_DOUBLEACCOUNTING "doubleAccounting"
#DEFINE UNDERLINE_NONE "none"
#DEFINE FONT_VERTICAL_BASELINE "baseline"
#DEFINE FONT_VERTICAL_SUBSCRIPT "subscript"
#DEFINE FONT_VERTICAL_SUPERSCRIPT "superscript"
#DEFINE CELL_FORMAT_LOCALE_CODE "[$-409]"
#DEFINE CELL_FORMAT_INTEGER 1 && 0
#DEFINE CELL_FORMAT_FLOAT 2 && 0.00
#DEFINE CELL_FORMAT_COMMA_INTEGER 3 && #,##0
#DEFINE CELL_FORMAT_COMMA_FLOAT 4 && #,##0.00
#DEFINE CELL_FORMAT_CURRENCY_PAREN 7 && $#,##0.00;($#,##0.00)
#DEFINE CELL_FORMAT_CURRENCY_RED_PAREN 8 && $#,##0.00;[Red]($#,##0.00)
#DEFINE CELL_FORMAT_PERCENT_INTEGER 9 && ###%
#DEFINE CELL_FORMAT_PERCENT_FLOAT 10 && ###.00%
#DEFINE CELL_FORMAT_EXPONENT 11 && 0.00E+00
#DEFINE CELL_FORMAT_FRACTION_1 12 && # ?/?
#DEFINE CELL_FORMAT_FRACTION_2 13 && # ??/??
#DEFINE CELL_FORMAT_DATE_MMDDYY 14 && mm-dd-yy
#DEFINE CELL_FORMAT_DATE_DMMMYY 15 && d-mmm-yy
#DEFINE CELL_FORMAT_DATE_DMMM 16 && d-mmm
#DEFINE CELL_FORMAT_DATE_MMMYY 17 && mmm-yy
#DEFINE CELL_FORMAT_TIME_HMMAMPM 18 && h:mm AM/PM
#DEFINE CELL_FORMAT_TIME_HMMSSAMPM 19 && h:mm:ss AM/PM
#DEFINE CELL_FORMAT_TIME_HMM 20 && h:mm
#DEFINE CELL_FORMAT_TIME_HMMSS 21 && h:mm:ss
#DEFINE CELL_FORMAT_DATETIME_MDYYHMM 22 && m/d/yy h:mm
#DEFINE CELL_FORMAT_DATETIME_DDMMMYYYY_TTAM 29 && [$-409]dd/mmm/yyyy\ h:mm\ AM/PM;@
#DEFINE CELL_FORMAT_DATETIME_DDMMMYYYY_TT24 30 && dd/mmm/yyyy\ h:mm;@
#DEFINE CELL_FORMAT_DATETIME_MMMDDYYYY_TTAM 31 && [$-409]mmm\ d\,\ yyyy\ h:mm\ AM/PM;@
#DEFINE CELL_FORMAT_DATETIME_MMMDDYYYY_TT24 32 && [$-409]mmm\ d\,\ yyyy\ h:mm;@
#DEFINE CELL_FORMAT_DATETIME_MDYY_TTAM 33 && m/d/yy\ h:mm\ AM/PM;@
#DEFINE CELL_FORMAT_DATETIME_MDYY_TT24 34 && m/d/yy\ h:mm;@
#DEFINE CELL_FORMAT_COMMA_INTEGER_PAREN 37 && #,##0;(#,##0)
#DEFINE CELL_FORMAT_COMMA_INTEGER_RED_PAREN 38 && #,##0;[Red](#,##0)
#DEFINE CELL_FORMAT_COMMA_FLOAT_PAREN 39 && #,##0.00;(#,##0.00)
#DEFINE CELL_FORMAT_COMMA_FLOAT_RED_PAREN 40 && #,##0.00;[Red](#,##0.00)
#DEFINE CELL_FORMAT_ACC_CURR_US_PAREN 44 && _("$"* #,##0.00_)
#DEFINE CELL_FORMAT_TIME_MMSS 45 && mm:ss
#DEFINE CELL_FORMAT_TIME_H_MMSS 46 && [h]:mm:ss
#DEFINE CELL_FORMAT_TEXT 49 && Text
#DEFINE CELL_FORMAT_CURRENCY_RED 901 && $#,##0.00;[Red]$#,##0.00
#DEFINE CELL_FORMAT_ACC_CURR_POUNDS 902 && Accounting British Pounds, <20>#,##0.00
#DEFINE CELL_FORMAT_ACC_CURR_EURO 903 && Accounting Euro, <20>#,##0.00
#DEFINE CELL_FORMAT_CURR_POUNDS_RED 904 && British Pounds, <20>#,##0.00 RED
#DEFINE CELL_FORMAT_CURR_EURO_RED 905 && Euro, <20>#,##0.00 RED
#DEFINE RELS_SRC_WORKBOOK "W"
#DEFINE RELS_SRC_SHEET "S"
#DEFINE RELS_SRC_DRAWING "D"
#DEFINE RELS_TYPE_CALCCHAIN "C" && calcChain
#DEFINE RELS_TYPE_DRAWING "D" && drawings
#DEFINE RELS_TYPE_EXTNLINK "E" && externalLink
#DEFINE RELS_TYPE_HYPERLINK "H" && hyperlink
#DEFINE RELS_TYPE_IMAGE "I" && image
#DEFINE RELS_TYPE_SHAREDSTRINGS "S" && sharedStrings
#DEFINE RELS_TYPE_STYLES "Y" && styles
#DEFINE RELS_TYPE_THEME "T" && theme
#DEFINE RELS_TYPE_VBAPROJECT "V" && VBA Macros
#DEFINE RELS_TYPE_WORKSHEET "W" && worksheet
#DEFINE RELS_TYPE_UNKNOWN "U" && unknown relationship type
#DEFINE IMAGE_ANCHOR_TYPE_ABS "A"
#DEFINE IMAGE_ANCHOR_TYPE_ONE "O"
#DEFINE IMAGE_ANCHOR_TYPE_TWO "T"
#DEFINE IMAGE_ANCHOR_MOVE_ABS "absolute"
#DEFINE IMAGE_ANCHOR_MOVE_ONE "oneCell"
#DEFINE IMAGE_ANCHOR_MOVE_TWO "twoCell"

View File

@@ -0,0 +1,634 @@
* Version 5.0
* Support for inline strings
LPARAMETERS lcFileName,cCur,lcFFields,lnStartRows,lcSheet,llEmptyCells
* Parameters
* lcFileName name of the xlsx
* nom de xlsx
* numele xlsx-ului
* cCur name of the table / cursor ; optional ; default ALIAS()
* lcFFields list of fields to be outputed ; optional ; default all fields
* lnStartRows starting row (the first lnStartRows - 1 rows are skipped) ; optional ; default 1 (all rows)
* a partir rang<6E>e (les premiers lnStartRows - 1 lignes sont pass<73>es) ; optionnel ; d<>faut 1 (tous les champs lignes)
* primul rand (primele lnStartRows - 1 randuri ale tabelului din docx sunt omise); optional; implicit 1 (toate randurile)
* lcSheet sheet name | number ; optional ; default ''
* nom | nomber de la feuille ; optionnel ; d<>faut ''
* numele |numarul foii ; optional ; implicit ''
* llEmptyCells when .T., the source contains empty cells (slower import); optional ; default .F.
* lorsque .T., la source contient des cellules vides (d'importation plus lent); optionnel ; d<>faut .F.
* cand este .T., documentul sursa contine celule goale (importul este mai lent); optional; implicit .F.
DECLARE Sleep IN WIN32API INTEGER
DECLARE INTEGER ShellExecute IN shell32.dll INTEGER , STRING , STRING , STRING , STRING , INTEGER
#DEFINE ERRLANG "En"
#IF ERRLANG = "Ro"
#DEFINE ERRMESS0 "Eroare"
#DEFINE ERRMESS1 "Nimic de importat"
#DEFINE ERRMESS2 "Deschideti, va rog, tabelul / cursorul"
#DEFINE ERRMESS3 "Foaie inexistenta"
#DEFINE ERRMESS4 "Eroare la deschiderea"
#ELIF ERRLANG = "Fr"
#DEFINE ERRMESS0 "Erreur"
#DEFINE ERRMESS1 "Rien a ajouter"
#DEFINE ERRMESS2 "S'il vous pla<6C>t ouvrir la table / curseur"
#DEFINE ERRMESS3 "Feuille introuvable"
#DEFINE ERRMESS4 "Erreur d'ouverture"
#ELIF ERRLANG = "Nl" && Koen Piller
#DEFINE ERRMESS0 "Fout"
#DEFINE ERRMESS1 "Niets te importeren"
#DEFINE ERRMESS2 "Open s.v.p. tabel / cursor"
#DEFINE ERRMESS3 "Blad niet gevonden"
#DEFINE ERRMESS4 "Fout bij openen"
#ELSE
#DEFINE ERRMESS0 "Error"
#DEFINE ERRMESS1 "Nothing to append"
#DEFINE ERRMESS2 "Please open table / cursor"
#DEFINE ERRMESS3 "Sheet not found"
#DEFINE ERRMESS4 "Error opening"
#ENDIF
***************************************************************
* If you prefer to extract files with Winrar, uncomment this
***************************************************************
*#DEFINE archiveWinRar .T.
LOCAL lcDir,cCurStr,cCurSheet,lSetTalk,lnFFields,laFFields[1],lnColsNoAll,laFieldsAll[1],lnColsNo,laFields[1],lnCurCol,llMemos,llChars,lnSelect
lnSelect = SELECT(0)
IF PCOUNT() < 1
MESSAGEBOX(ERRMESS1,16,ERRMESS0)
RETURN
ELSE
IF VARTYPE(m.lcFileName) $ "CV"
lcFileName = FORCEEXT(m.lcFileName,"xlsx")
IF !FILE(m.lcFileName)
MESSAGEBOX(ERRMESS1,16,ERRMESS0)
RETURN
ENDIF
ELSE
MESSAGEBOX(ERRMESS1,16,ERRMESS0)
RETURN
ENDIF
ENDIF
IF PCOUNT() >= 2
IF VARTYPE(m.cCur) $ "CV"
IF USED(m.cCur)
SELECT (m.cCur)
ELSE
MESSAGEBOX(ERRMESS2,16,ERRMESS0)
RETURN
ENDIF
ELSE
cCur = ALIAS()
ENDIF
ELSE
cCur = ALIAS()
ENDIF
IF PCOUNT()<3
lcFFields = ""
ELSE
IF VARTYPE(m.lcFFields) <> "C"
lcFFields = ""
ELSE
lnFFields = ALINES(laFFields,m.lcFFields,1+4,",")
ENDIF
ENDIF
IF PCOUNT() < 4
lnStartRows = 1
ELSE
IF VARTYPE(m.lnStartRows) <> "N"
lnStartRows = 1
ENDIF
ENDIF
IF PCOUNT()<5
lcSheet = ""
ELSE
IF NOT (VARTYPE(m.lcSheet) $ "CN")
lcSheet = ""
ENDIF
ENDIF
lSetTalk = SET("Talk")
SET TALK OFF
lnColsNoAll = AFIELDS(m.laFieldsAll,m.cCur)
STORE .F. TO llChars,llMemos
lnColsNo = 0
FOR lnCurCol = 1 TO m.lnColsNoAll
IF m.laFieldsAll[m.lnCurCol,2] $ "NFYBIDTLCVM"
IF !EMPTY(m.lcFFields)
IF ASCAN(m.laFFields,laFieldsAll[m.lnCurCol,1],1,-1,-1,1+2+4)=0
LOOP
ENDIF
ENDIF
lnColsNo = m.lnColsNo + 1
DIMENSION laFields[m.lnColsNo,3]
laFields[m.lnColsNo,1] = laFieldsAll[m.lnCurCol,1]
laFields[m.lnColsNo,2] = laFieldsAll[m.lnCurCol,2]
laFields[m.lnColsNo,3] = m.lnCurCol
IF laFields[m.lnColsNo,2] == "M"
llMemos = .T.
ENDIF
IF laFields[m.lnColsNo,2] $ "MCV"
llChars = .T.
ENDIF
ELSE
LOOP
ENDIF
NEXT
lcDir = extract(m.lcFileName)
lcSheet = get_sheet(ADDBS(m.lcDir) + "workbook.xml",m.lcSheet)
IF EMPTY(m.lcSheet)
MESSAGEBOX(ERRMESS3,16,'Error')
cleanup(m.lcDir)
SET TALK &lSetTalk
SELECT (m.lnSelect)
RETURN m.lcDBF
ENDIF
IF ADIR(laFiles,ADDBS(m.lcDir) + "sharedStrings.xml") = 0
llChars = .F.
ENDIF
IF m.llChars
cCurStr = get_strings(ADDBS(m.lcDir) + "sharedStrings.xml",m.llMemos)
IF EMPTY(m.cCurStr)
cleanup(m.lcDir)
SET TALK &lSetTalk
SELECT (m.lnSelect)
IF USED(m.cCurStr)
USE IN (m.cCurStr)
ENDIF
RETURN .F.
ENDIF
ELSE
cCurStr = ''
ENDIF
cCurSheet = get_cells(ADDBS(m.lcDir) + FORCEEXT(m.lcSheet,"xml"),m.cCur,m.cCurStr,@laFields,m.lnStartRows,m.llEmptyCells)
cleanup(m.lcDir)
SET TALK &lSetTalk
SELECT (m.lnSelect)
IF USED(m.cCurStr)
USE IN (m.cCurStr)
ENDIF
RETURN .T.
*********************
* Extract xml files *
*********************
FUNCTION extract
LPARAMETERS lcFileName
LOCAL lcDir,lcZip,oShell,ofile,loErr as Exception,lcSetSaf,lni,lnFF,llRetry,laDir[1],lnDir,lnDir0, lcFileName
lcDir = ADDBS(SYS(2023)) + SYS(2015)
lcZip = FORCEEXT(m.lcDir,'.zip')
COPY FILE (m.lcFileName) TO (m.lcZip)
MD (m.lcDir)
***************************
* Use Winrar
***************************
#IFDEF archiveWinRar
ShellExecute(0,"open","WinRAR.exe","E " + m.lcZip + " xl\sharedStrings.xml " + m.lcDir,"",1)
IF ADIR(laDir,ADDBS(m.lcDir) + "sharedStrings*.xml") > 0
lnFF = FOPEN(ADDBS(m.lcDir) + "sharedStrings.xml")
DO WHILE m.lnFF < 0
sleep(50)
lnFF = FOPEN(ADDBS(m.lcDir) + "sharedStrings.xml")
ENDDO
ENDIF
FCLOSE(m.lnFF)
ShellExecute(0,"open","WinRAR.exe","E " + m.lcZip + " xl\workbook.xml " + m.lcDir,"",1)
lnFF = FOPEN(ADDBS(m.lcDir) + "workbook.xml")
DO WHILE m.lnFF < 0
sleep(50)
lnFF = FOPEN(ADDBS(m.lcDir) + "workbook.xml")
ENDDO
FCLOSE(m.lnFF)
ShellExecute(0,"open","WinRAR.exe","E " + m.lcZip + " xl\worksheets\sheet*.xml " + m.lcDir,"",1)
lnDir0 = 0
lnDir = ADIR(laDir,ADDBS(m.lcDir ) + "sheet*.xml")
DO WHILE (m.lnDir <> m.lnDir0) OR (m.lnDir = 0)
FOR lni = 1 TO m.lnDir
lnFF = FOPEN(ADDBS(m.lcDir) + m.laDir[m.lni,1])
DO WHILE m.lnFF < 0
sleep(50)
lnFF = FOPEN(ADDBS(m.lcDir) + m.laDir[m.lni,1])
ENDDO
FCLOSE(m.lnFF)
NEXT
lnDir0 = m.lnDir
lnDir = ADIR(laDir,ADDBS(m.lcDir ) + "sheet*.xml")
ENDDO
***************************
* Use Explorer
***************************
#ELSE
oShell = CREATEOBJECT("shell.application")
TRY
FOR lni = 0 TO m.oShell.NameSpace(ADDBS(m.lcZip)+'xl').items.count - 1
ofile = m.oShell.NameSpace(ADDBS(m.lcZip)+'xl').items.item(m.lni)
lcFileName = JUSTFNAME(m.ofile.path)
IF INLIST(LOWER(m.lcFileName),'sharedstrings.xml','workbook.xml','styles.xml')
oShell.NameSpace( m.lcDir).copyhere( m.ofile)
lnFF = FOPEN(ADDBS(m.lcDir) + m.lcFileName)
DO WHILE m.lnFF < 0
sleep(50)
lnFF = FOPEN(ADDBS(m.lcDir) + m.lcFileName)
ENDDO
FCLOSE(m.lnFF)
ENDIF
ENDFOR
FOR lni = 0 TO m.oShell.NameSpace(ADDBS(m.lcZip)+'xl\worksheets').items.count - 1
ofile = m.oShell.NameSpace(ADDBS(m.lcZip)+'xl\worksheets').items.item(m.lni)
IF LOWER(LEFT(m.ofile.name,5)) == 'sheet'
oShell.NameSpace( m.lcDir).copyhere( m.ofile)
lcFileName = JUSTFNAME(m.ofile.path)
lnFF = FOPEN(ADDBS(m.lcDir) + m.lcFileName)
DO WHILE m.lnFF < 0
sleep(50)
lnFF = FOPEN(ADDBS(m.lcDir) + m.lcFileName)
ENDDO
FCLOSE(m.lnFF)
ENDIF
ENDFOR
CATCH TO loErr
ENDTRY
#ENDIF
RETURN lcDir
****************
* Read strings *
****************
FUNCTION get_strings
LPARAMETERS lcStr,llMemos
LOCAL cCurStr,lnF,lnPosSiSeek,lcBuff,lnPosSi,lnPosSi2,lcMemo,lcReturn,lnTextPiece,lnTextPiece2,lcTextPiece,lcVal
STORE SYS(2015) TO lcReturn, cCurStr
IF m.llMemos
CREATE CURSOR (m.cCurStr) (cStr M)
ELSE
CREATE CURSOR (m.cCurStr) (cStr c(254))
ENDIF
lnF = FOPEN(m.lcStr)
IF m.lnF >= 0
lnPosSiSeek = 0
DO WHILE !FEOF(m.lnF)
lcBuff = FREAD(m.lnF,8192)
lnPosSi = AT('<si>',m.lcBuff)
lnPosSiSeek = m.lnPosSiSeek + m.lnPosSi + 3
= FSEEK(m.lnF,m.lnPosSiSeek)
lcBuff = FREAD(m.lnF,8192)
lnPosSi2 = AT('</si>',m.lcBuff)
lcMemo = m.lcBuff && ''
DO WHILE !FEOF(m.lnF) AND m.lnPosSi2 = 0
lcBuff = FREAD(m.lnF,8192)
lnPosSi2 = AT('</si>',m.lcMemo)
lcMemo = m.lcMemo + m.lcBuff
ENDDO
IF FEOF(m.lnF) AND m.lnPosSi2 = 0
lnPosSi2 = AT('</si>',m.lcMemo)
ENDIF
IF m.lnPosSi2 != 0
* lcMemo = m.lcMemo + LEFT(m.lcBuff,m.lnPosSi2 - 1)
lcMemo = LEFT(m.lcMemo,m.lnPosSi2 - 1)
lnPosSiSeek = m.lnPosSiSeek + m.lnPosSi2 + 4
lnPosSi = FSEEK(m.lnF,m.lnPosSiSeek)
lcVal = ""
STORE 1 TO lnTextPiece, lnTextPiece2
lcTextPiece = STREXTRACT(m.lcMemo,'<t','</t>')
DO WHILE !EMPTY(m.lcTextPiece)
lcVal = m.lcVal + STREXTRACT(m.lcTextPiece,[>])
lnTextPiece = m.lnTextPiece + 1
lcTextPiece = STREXTRACT(m.lcMemo,'<t','</t>',m.lnTextPiece)
ENDDO
INSERT INTO (m.cCurStr) (cStr) VALUES (htmspec(m.lcVal))
ELSE
lcMemo = m.lcMemo + m.lcBuff
EXIT
ENDIF
ENDDO
ELSE
lcReturn = ''
MESSAGEBOX(ERRMESS4 + ' sharedStrings.xml',16,'Error')
ENDIF
FCLOSE(m.lnF)
RETURN m.lcReturn
**************
* Read sheet *
**************
FUNCTION get_cells
LPARAMETERS lcStr,cCurSheet,cCurStr,laField,lnStartRows,llEmptyCells
LOCAL cCurSheet,lnField,ldDat01,ldDat02,lcSetDec,lcReturn,lnF,lnPosSiSeek,lcBuff,lnPosSi,lnPosSi2,lcMemo,laFieldGat[1],lni,lcCell,lcVal,lnDat,lnTim,lnCurRow,lnCurRow0,lnStartRows0,lcWholeRow,lcWholeTable
LOCAL lnFirstCol,lnShCol,lnRealI
LOCAL llEmptyVal,lcEmptyval,lala[1]
lcWholeTable = FILETOSTR(m.lcStr)
lnCurRow = 1 &&m.lnStartRows
lnCurRow0 = 1
lnStartRows0 = lnStartRows
**************
lcWholeRow = STREXTRACT(m.lcWholeTable,"<row ","</row>")
IF EMPTY(m.lcWholeRow)
MESSAGEBOX(ERRMESS1,16,ERRMESS0)
RETURN ''
ENDIF
lnField = 1
lcCell = STREXTRACT(m.lcWholeRow,[<c ],[</c>],m.lnField)
IF '"inlineStr' $ m.lcCell
lcEmptyval = STREXTRACT(m.lcCell,[<t],[</t>])
IF LEFT(m.lcEmptyval,1) = ">"
lcEmptyval = EMPTY(STREXTRACT(m.lcCell,[<t>],[</t>]))
ELSE
llEmptyVal = EMPTY(STREXTRACT(m.lcCell,[<t],[</t>]))
ENDIF
ELSE
llEmptyVal = EMPTY(STREXTRACT(m.lcCell,[<v>],[</v>]))
ENDIF
DO WHILE !EMPTY(m.lcWholeRow) AND (lnCurRow < m.lnStartRows0 OR EMPTY(m.lcCell) OR m.llEmptyVal) &&EMPTY(STREXTRACT(m.lcCell,[<v>],[</v>])))
lnCurRow0 = m.lnCurRow0 + 1
IF !EMPTY(m.lcCell) AND !m.llEmptyVal &&EMPTY(STREXTRACT(m.lcCell,[<v>],[</v>]))
lnCurRow = m.lnCurRow + 1
ENDIF
lcWholeRow = STREXTRACT(m.lcWholeTable,"<row ","</row>",m.lnCurRow0)
lcCell = STREXTRACT(m.lcWholeRow,[<c ],[</c>])
IF '"inlineStr' $ m.lcCell
lcEmptyval = STREXTRACT(m.lcCell,[<t],[</t>])
IF LEFT(m.lcEmptyval,1) = ">"
lcEmptyval = EMPTY(STREXTRACT(m.lcCell,[<t>],[</t>]))
ELSE
llEmptyVal = EMPTY(STREXTRACT(m.lcCell,[<t],[</t>]))
ENDIF
ELSE
llEmptyVal = EMPTY(STREXTRACT(m.lcCell,[<v>],[</v>]))
ENDIF
ENDDO
lnStartRows = lnCurRow0
lnField = ALEN(laField,1)
ldDat01 = DATE(1900,3,1) - 61
ldDat02 = DATE(1900,1,1) - 1
lcSetDec = SET("Decimals")
lnFirstCol = 0
SET DECIMALS TO 10
lcReturn = ''
lnF = FOPEN(m.lcStr)
lnCurRow = 0
IF m.lnF >= 0
lnPosSiSeek = 0
DO WHILE !FEOF(m.lnF)
lcBuff = FREAD(m.lnF,8192)
lnPosSi = AT('<row r="',m.lcBuff)
lcMemo = ''
DO WHILE !FEOF(m.lnF) AND m.lnPosSi = 0
lcMemo = m.lcMemo + m.lcBuff
lcBuff = FREAD(m.lnF,8192)
lnPosSi = AT('<row r="',m.lcMemo)
ENDDO
IF m.lnPosSi != 0
lcMemo = m.lcMemo + LEFT(m.lcBuff,m.lnPosSi - 1)
lnPosSiSeek = m.lnPosSiSeek + m.lnPosSi + 7
lnPosSi = FSEEK(m.lnF,m.lnPosSiSeek)
ELSE
EXIT
ENDIF
= FSEEK(m.lnF,m.lnPosSiSeek)
lcBuff = FREAD(m.lnF,8192)
lnPosSi2 = AT('</row>',m.lcBuff)
lcMemo = ''
DO WHILE !FEOF(m.lnF) AND m.lnPosSi2 = 0
lcMemo = m.lcMemo + m.lcBuff
lcBuff = FREAD(m.lnF,8192)
lnPosSi2 = AT('</row>',m.lcMemo)
ENDDO
IF m.lnPosSi2 != 0
lcMemo = m.lcMemo + LEFT(m.lcBuff,m.lnPosSi2 - 1)
lnPosSiSeek = m.lnPosSiSeek + m.lnPosSi2 + 5
lnPosSi = FSEEK(m.lnF,m.lnPosSiSeek)
lnCurRow = m.lnCurRow + 1
IF m.lnStartRows > m.lnCurRow
LOOP
ENDIF
SELECT (m.cCurSheet)
APPEND BLANK
SCATTER MEMO TO laFieldGat
lnRealI = 1
FOR lni = 1 TO lnField
lcCell = STREXTRACT(m.lcMemo,[<c ],[</c>],m.lnRealI)
IF AT([<c ],m.lcCell) > 0
lcCell = LEFT(m.lcCell , AT([<c ],m.lcCell) - 1)
ENDIF
IF m.llEmptyCells
lcShCol = CHRTRAN(STREXTRACT(m.lcCell,'r="','"'),'0123456789','')
IF LEN(m.lcShCol) = 1
lnShCol = ASC(m.lcShCol) - 64
ELSE
IF LEN(m.lcShCol) = 2
lnShCol = ASC(RIGHT(m.lcShCol,1)) - 64 + 26 * (ASC(LEFT(m.lcShCol,1)) - 64)
ELSE && LEN(m.lcShCol) = 3
lnShCol = ASC(RIGHT(m.lcShCol,1)) - 64 + 26 * (ASC(SUBSTR(m.lcShCol,1,1)) - 64) + 676 * (ASC(LEFT(m.lcShCol,1)) - 64)
ENDIF
ENDIF
IF lni < m.lnShCol
lni = m.lnShCol
ENDIF
*!* IF m.lni = 1 AND m.lnCurRow = m.lnStartRows
*!* lnFirstCol = m.lnShCol
*!* ENDIF
IF m.lni > m.lnField
SELECT (m.cCurSheet)
GATHER FROM laFieldGat MEMO
EXIT
ENDIF
ENDIF
IF '"inlineStr' $ m.lcCell
lcVal = STREXTRACT(m.lcCell,[<t])
IF LEFT(m.lcVal,1) = ">"
lcVal = STREXTRACT(m.lcVal,[>],[</t>])
ELSE
lcVal = STREXTRACT(m.lcVal,[">],[</t>])
ENDIF
ELSE
lcVal = STREXTRACT(m.lcCell,[<v>],[</v>])
ENDIF
lnRealI = m.lnRealI + 1
IF EMPTY(m.lcVal)
LOOP
ENDIF
IF laField[m.lni,2] $ "CVM"
IF [t="inlineStr] $ m.lcCell or EMPTY(m.cCurStr)
laFieldGat[m.lni] = m.lcVal
ELSE
SELECT (m.cCurStr)
TRY
IF [t="s"] $ m.lcCell
GO VAL(m.lcVal) + 1 IN (m.cCurStr)
laFieldGat[m.lni] = cStr
ELSE
laFieldGat[m.lni] = m.lcVal
ENDIF
CATCH TO loErr
laFieldGat[m.lni] = m.lcVal
ENDTRY
ENDIF
ELSE
IF laField[m.lni,2] $ "NFBYI"
IF [t="inlineStr] $ m.lcCell or EMPTY(m.cCurStr)
laFieldGat[m.lni] = m.lcVal
ELSE
TRY
IF [t="s"] $ m.lcCell
GO VAL(m.lcVal) + 1 IN (m.cCurStr)
laFieldGat[m.lni] = VAL(cStr)
ELSE
laFieldGat[laField[m.lni,3]] = VAL(m.lcVal)
ENDIF
CATCH TO loErr
laFieldGat[m.lni] = m.lcVal
ENDTRY
ENDIF
ELSE
IF laField[m.lni,2] $ "D"
lnDat = VAL(m.lcVal)
IF [t="inlineStr] $ m.lcCell and ALINES(lala,m.lcVal,0,'-','.',' ','/',':') > 1
laFieldGat[laField[m.lni,3]] = CTOD(m.lcVal)
ELSE
IF m.lnDat >= 61
laFieldGat[laField[m.lni,3]] = m.ldDat01 + m.lnDat
ELSE
laFieldGat[laField[m.lni,3]] = m.ldDat02 + m.lnDat
ENDIF
ENDIF
ELSE
IF laField[m.lni,2] $ "T"
lnTim = VAL(m.lcVal)
IF [t="inlineStr] $ m.lcCell and ALINES(lala,m.lcVal,0,'-','.',' ','/',':') > 1
laFieldGat[laField[m.lni,3]] = CTOT(m.lcVal)
ELSE
lnDat = FLOOR(m.lnTim)
laFieldGat[laField[m.lni,3]] = DTOT(m.ldDat01 + m.lnDat) + INT(86400.0 * (m.lnTim - m.lnDat))
ENDIF
ELSE
IF laField[m.lni,2] $ "L"
laFieldGat[laField[m.lni,3]] = m.lcVal == "1"
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
NEXT
SELECT (m.cCurSheet)
GATHER FROM laFieldGat MEMO
ELSE
lcMemo = m.lcMemo + m.lcBuff
EXIT
ENDIF
ENDDO
lcReturn = m.cCurSheet
ELSE
MESSAGEBOX(ERRMESS4,16,'Error')
ENDIF
FCLOSE(m.lnF)
SET DECIMALS TO &lcSetDec
RETURN m.lcReturn
**********************
* Special characters *
**********************
FUNCTION htmspec
LPARAMETERS cStr
LOCAL lni,lcStrF,lcChar,lnChar
lcStrF = m.cStr
IF AT('&gt;',m.lcStrF)>0
lcStrF = STRTRAN(m.lcStrF,'&gt;','>')
ENDIF
IF AT('&lt;',m.lcStrF)>0
lcStrF = STRTRAN(m.lcStrF,'&lt;','<')
ENDIF
IF AT('&quot;',m.lcStrF)>0
lcStrF = STRTRAN(m.lcStrF,'&quot;','"')
ENDIF
IF AT("&apos;",m.lcStrF)>0
lcStrF = STRTRAN(m.lcStrF,'&apos;',"'")
ENDIF
IF AT([&#],m.lcStrF)>0
FOR lnChar = 0 TO 255
lcChar = [&#]+STR(m.lnChar,3)+[;]
IF AT(m.lcChar,m.lcStrF)>0
lcStrF = STRTRAN(m.lcStrF,m.lcChar,CHR(lnChar))
ENDIF
NEXT
ENDIF
IF AT([&#x],m.lcStrF)>0
FOR lnChar = 0 TO 255
lcChar = [&#x]+RIGHT(TRANSFORM(m.lnChar,"@0"),2)+[;]
IF AT(m.lcChar,m.lcStrF)>0
lcStrF = STRTRAN(m.lcStrF,m.lcChar,CHR(lnChar))
ENDIF
NEXT
ENDIF
IF AT('&amp;',m.lcStrF)>0
lcStrF = STRTRAN(m.lcStrF,'&amp;',CHR(38))
ENDIF
* suggested by Koen Piller
lcStrF = STRCONV(m.lcStrF,11)
RETURN m.lcStrF
ENDFUNC
*****************
* Cleanup
******************
FUNCTION cleanup
LPARAMETERS lcDir
LOCAL lcZip,lcSetSaf
lcZip = FORCEEXT(m.lcDir,'zip')
lcSetSaf = SET("Safety")
SET SAFETY OFF
TRY
ERASE (ADDBS(m.lcDir)+'*.*')
RD (m.lcDir)
CATCH TO m.loErr
ENDTRY
ERASE (m.lcZip)
SET SAFETY &lcSetSaf
RETURN .T.
*****************
* Read workbook *
*****************
FUNCTION get_sheet
LPARAMETERS lcStr,lcSheet
LOCAL lnF,lcRealSheet,lcBuff,lcMemo,lni,lcRealSheet,lcCurSheet
lnF = FOPEN(m.lcStr)
lcRealSheet = ''
IF m.lnF >= 0
lcBuff = FREAD(m.lnf,8192)
lcMemo = STREXTRACT(m.lcBuff,[<sheets>],[</sheets>])
IF VARTYPE(m.lcSheet) == "N"
IF BETWEEN(m.lcSheet,1,OCCURS([name="],m.lcMemo))
lcRealSheet = 'sheet' + LTRIM(STR(m.lcSheet))
ENDIF
ELSE
IF EMPTY(m.lcSheet)
lcRealSheet = 'sheet1'
ELSE
FOR lni = 1 TO OCCURS([name="],m.lcMemo)
lcCurSheet = STREXTRACT(m.lcMemo,[name="],["],m.lni)
IF LOWER(ALLTRIM(m.lcCurSheet)) == LOWER(ALLTRIM(m.lcSheet))
lcRealSheet = 'sheet' + TRANSFORM(m.lni)
EXIT
ENDIF
NEXT
ENDIF
ENDIF
ELSE
MESSAGEBOX(ERRMESS4 + ' workbook.xml',16,'Error')
ENDIF
FCLOSE(m.lnF)
RETURN m.lcRealSheet

View File

@@ -0,0 +1,658 @@
********************************
*!* Simple Sample Usage
********************************
*!* DIMENSION aWrkSht(1), aCols(1)
*!* m.lcXlsFile = GETFILE("Excel:XLS,XLSX,XLSB,XLSM")
*!* IF FILE(m.lcXlsFile)
*!* CLEAR
*!* ?AWorkSheets(@aWrkSht,m.lcXlsFile,.T.)
*!* ?AWorkSheetColumns(@aCols,m.lcXlsFile,"Sheet1")
*!* AppendFromExcel(m.lcXlsFile, "Sheet1", "MyTable", "column1,column2,column3", "Recnum Is Not Null", "field1,field2,field3", "field1 > 14000")
*!* SELECT MyTable
*!* GO TOP IN "MyTable"
*!* BROWSE LAST NOWAIT
*!* ENDIF
*!* CopyToExcel("C:\Test.xlsx", "Sheet1", "MyTable") && try xls, xlsb, and xlsm as well
**********************************
FUNCTION AppendFromExcel(tcXLSFile, tcSheet, tvWorkarea, tcExcelFieldList, tcExcelWhereExpr, tcTableFieldList, tcTableForExpr, tlNoHeaderRow)
**********************************
* PARAMETER Information
* tcXLSFile := a string specifying an excel file (*.xls, *.xlsx, *.xlsm, *.xlsb) on disk
* tcSheet := a string specifying the name of a worksheet within the excel workbook (can also be a range Sheet1$A1:C20 for instance)
* tvWorkarea [optional] := the Alias, Work Area, or File Name of the table you want the worksheet result set appended to (default is currently selected Alias)
* tcExcelFieldList [optional] := a comma delimited list of columns you want from the worksheet (default is '*' - all columns)
* tcExcelWhereExpr [optional] := a valid SQL Where clause to be used when querying the worksheet (default is '1=1')
* tcTableFieldList [optional] := a comma delimited list of fields you want the worksheet result set inserted into (default is '*' - all fields)
* tcTableForExpr [optional] := a valid VFP Where clause to be used when querying the worksheet result set (cursor) (default is '.T.')
* tlNoHeaderRow [optional] := pass .T. if the worksheet does not contain a header row, .F. is the default which specifies that a header row does exist
*
* RETURN Information
* returns numeric, the number of records inserted into tvWorkArea
*
* Provider Information
* the default provider being used in the SQLStringConnect function can be downloaded and installed from:
* http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en
**********************************
LOCAL lnSelect, laErr[1], laTableFields[1], laExcelFields[1], lnFieldCounter, ;
lcSQLAlias, lnResult, lcInsertValues, lcFieldList, lcNvlFieldList, ;
lcFieldType, lcExcelFieldType, lcNvlFieldName, lcTempAlias, loExc, lnReturn, ;
lcHeaderRow, llOpenedtvWorkArea
m.lnSelect = SELECT(0)
m.lnReturn = 0
IF NOT FILE(m.tcXLSFile)
ERROR 1, m.tcXLSFile
ENDIF
IF !USED(m.tvWorkarea) AND TYPE("m.tvWorkArea") = "C" AND FILE(DEFAULTEXT(m.tvWorkarea,"DBF"))
SELECT 0
USE (DEFAULTEXT(m.tvWorkarea,"DBF")) SHARED AGAIN
m.tvWorkarea = ALIAS()
m.llOpenedtvWorkArea = .T.
ELSE
IF !USED(m.tvWorkarea)
m.tvWorkarea = ALIAS()
ENDIF
ENDIF
IF TYPE("m.tvWorkArea") = "N"
m.tvWorkArea = ALIAS(m.tvWorkArea)
ENDIF
m.tcSheet = ALLTRIM(EVL(m.tcSheet,"Sheet1$"))
IF AT("$",m.tcSheet) = 0
m.tcSheet = m.tcSheet + "$"
ENDIF
m.tcExcelFieldList = EVL(m.tcExcelFieldList,"*")
m.tcExcelWhereExpr = EVL(m.tcExcelWhereExpr,"1=1")
m.tcTableFieldList = EVL(m.tcTableFieldList,"*")
m.tcTableForExpr = EVL(m.tcTableForExpr,".T.")
m.lcSQLAlias = SYS(2015)
m.lcTempAlias = SYS(2015)
m.lnSQL = 0
m.lcHeaderRow = IIF(EMPTY(m.tlNoHeaderRow), "Yes", "No")
TRY
SELECT (m.tvWorkarea)
m.lnSQL = SQLSTRINGCONNECT([Provider=Microsoft.ACE.OLEDB.12.0;Data Source="] + m.tcXLSFile + [";Extended Properties="Excel 12.0 Xml;HDR=] + m.lcHeaderRow + [;";])
*!* Alternate using DSN that comes with Office install (MSDASQL = OLEDB wrapper for ODBC)
*!* m.lnSQL = SQLSTRINGCONNECT("Provider=MSDASQL.1;" ;
*!* +"Persist Security Info=False;" ;
*!* +"DSN=Excel Files;" ;
*!* +"DBQ="+FULLPATH(m.tcXLSFile)+";" ;
*!* +"DriverId=790;" ;
*!* +"MaxBufferSize=2048;" ;
*!* +"PageTimeout=5;")
*!* Try a few other drivers that may be on the user's machine
IF m.lnSQL < 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
IF m.lnSQL < 0 AND UPPER(ALLTRIM(JUSTEXT(m.tcXLSFile))) == "XLS" && can we try using the older driver?
IF m.lnSQL < 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
ENDIF
IF m.lnSQL < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
ENDIF
m.lnResult = SQLEXEC(m.lnSQL,[SELECT ] + m.tcExcelFieldList + [ FROM "] + m.tcSheet + [" Where ] + m.tcExcelWhereExpr, m.lcSQLAlias)
IF m.lnResult < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
IF USED(m.lcSQLAlias)
m.lcFieldList = ""
m.lcNvlFieldList = ""
m.lnTotalExcelFields = AFIELDS(m.laExcelFields, m.lcSQLAlias)
SELECT &tcTableFieldList FROM (m.tvWorkarea) WHERE .F. INTO CURSOR (m.lcTempAlias)
FOR m.lnFieldCounter = 1 TO MIN(AFIELDS(m.laTableFields, m.lcTempAlias), m.lnTotalExcelFields)
m.lcFieldList = m.lcFieldList + IIF(!EMPTY(m.lcFieldList),",","")+m.laTableFields[m.lnFieldCounter,1]
m.lcFieldType = CHRTRAN(m.laTableFields[m.lnFieldCounter,2],"NIFYD","BBBBT")
m.lcExcelFieldType = CHRTRAN(m.laExcelFields[m.lnFieldCounter,2],"CVNIFYD","MMBBBBT")
m.lcNvlFieldName = m.laExcelFields[m.lnFieldCounter,1]
IF !m.laTableFields[m.lnFieldCounter,5]
m.lcNvlFieldName = [NVL(]+m.lcNvlFieldName+[,]+;
ICASE(m.lcExcelFieldType="B", "0", ;
m.lcExcelFieldType="M", "''", ;
m.lcExcelFieldType="T", "{//}", ;
m.lcExcelFieldType="L", ".F.", ;
"''")+[)]
ENDIF
IF INLIST(m.lcFieldType, "C", "V")
m.lcNvlFieldName = [CAST(]+m.lcNvlFieldName+[ AS ]+m.lcFieldType+[(] + TRANSFORM(m.laTableFields[m.lnFieldCounter,3]) + [))]
ELSE
m.lcNvlFieldName = [CAST(]+m.lcNvlFieldName+[ AS ]+m.lcFieldType+[)]
ENDIF
m.lcNvlFieldList = m.lcNvlFieldList + IIF(!EMPTY(m.lcNvlFieldList),",","") + m.lcNvlFieldName
ENDFOR
INSERT INTO (m.tvWorkarea) (&lcFieldList) SELECT &lcNvlFieldList FROM (m.lcSQLAlias) WHERE &tcTableForExpr
m.lnReturn = _TALLY
ENDIF
CATCH TO m.loExc
*!* MESSAGEBOX(m.loExc.MESSAGE + " : " + TRANSFORM(m.loExc.LINENO))
FINALLY
IF m.llOpenedtvWorkArea
USE IN SELECT(m.tvWorkArea)
ENDIF
IF m.lnSQL > 0
SQLDISCONNECT(m.lnSQL)
ENDIF
USE IN SELECT(m.lcTempAlias)
USE IN SELECT(m.lcSQLAlias)
SELECT (m.lnSelect)
ENDTRY
RETURN m.lnReturn
ENDFUNC
**********************************
FUNCTION AWorkSheets(taArray, tcXLSFile, tlAllTables)
**********************************
* PARAMETER Information
* taArray := an array sent in by reference to fill with Worksheet/Table information
* tcXLSFile := a string specifying an excel file (*.xls, *.xlsx, *.xlsm, *.xlsb) on disk
* tlAllTables := if .T., array will contain information regarding all tables in workbook; .F. returns only worksheets
*
* RETURN Information
* returns numeric, the number of tables found in the workbook
**********************************
LOCAL lnSQL, laErr[1], lcSQLAlias, lnResult, lnReturn, loExc
m.lnReturn = 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+"DBQ="+FULLPATH(m.tcXLSFile)+";")
*!* Alternate using DSN that comes with Office install (MSDASQL = OLEDB wrapper for ODBC)
*!* m.lnSQL = SQLSTRINGCONNECT("Provider=MSDASQL.1;" ;
*!* +"Persist Security Info=False;" ;
*!* +"DSN=Excel Files;" ;
*!* +"DBQ="+FULLPATH(m.tcXLSFile)+";" ;
*!* +"DriverId=790;" ;
*!* +"MaxBufferSize=2048;" ;
*!* +"PageTimeout=5;")
*!* Try a few other drivers that may be on the user's machine
IF m.lnSQL < 0
IF UPPER(ALLTRIM(JUSTEXT(m.tcXLSFile))) == "XLS" && can we try using the older driver?
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
IF m.lnSQL < 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
ELSE
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
IF m.lnSQL < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
ENDIF
m.lcSQLAlias = SYS(2015)
m.lnResult = SQLTABLES(m.lnSQL,"VIEW,TABLE,SYSTEM TABLE",m.lcSQLAlias)
IF m.lnSQL > 0
SQLDISCONNECT(m.lnSQL)
ENDIF
IF m.lnResult < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
IF USED(m.lcSQLAlias)
TRY
IF tlAllTables
SELECT CAST(ALLTRIM(table_name) AS V(100)), ;
CAST(ALLTRIM(table_type) AS V(12)) ;
FROM (m.lcSQLAlias) ;
INTO ARRAY taArray
ELSE
SELECT CAST(ALLTRIM(table_name) AS V(100)), ;
CAST(ALLTRIM(table_type) AS V(12)) ;
FROM (m.lcSQLAlias) ;
WHERE table_type = "SYSTEM TABLE" ;
INTO ARRAY taArray
ENDIF
m.lnReturn = _TALLY
CATCH TO m.loExc
THROW
FINALLY
*!* USE IN SELECT(m.lcSQLAlias)
ENDTRY
ENDIF
RETURN m.lnReturn
ENDFUNC
**********************************
FUNCTION AWorkSheetColumns(taArray, tcXLSFile, tcSheet)
**********************************
* PARAMETER Information
* taArray := an array sent in by reference to fill with the specified worksheet's column information
* tcXLSFile := a string specifying an excel file (*.xls, *.xlsx, *.xlsm, *.xlsb) on disk
* tcSheet := a string specifying the worksheet or table to use when retrieving column information
*
* RETURN Information
* returns numeric, the number of columns found in the worksheet/table
**********************************
LOCAL lnSQL, laErr[1], lnResult, lnReturn, lcSQLAlias, loExc
m.lnReturn = 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+"DBQ="+FULLPATH(m.tcXLSFile)+";")
*!* Alternate using DSN that comes with Office install (MSDASQL = OLEDB wrapper for ODBC)
*!* m.lnSQL = SQLSTRINGCONNECT("Provider=MSDASQL.1;" ;
*!* +"Persist Security Info=False;" ;
*!* +"DSN=Excel Files;" ;
*!* +"DBQ="+FULLPATH(m.tcXLSFile)+";" ;
*!* +"DriverId=790;" ;
*!* +"MaxBufferSize=2048;" ;
*!* +"PageTimeout=5;")
*!* Try a few other drivers that may be on the user's machine
IF m.lnSQL < 0
IF UPPER(ALLTRIM(JUSTEXT(m.tcXLSFile))) == "XLS" && can we try using the older driver?
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
IF m.lnSQL < 0
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
ELSE
m.lnSQL = SQLSTRINGCONNECT("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" ;
+ "DBQ="+FULLPATH(m.tcXLSFile)+";")
ENDIF
IF m.lnSQL < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
ENDIF
m.lcSQLAlias = SYS(2015)
m.lnResult = SQLEXEC(m.lnSQL,[SELECT * FROM "] + m.tcSheet + [$" Where 1=0], m.lcSQLAlias)
IF m.lnSQL > 0
SQLDISCONNECT(m.lnSQL)
ENDIF
IF m.lnResult < 0
AERROR(m.laErr)
ERROR m.laErr[2]
ENDIF
IF USED(m.lcSQLAlias)
TRY
m.lnReturn = AFIELDS(m.taArray, m.lcSQLAlias)
CATCH TO m.loExc
THROW
FINALLY
USE IN SELECT(m.lcSQLAlias)
ENDTRY
ENDIF
RETURN m.lnReturn
ENDFUNC
***********************************
FUNCTION CopyToExcel(tcXLSFile, tcSheet, tvWorkArea, tcExcelFieldList, tcTableFieldList, tcTableForExpr)
***********************************
* PARAMETER Information
* tcXLSFile := a string specifying an excel file (*.xls, *.xlsx, *.xlsm, *.xlsb) on disk
* tcSheet := a string specifying the name of the worksheet to create within the excel workbook
* tvWorkarea [optional] := the Alias, Work Area, or File Name of the table you want to be copied to the worksheet (default is currently selected Alias)
* tcExcelFieldList [optional] := a comma delimited list of columns you want to create in the worksheet (default is '*' - columns will match table field list)
* tcTableFieldList [optional] := a comma delimited list of fields you want this function to copy from tvWorkArea
* tcTableForExpr [optional] := a valid VFP Where/For clause to be used when querying tvWorkArea for data to be copied to the worksheet
*
* RETURN Information
* returns numeric, the number of records inserted into the worksheet
*
* Provider Information
* the default provider being used in the SQLStringConnect function can be downloaded and installed from:
* http://www.microsoft.com/downloads/details.aspx?FamilyID=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en
**********************************
#DEFINE adOpenStatic 3
#DEFINE adOpenKeyset 1
#DEFINE adLockOptimistic 3
#DEFINE adUseClient 3
#DEFINE adUseServer 2
#DEFINE adCmdText 0x0001
LOCAL loConnection as ADODB.Connection, lcCreateTableCommand, llOpenedtvWorkArea, loExc as Exception, ;
lnReturn, lnResult, lnFieldCounter, lnSQL, loCursorAdapter as CursorAdapter, ;
lcFieldName, lcFieldType, lcSelectFields, lcUpdateNameListFields, lcUpdatableFieldList, ;
loRecordSet as ADODB.Recordset, lcConversionFunc, lcVFPFieldName, laTableFields[1], laErr[1]
m.lnSelect = SELECT(0)
m.lnReturn = 0
m.llOpenedtvWorkArea = .F.
IF !USED(m.tvWorkarea) AND TYPE("m.tvWorkArea") = "C" AND FILE(DEFAULTEXT(m.tvWorkarea,"DBF"))
SELECT 0
USE (DEFAULTEXT(m.tvWorkarea,"DBF")) SHARED AGAIN
m.tvWorkarea = ALIAS()
m.llOpenedtvWorkArea = .T.
ELSE
IF !USED(m.tvWorkarea)
m.tvWorkarea = ALIAS()
ENDIF
ENDIF
IF TYPE("m.tvWorkArea") = "N"
m.tvWorkArea = ALIAS(m.tvWorkArea)
ENDIF
m.tcSheet = ALLTRIM(EVL(m.tcSheet,"Sheet1$"))
IF AT("$",m.tcSheet) = 0
m.tcSheet = m.tcSheet + "$"
ENDIF
m.tcExcelFieldList = EVL(m.tcExcelFieldList,"")
m.tcTableFieldList = EVL(m.tcTableFieldList,"*")
m.tcTableForExpr = EVL(m.tcTableForExpr,".T.")
m.lnSQL = 0
m.lcTempAlias = SYS(2015)
TRY
CreateExcelTemplate(m.tcXLSFile)
IF !FILE(m.tcXLSFile)
m.lnReturn
ENDIF
m.loConnection = CreateObject ( "ADODB.Connection")
*!* This is the only provider/driver that appears to work without showing Select Data Source dialog
*!* or throwing a weird error about the excel Database being readonly.
m.loConnection.ConnectionString = [Provider=Microsoft.ACE.OLEDB.12.0;Data Source="] + m.tcXLSFile + [";Extended Properties="Excel 12.0 Xml;HDR=Yes;";]
m.loConnection.Open()
m.loConnection.Execute("DROP TABLE [Sheet1$]")
SELECT &tcTableFieldList FROM (m.tvWorkarea) WHERE &tcTableForExpr INTO CURSOR (m.lcTempAlias) NOFILTER
GO TOP IN (m.lcTempAlias)
m.lnReturn = RECCOUNT(m.lcTempAlias)
m.lcCreateTableCommand = ""
m.lcSelectFields = ""
m.lcUpdateNameListFields = ""
m.lcUpdatableFieldList = ""
m.lcConversionFunc = ""
FOR m.lnFieldCounter = 1 TO AFIELDS(m.laTableFields, m.lcTempAlias)
m.lcVFPFieldName = m.laTableFields(m.lnFieldCounter, 1)
m.lcFieldName = ALLTRIM(GETWORDNUM(m.tcExcelFieldList, m.lnFieldCounter, ","))
IF EMPTY(m.lcFieldName)
m.lcFieldName = m.laTableFields(m.lnFieldCounter, 1)
ENDIF
m.lcSelectFields = m.lcSelectFields + "[" + m.lcFieldName + "] " + " AS " + m.lcVFPFieldName
m.lcUpdateNameListFields = m.lcUpdateNameListFields + m.lcVFPFieldName + " [" + m.tcSheet + "].[" + m.lcFieldName + "]"
m.lcUpdatableFieldList = m.lcUpdatableFieldList + m.lcVFPFieldName
m.lcCreateTableCommand = m.lcCreateTableCommand + "[" + m.lcFieldName + "] "
m.lcFieldType = m.laTableFields(m.lnFieldCounter, 2)
m.lcCreateTableCommand = m.lcCreateTableCommand + ;
ICASE(m.lcFieldType = 'C', 'Char(' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 3)) + ')', ;
m.lcFieldType = 'Y', 'Currency', ;
m.lcFieldType = 'D', 'Date', ;
m.lcFieldType = 'T', 'DateTime', ;
m.lcFieldType = 'B', 'Double', ;
m.lcFieldType = 'F', 'Double', ;
m.lcFieldType = 'G', 'Binary', ;
m.lcFieldType = 'I', 'Integer', ;
m.lcFieldType = 'L', 'Logical', ;
m.lcFieldType = 'M', 'Text', ;
m.lcFieldType = 'N', 'Numeric(' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 3)) + ',' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 4)) + ')', ;
m.lcFieldType = 'Q', 'Binary', ;
m.lcFieldType = 'V', 'VarChar(' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 3)) + ')', ;
m.lcFieldType = 'W', 'Blob', ;
'Char(' + TRANSFORM(m.laTableFields(m.lnFieldCounter, 3)) + ')')
IF INLIST(m.lcFieldType,"T","D")
m.lcConversionFunc = IIF(!EMPTY(m.lcConversionFunc), ", ", "") + m.lcConversionFunc + m.lcVFPFieldName + " EmptyFieldToNull"
ENDIF
IF m.lnFieldCounter != ALEN(m.laTableFields,1)
m.lcCreateTableCommand = m.lcCreateTableCommand + ','
m.lcSelectFields = m.lcSelectFields + ','
m.lcUpdateNameListFields = m.lcUpdateNameListFields + ','
m.lcUpdatableFieldList = m.lcUpdatableFieldList + ','
ENDIF
ENDFOR
IF !EMPTY(m.lcCreateTableCommand)
IF m.tcSheet != [Sheet1$]
m.tcSheet = STRTRAN(m.tcSheet,"$","")
ENDIF
m.lcCreateTableCommand = "CREATE TABLE [" + m.tcSheet + "](" + m.lcCreateTableCommand + ")"
m.loConnection.Errors.Clear()
m.loConnection.Execute(m.lcCreateTableCommand)
IF m.loConnection.Errors.Count>0
ERROR m.loConnection.Errors(0).Description
ENDIF
m.loRecordSet = CreateObject("ADODB.Recordset")
With m.loRecordSet
.ActiveConnection = m.loConnection
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
ENDWITH
m.loCursorAdapter = CREATEOBJECT("CursorAdapter")
m.loCursorAdapter.Alias = SYS(2015)
m.loCursorAdapter.DataSourceType = "ADO"
m.loCursorAdapter.DataSource = m.loRecordSet
m.loCursorAdapter.SelectCmd = "Select " + m.lcSelectFields + " From [" + m.tcSheet + "]"
IF m.loCursorAdapter.CursorFill(.F.,.T.)
m.loCursorAdapter.Tables = "[" + m.tcSheet + "]"
m.loCursorAdapter.BufferModeOverride = 3 && faster than 5 when dealing with larger record sets
m.loCursorAdapter.UpdateNameList = m.lcUpdateNameListFields
m.loCursorAdapter.UpdatableFieldList = m.lcUpdatableFieldList
IF !EMPTY(m.lcConversionFunc)
m.loCursorAdapter.ConversionFunc = m.lcConversionFunc
ENDIF
INSERT INTO (m.loCursorAdapter.Alias) SELECT * FROM (m.lcTempAlias)
m.lnReturn = TABLEUPDATE(.T.,.T.,m.loCursorAdapter.Alias)
ELSE
AERROR(m.laErr)
ERROR m.laErr(2)
ENDIF
ENDIF
m.loConnection.Close()
CATCH TO m.loExc
m.lnReturn = 0
FINALLY
m.loCursorAdapter = Null
m.loConnection = Null
RELEASE loCursorAdapter, loConnection
IF m.llOpenedtvWorkArea
USE IN SELECT(m.tvWorkarea)
ENDIF
USE IN SELECT(m.lcTempAlias)
SELECT (m.lnSelect)
ENDTRY
RETURN m.lnReturn
ENDFUNC
*******************
FUNCTION EmptyFieldToNull(tdFieldValue)
*******************
RETURN EVL(m.tdFieldValue,NULL)
ENDFUNC
*******************
FUNCTION CreateExcelTemplate(tcExcelFile)
*******************
LOCAL lcExcelFileExtension, lcFileBinary
m.llReturn = .F.
IF FILE(m.tcExcelFile)
m.llReturn = .T.
ELSE
m.lcExcelFileExtension = UPPER(JUSTEXT(m.tcExcelFile))
DO case
CASE m.lcExcelFileExtension = "XLSX"
m.lcFileBinary = 0h504B030414000600080000002100CC7EE6A14E010000080400001300DF015B436F6E74656E745F54797065735D2E786D6C20A2DB0128A00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000AC93CB4EC3301045F748FC83E52D8ADDB2400835ED82C712BA281F60EC4963D52F79DCD2FE3D938422814A455536B1226BEE9D39733D996DBD631BC86863A8F9588C3883A0A3B16159F3D7C55375CB1916158C723140CD77807C36BDBC982C7609905175C09AB7A5A43B2951B7E0158A9820D04D13B357857EF35226A5576A09F27A34BA913A8602A154A5D3E0D3C90B3590AD013657B93C2B4F3E72EB64213518BE63417A9CDD0F859D77CD554ACE6A55A873B909E6876B159BC66A3051AF3D79895EECAA5391BF1A62D939C0B3AD306550065B80E29D1844F7CE0FD0A8B52BEC714B0406E8191C9E36DA274C
m.lcFileBinary = m.lcFileBinary + 0h4195FDF8D8DA84471C8EB33BCEE43DE6D55B8CABFFA6D2D1115ED9B0EFFB5008687BF31C134ADAF5D90D4087DC80A91249422E16BE981DF2A60076B3F76B44D91FE7A7F07B34BEF4FFC440C70CA743D867A5AB3E30B9ECDFF1F4030000FFFF0300504B030414000600080000002100B5553023F50000004C0200000B00CE015F72656C732F2E72656C7320A2CA0128A0000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C92CF4EC3300CC6EF48BC43E4FBEA6E4808A1A5BB4C48BB21541EC024EE1FB58DA32440F7F68403824A63DBD1F6E7CF3F5BDEEEE669541F1C622F4EC3BA2841B133627BD76A78AD9F560FA06222676914C71A8E1C6157DDDE6C5F78A4949B62D7FBA8B28B8B1ABA94FC2362341D4F140BF1EC72A5913051CA6168D19319A865DC94E53D86BF1E502D3CD5C16A08077B07AA3EFA3CF9B2B7344D6F782FE67D62974E8C409E
m.lcFileBinary = m.lcFileBinary + 0h133BCB76E543660BA9CFDBA89A42CB498315F39CD311C9FB2263039E26DA5C4FF4FFB63871224B89D048E0F33CDF8A7340EBEB812E9F68A9F8BDCE3CE2A784E14D64F861C1C50F545F000000FFFF0300504B0304140006000800000021008D87DA70E00000002D0200001A000801786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C7320A2040128A00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC91CB6AC3301045F785FE83987D3D760AA594C8D99442B6C5FD00218F1FC496846692D67F5FE182DD404836D908AE06DD73246D773FE3A04E14B9F74E4391E5A0C8595FF7AED5F0557D3CBD826231AE368377A46122865DF9F8B0FDA4C1483AC45D1F58A516C71A3A91F086C8B6
m.lcFileBinary = m.lcFileBinary + 0hA3D170E603B934697C1C8DA4185B0CC61E4C4BB8C9F3178CFF3BA03CEB54FB5A43DCD7CFA0AA2924F2ED6EDF34BDA5776F8F2339B98040966948175095892D8986BF9C2547C0CBF8CD3DF1929E8556FA1C715E8B6B0EC53D1DBE7D3C704724ABC7B2C5384F16193CFBE4F2170000FFFF0300504B030414000600080000002100A460FAFF52010000270200000F000000786C2F776F726B626F6F6B2E786D6C8C915D6FC2201486EF97EC3F10EE272DA9CE185B93655BE6CD6232A7D7AC9C5A228506A8D57FBF534CE776B72BCE073CE7BC2FCBD5B9D1E404CE2B6B729A4E124AC094562A73C8E9E7F6F5614E890FC248A1AD819C5EC0D355717FB7ECAD3B7E
m.lcFileBinary = m.lcFileBinary + 0h597B2408303EA77508ED82315FD6D0083FB12D18EC54D6352260EA0ECCB70E84F435406834E34932638D50865E090BF71F86AD2A55C2B32DBB064CB8421C6811707D5FABD6D36259290DBBAB2222DAF65D34B8F75953A2850F2F52059039CD30B53DFC29B8AE7DEA941EBAD3644A59F12372E3085203B88D5327515ED0294A2454A2D3618B82C77958E719E7B3E1ED60CE4E41EF6F982125E7BD32D2F639E5199A7D19B31427923EB6F64A861A51D9FC567B0375A8434EE7499A0C74F60B1F2DC531F12426EAFD186CC625636D8D9230760B85815BCB3412C667A5D0250A1C8E78914F1F7954CFC63F2EBE010000FFFF0300504B0304140006000800000021
m.lcFileBinary = m.lcFileBinary + 0h00A083C4AEA3010000640300000D000000786C2F7374796C65732E786D6CA453C16ADC3010BD17F20F42F746BB0B0D6DB19D436121909440B6D0AB6CC95EC16864A4F1B2EED767643BDEDD530EBD584F4F336F9E66E4E2F1EC419C6C4C2E6029B7F71B292C36C138EC4AF9E7B0FFFA5D8A441A8D8680B694A34DF2B1BAFB52241AC1BE1DAD25C112984A7924EA7F2A959AA3F53ADD87DE229FB4217A4DBC8D9D4A7DB4DAA49CE441ED369B07E5B54359156D404AA2090312BB5888AA48FFC44903335BA9AAA20910A2209667231383DADB39E29706574797C35AED1D8C33BDCBC4E46889F30E43CCA4CA259725719203580DECB20126AAA2D74436E29E3762
m.lcFileBinary = m.lcFileBinary + 0hC187B1E7F2C8DD9865A6B84FA2BBA8C7EDEEDB55829A0A56451DA2E1EE5F5F7DA6AA026C4B6C34BAEE98570A3D7FEB40143C03E37417500343F591B100BE4E6301DEF284FEB637DAE756E0E0F79E9E4C2979D6B9091F902FB2C0596FDE64FD6BB559FBBF65C5B9BDD567C52BDB37A6D7F222CFBB94BFF39302B94A887A70400E6F05A7EBB3A6395F5AB0C913205DF3CBCDCD59AB70278C6DF50074580F4B79C12FD6B8C1FF58A35EDD29D02451CA0B7ECE93DA3E4C534EEBEF51BD030000FFFF0300504B030414000600080000002100E9A625B882060000531B000013000000786C2F7468656D652F7468656D65312E786D6CEC594F6FDB3614BF0FD87720
m.lcFileBinary = m.lcFileBinary + 0h746F6D27B61B07758AD8B19BAD4D1BC46E871E6999965853A240D2497D1BDAE38001C3BA619701BBED306C2BD002BB749F265B87AD03FA15F6484AB218CB4BD2061BD6D58744227F7CFFDFE32375F5DA8388A1432224E571DBAB5DAE7A88C43E1FD338687B7786FD4B1B1E920AC763CC784CDADE9C48EFDAD6FBEF5DC59B2A241141B03E969BB8ED854A259B958AF46118CBCB3C2131CC4DB888B082571154C6021F01DD8855D6AAD56625C234F6508C23207B7B32A13E41434DD2DBCA88F718BCC64AEA019F8981264D9C15063B9ED63442CE659709748859DB033E637E34240F948718960A26DA5ED5FCBCCAD6D50ADE4C1731B5626D615DDFFCD275E982
m.lcFileBinary = m.lcFileBinary + 0hF174CDF014C128675AEBD75B577672FA06C0D432AED7EB757BB59C9E0160DF074DAD2C459AF5FE46AD93D12C80ECE332ED6EB551ADBBF802FDF525995B9D4EA7D14A65B1440DC83ED697F01BD5667D7BCDC11B90C53796F0F5CE76B7DB74F00664F1CD257CFF4AAB5977F10614321A4F97D0DAA1FD7E4A3D874C38DB2D856F007CA39AC2172888863CBA348B098FD5AA588BF07D2EFA00D04086158D919A2764827D88E22E8E468262CD006F125C98B143BE5C1AD2BC90F4054D54DBFB30C190110B7AAF9E7FFFEAF953F4EAF993E387CF8E1FFE74FCE8D1F1C31F2D2D67E12E8E83E2C297DF7EF6E7D71FA33F9E7EF3F2F117E57859C4FFFAC327BFFCFC79
m.lcFileBinary = m.lcFileBinary + 0h3910326821D18B2F9FFCF6ECC98BAF3EFDFDBBC725F06D814745F8904644A25BE4081DF0087433867125272371BE15C3105367050E817609E99E0A1DE0AD396665B80E718D775740F128035E9FDD77641D8462A66809E71B61E400F738671D2E4A0D7043F32A5878388B8372E66256C41D607C58C6BB8B63C7B5BD590255330B4AC7F6DD903862EE331C2B1C909828A4E7F8949012EDEE51EAD8758FFA824B3E51E81E451D4C4B4D32A4232790168B7669047E9997E90CAE766CB3771775382BD37A871CBA484808CC4A841F12E698F13A9E291C95911CE288150D7E13ABB04CC8C15CF8455C4F2AF074401847BD3191B26CCD6D01FA169C7E0343BD2A75FB
m.lcFileBinary = m.lcFileBinary + 0h1E9B472E52283A2DA37913735E44EEF06937C45152861DD0382C623F905308518CF6B92A83EF713743F43BF801C72BDD7D9712C7DDA717823B3470445A04889E9909ED4B28D44EFD8D68FC77C59851A8C63606DE15E3B6B70D5B53594AEC9E28C1AB70FFC1C2BB8367F13E81585FDE78DED5DD7775D77BEBEBEEAA5C3E6BB55D1458A8BDBA79B07DB1E992A3954DF28432365073466E4AD3274BD82CC67D18D4EBCC0191E487A62484C7B4B83BB84060B30609AE3EA22A1C8438811EBBE66922814C490712255CC2D9CE0C97D2D678E8D3953D1936F499C1D60389D51E1FDBE1753D9C1D0D723266CB09CCF93363B4AE099C95D9FA959428A8FD3ACC6A5AA8
m.lcFileBinary = m.lcFileBinary + 0h3373AB19D14CA973B8E52A830F975583C1DC9AD08520E85DC0CA4D38A26BD67036C18C8CB5DDED069CB9C578E1225D24433C26A98FB4DECB3EAA192765B1622E0320764A7CA4CF79A758ADC0ADA5C9BE01B7B338A9C8AEBE825DE6BD37F15216C10B2FE9BC3D918E2C2E26278BD151DB6B35D61A1EF271D2F62670AC85C72801AF4BDDF86116C0DD90AF840DFB5393D964F9C29BAD4C3137096A705361EDBEA4B053071221D50E96A10D0D339586008B35272BFF5A03CC7A510AD8487F0D29D6372018FE3529C08EAE6BC964427C5574766144DBCEBEA6A594CF141183707C84466C260E30B85F872AE833A6126E274C45D02F7095A6AD6DA6DCE29C265DF1
m.lcFileBinary = m.lcFileBinary + 0h02CBE0EC38664988D372AB5334CB640B37799CCB60DE0AE2816EA5B21BE5CEAF8A49F90B52A518C6FF3355F47E02D705EB63ED011F6E7205463A5FDB1E172AE450859290FA7D018D83A91D102D701D0BD31054709F6CFE0B72A8FFDB9CB3344C5AC3A94F1DD000090AFB910A0521FB50964CF49D42AC96EE5D96244B0999882A882B132BF6881C1236D435B0A9F7760F8510EAA69AA465C0E04EC69FFB9E66D028D04D4E31DF9C1A92EFBD3607FEE9CEC7263328E5D661D3D064F6CF452CD955ED7AB33CDB7B8B8AE889459B55CFB2029815B682569AF6AF29C239B75A5BB196345E6B64C28117973586C1BC214AE0D207E93FB0FF51E133FB71426FA8437E
m.lcFileBinary = m.lcFileBinary + 0h00B515C1B7064D0CC206A2FA926D3C902E907670048D931DB4C1A44959D3A6AD93B65AB6595F70A79BF33D616C2DD959FC7D4E63E7CD99CBCEC9C58B34766A61C7D6766CA5A9C1B32753148626D941C638C67CD52A7E78E2A3FBE0E81DB8E29F31254D30C1672581A1F51C983C80E4B71CCDD2ADBF000000FFFF0300504B030414000600080000002100075F38D31E010000C701000018000000786C2F776F726B7368656574732F7368656574312E786D6C8C514D6BC3300CBD0FF61F8CEE8BD38D6EA324298352B6C360ECEBEE2472626A5BC156D7EDDFCF496819F4B29B3EDE7BD2938AF5B7B3E20B4334E44B58643908F40DB5C677257CBC6FAFEE4144
m.lcFileBinary = m.lcFileBinary + 0h56BE55963C96F08311D6D5E54571A0B08B3D228BA4E063093DF3B09232363D3A15331AD0A78EA6E014A73474320E01553B919C95D7797E2B9D321E668555F88F06696D1ADC50B377E87916096815A7FD636F860855D19AD41B0D8980BA848705C8AA98C67E1A3CC43FB16055BFA1C586B14DEE418CAE6AA2DD087C4AA57CA4CA33EE7672F512448B5AED2DBFD2E1114DD77312599EA66D14AB441F5487CF2A74C6476151274C9EDD8108337E8A9986A9BA04511333B963D6A783613A4C9EDD80D0447C4CC6B54E2FA87E010000FFFF0300504B030414000600080000002100A6A453EB3E0100005102000011000801646F6350726F70732F636F72652E786D
m.lcFileBinary = m.lcFileBinary + 0h6C20A2040128A00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000007C92516BC3201485DF07FB0FC1F7449342DB4992C236FAB4C260191B7B13BD6D65D188BAA5FDF733499BA65006BE78CFB9DF3D5ECC57075547BF609D6C7481D284A008346F84D4BB02BD57EB788922E79916AC6E3414E8080EADCAFBBB9C1BCA1B0BAFB63160BD0417059276949B02EDBD371463C7F7A0984B82430771DB58C57CB8DA1D368C7FB31DE08C903956E099609EE10E189B91884E48C147A4F9B1750F101C430D0AB477384D527CF17AB0CADD6CE8958953497F34E14DA7B853B6E08338BA0F4E8EC6B66D9376D6C708F953FCB97979EB9F1A4BDDED8A032A73C129B7C07C63CB1C4F2F617135737E1376BC95201E8F41
m.lcFileBinary = m.lcFileBinary + 0hBF5113BC8F3B40404421001DE29E958FD9D373B54665B7C3983CC4E9BC2284F6E7AB1B79D5DF051A0AEA34F87FE2B223924595113A5BD02C9B10CF8021F7F52728FF000000FFFF0300504B03041400060008000000210027388BC4880100001103000010000801646F6350726F70732F6170702E786D6C20A2040128A000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C92C16EDB300C86EF03F60E86EE8D9C601886405651A41D7AD8B00049BBB326D3B150591244D648F6F4A36DA471BA9DA613C99FF8F58994BA3D76BEE821A38BA112CB45290A0836D62E1C2AF1B4FF7AF345144826D4C6C7009538018A5BFDF183DAE6982093032CD82260255AA2B496126D0B9DC105CB819526E6CE10A7F9
m.lcFileBinary = m.lcFileBinary + 0h2063D3380BF7D1BE761048AECAF2B3842341A8A1BE496F8662725CF7F4BFA675B4031F3EEF4F8981B5BA4BC93B6B885FA9BF3B9B23C6868A87A305AFE45C544CB703FB9A1D9D74A9E43C553B6B3C6CD85837C623287929A84730C3D0B6C665D4AAA7750F96622ED0FDE6B1AD44F1CB200C3895E84D762610630D6D5332C63E2165FD33E6176C010895E486A93886F3DE79EC3EE9E5D8C0C175E3603081B0708DB877E4017F345B93E91FC4CB39F1C830F14E38BB816FBA73CE373E996F7AE7BD895D32E1C4C25BF4CD85177C4AFB786F08CEE3BC2EAA5D6B32D4BC81B37E29A8479E64F683C9A635E100F5B9E76F6158FEF3F4C3F572B528F98C3B3FD794BC
m.lcFileBinary = m.lcFileBinary + 0hFC65FD070000FFFF0300504B01022D0014000600080000002100CC7EE6A14E010000080400001300000000000000000000000000000000005B436F6E74656E745F54797065735D2E786D6C504B01022D0014000600080000002100B5553023F50000004C0200000B000000000000000000000000005E0300005F72656C732F2E72656C73504B01022D00140006000800000021008D87DA70E00000002D0200001A000000000000000000000000004A060000786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C73504B01022D0014000600080000002100A460FAFF52010000270200000F000000000000000000000000006A080000786C2F776F
m.lcFileBinary = m.lcFileBinary + 0h726B626F6F6B2E786D6C504B01022D0014000600080000002100A083C4AEA3010000640300000D00000000000000000000000000E9090000786C2F7374796C65732E786D6C504B01022D0014000600080000002100E9A625B882060000531B00001300000000000000000000000000B70B0000786C2F7468656D652F7468656D65312E786D6C504B01022D0014000600080000002100075F38D31E010000C701000018000000000000000000000000006A120000786C2F776F726B7368656574732F7368656574312E786D6C504B01022D0014000600080000002100A6A453EB3E010000510200001100000000000000000000000000BE130000646F635072
m.lcFileBinary = m.lcFileBinary + 0h6F70732F636F72652E786D6C504B01022D001400060008000000210027388BC48801000011030000100000000000000000000000000033160000646F6350726F70732F6170702E786D6C504B050600000000090009003E020000F11800000000
CASE m.lcExcelFileExtension = "XLSB"
m.lcFileBinary = 0h504B030414000600080000002100558086C16D010000020400001300DD015B436F6E74656E745F54797065735D2E786D6C20A2D90128A00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000A453CD4BC33014BF0BFE0F255769B2791091B53BE8042FBAC3C47396BEAE616912F2B2D9FEF7BEB6ACA0EC83E1A5A16D7E9F2F99CD9BDA247B08A89DCDD8944F580256B942DB4DC63E57AFE9234B304A5B48E32C64AC0564F3FCF666B66A3D6042688B19AB62F44F42A0AAA096C89D074B7F4A176A19E9356C84976A2B3720EE279307A19C8D60631A3B0E96CF5EA0943B139345439F07276B6D59F23CECEBA43226BD375AC94846C5DE16BCC6141A058663051039016468792D55700B2BD706688B241691CF3E2860D005244B19E2BBAC894D344644720BC373CAC9EF05C1DFA95257965A41E1D4AEA62CBC27BBEB
m.lcFileBinary = m.lcFileBinary + 0h584E0B7EBBB0EDDDA2E89769E7FA82EA1873047702471A0B60F002D79F047E980927645F2B56DAE321C21185F3159D894E252D83F3286886FF2E1ABA435240917AA28410358C9E4FCC796C0EC5704ADE08DF5C553EE17AD0179E192FC6D6005E33D301718A72AC4DB900D7F776186F873E5296E86F70FE030000FFFF0300504B0304140006000800000021004382E3C5F70000004C0200000B00CE015F72656C732F2E72656C7320A2CA0128A000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C92CF4EC3300CC6EF48BC43E4FBEA6E4808A1B5BB20A4DD102A0FE0256E1BB58DA32440F7F66427A834B61DFDEFF3CF9FBCDDCDD3A8BE38442BAE8275518262A7C558D755F0D1BCAE9E40C544CED0288E2B3872845D7D7FB77DE791521E8ABDF5516515172BE853F2CF8851F73C512CC4B3CB9556C2442987A1434F7AA08E7153968F18FE6A40BD
m.lcFileBinary = m.lcFileBinary + 0hD0547B5341D89B0750CDD1E7CDD7B5A56DADE617D19F13BB746605F29CD819362B1F325B48365FA31A0A1DA70A8CE8B79C8E48DE17191BF03CD1E676A2FFAFC58913194A845A025FE639755C025ADF0E74DDA265C7AF3BF388DF128683C8501CAC3B99838B1FA87F000000FFFF0300504B03041400060008000000210006332055E50000002D0200001A000801786C2F5F72656C732F776F726B626F6F6B2E62696E2E72656C7320A2040128A000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC91C16AC3301044EF85FE83D87BBD760AA594C8B98442AEC1FD00555EDB22B624B4DB36FEFB0A97360DA4F4928B60B468DEEC68BD394EA37AA7C42E780D555182226F43EB7CAFE1A579BE7B04C562
m.lcFileBinary = m.lcFileBinary + 0h7C6BC6E049C34C0C9BFAF666BDA7D1487EC4838BACB28B670D83487C42643BD064B808917C9E74214D46B24C3D46630FA6275C95E503A6DF1E509F79AA5DAB21EDDA7B50CD1C33F97FEFD075CED236D8B789BC5C4020CB3CE6055463524FA2E14B17AFCE035EC6AFAE89975C0B9DE88BC4E5AC8ADCD35F19AA6B66F808E9C003919C72FC5C312E93EABB103CFBE4FA130000FFFF0300504B030414000600080000002100A76734B792000000C00000000F000000786C2F776F726B626F6F6B2E62696E6A66646860346040034C407E05430E0323903681922C60B62983018329C34C461E0DA0B0D35390020686764686798CB21F80AC4C20BE6AC9C0E025CF
m.lcFileBinary = m.lcFileBinary + 0hC0100132050A2A3A1819FA1919E630AA800440BA40C615317832A4301832B001D9C10C190CA9405802E44F606498CB2825FB9A11AC320528FB67E5C74BBE4901F6209D590CB31819196603710B2303000000FFFF0300504B030414000600080000002100F98F44D4E0000000CA0100000D000000786C2F7374796C65732E62696EA4904F4B424114C57FBEB9E8F6B9EB1BB410FF1104EE8C5CA608F60514438522100DFA16ADEAC3E52E15FCB3D255923CCFBC47E2D26860CE9C7BCF993B73EF7BC097590AC85D4E846F9E0690F127444146784B9B470674180AA7C6A7993CE46BDEE3AA1E89DC8D402B8EFE00F95A56EEFF569918B3A491C295CAA58E1F38
m.lcFileBinary = m.lcFileBinary + 0h8FCD8D4D72BD189EB61086B03516BFDAB1AC88D796C62AD14A175ED36B515A6783670DEB291EDCDAF876E6D59DE3C7353DCB6ADF4BED68B00FB418F11AB3BAA2AE863CD6DD4AEC6A2A7A51B5D189EB4EB91E7DE5CA5CB3777C041C000000FFFF0300504B030414000600080000002100E9A625B882060000531B000013000000786C2F7468656D652F7468656D65312E786D6CEC594F6FDB3614BF0FD87720746F6D27B61B07758AD8B19BAD4D1BC46E871E6999965853A240D2497D1BDAE38001C3BA619701BBED306C2BD002BB749F265B87AD03FA15F6484AB218CB4BD2061BD6D58744227F7CFFDFE32375F5DA8388A1432224E571DBAB5DAE7A88C43E
m.lcFileBinary = m.lcFileBinary + 0h1FD338687B7786FD4B1B1E920AC763CC784CDADE9C48EFDAD6FBEF5DC59B2A241141B03E969BB8ED854A259B958AF46118CBCB3C2131CC4DB888B082571154C6021F01DD8855D6AAD56625C234F6508C23207B7B32A13E41434DD2DBCA88F718BCC64AEA019F8981264D9C15063B9ED63442CE659709748859DB033E637E34240F948718960A26DA5ED5FCBCCAD6D50ADE4C1731B5626D615DDFFCD275E982F174CDF014C128675AEBD75B577672FA06C0D432AED7EB757BB59C9E0160DF074DAD2C459AF5FE46AD93D12C80ECE332ED6EB551ADBBF802FDF525995B9D4EA7D14A65B1440DC83ED697F01BD5667D7BCDC11B90C53796F0F5CE76B7DB74F006
m.lcFileBinary = m.lcFileBinary + 0h64F1CD257CFF4AAB5977F10614321A4F97D0DAA1FD7E4A3D874C38DB2D856F007CA39AC2172888863CBA348B098FD5AA588BF07D2EFA00D04086158D919A2764827D88E22E8E468262CD006F125C98B143BE5C1AD2BC90F4054D54DBFB30C190110B7AAF9E7FFFEAF953F4EAF993E387CF8E1FFE74FCE8D1F1C31F2D2D67E12E8E83E2C297DF7EF6E7D71FA33F9E7EF3F2F117E57859C4FFFAC327BFFCFC793910326821D18B2F9FFCF6ECC98BAF3EFDFDBBC725F06D814745F8904644A25BE4081DF0087433867125272371BE15C3105367050E817609E99E0A1DE0AD396665B80E718D775740F128035E9FDD77641D8462A66809E71B61E400F738671D2E
m.lcFileBinary = m.lcFileBinary + 0h4A0D7043F32A5878388B8372E66256C41D607C58C6BB8B63C7B5BD590255330B4AC7F6DD903862EE331C2B1C909828A4E7F8949012EDEE51EAD8758FFA824B3E51E81E451D4C4B4D32A4232790168B7669047E9997E90CAE766CB3771775382BD37A871CBA484808CC4A841F12E698F13A9E291C95911CE288150D7E13ABB04CC8C15CF8455C4F2AF074401847BD3191B26CCD6D01FA169C7E0343BD2A75FB1E9B472E52283A2DA37913735E44EEF06937C45152861DD0382C623F905308518CF6B92A83EF713743F43BF801C72BDD7D9712C7DDA717823B3470445A04889E9909ED4B28D44EFD8D68FC77C59851A8C63606DE15E3B6B70D5B53594AEC9E28
m.lcFileBinary = m.lcFileBinary + 0hC1AB70FFC1C2BB8367F13E81585FDE78DED5DD7775D77BEBEBEEAA5C3E6BB55D1458A8BDBA79B07DB1E992A3954DF28432365073466E4AD3274BD82CC67D18D4EBCC0191E487A62484C7B4B83BB84060B30609AE3EA22A1C8438811EBBE66922814C490712255CC2D9CE0C97D2D678E8D3953D1936F499C1D60389D51E1FDBE1753D9C1D0D723266CB09CCF93363B4AE099C95D9FA959428A8FD3ACC6A5AA83373AB19D14CA973B8E52A830F975583C1DC9AD08520E85DC0CA4D38A26BD67036C18C8CB5DDED069CB9C578E1225D24433C26A98FB4DECB3EAA192765B1622E0320764A7CA4CF79A758ADC0ADA5C9BE01B7B338A9C8AEBE825DE6BD37F15216
m.lcFileBinary = m.lcFileBinary + 0hC10B2FE9BC3D918E2C2E26278BD151DB6B35D61A1EF271D2F62670AC85C72801AF4BDDF86116C0DD90AF840DFB5393D964F9C29BAD4C3137096A705361EDBEA4B053071221D50E96A10D0D339586008B35272BFF5A03CC7A510AD8487F0D29D6372018FE3529C08EAE6BC964427C5574766144DBCEBEA6A594CF141183707C84466C260E30B85F872AE833A6126E274C45D02F7095A6AD6DA6DCE29C265DF102CBE0EC38664988D372AB5334CB640B37799CCB60DE0AE2816EA5B21BE5CEAF8A49F90B52A518C6FF3355F47E02D705EB63ED011F6E7205463A5FDB1E172AE450859290FA7D018D83A91D102D701D0BD31054709F6CFE0B72A8FFDB9CB3344C
m.lcFileBinary = m.lcFileBinary + 0h5AC3A94F1DD000090AFB910A0521FB50964CF49D42AC96EE5D96244B0999882A882B132BF6881C1236D435B0A9F7760F8510EAA69AA465C0E04EC69FFB9E66D028D04D4E31DF9C1A92EFBD3607FEE9CEC7263328E5D661D3D064F6CF452CD955ED7AB33CDB7B8B8AE889459B55CFB2029815B682569AF6AF29C239B75A5BB196345E6B64C28117973586C1BC214AE0D207E93FB0FF51E133FB71426FA8437E00B515C1B7064D0CC206A2FA926D3C902E907670048D931DB4C1A44959D3A6AD93B65AB6595F70A79BF33D616C2DD959FC7D4E63E7CD99CBCEC9C58B34766A61C7D6766CA5A9C1B32753148626D941C638C67CD52A7E78E2A3FBE0E81DB8E29F
m.lcFileBinary = m.lcFileBinary + 0h31254D30C1672581A1F51C983C80E4B71CCDD2ADBF000000FFFF0300504B030414000600080000002100A1512698C10000001C01000023000000786C2F776F726B7368656574732F5F72656C732F7368656574312E62696E2E72656C736CCFC16AC3300C06E0FBA0EF60745F9CF430C68853D861906BE91E40B395C434968D654AF2F6F56DEDD8F197F83FA1FEB48555DD288B8F6CA06B5A50C4363ACFB381EFCBD7EB3B2829C80ED7C864602781D37078E9CFB462A925597C12551516034B29E9436BB10B05942626E2BA99620E586ACCB34E68AF38933EB6ED9BCE8F060C4FA61A9D813CBA0ED4654FF5F21F3B789BA3C4A93436061DA7C9DBFF54BDAD9F
m.lcFileBinary = m.lcFileBinary + 0h9E31EF233BDAAA8579A662E0E777D83535801E7AFDF4D370070000FFFF0300504B030414000600080000002100A273D38D810000001601000018000000786C2F776F726B7368656574732F7368656574312E62696E6A646498CC287E928589C181010CFE430188338551002C8644B432327432CADD61461202EB4C411298C1A882220F946244928631BB1819DA18199E32F3806CE460D001AB99C8C8308991613A8B134415480C9B5E9819301A5D0D887F97994980E10EB3411A183CB387D1103D2FEC61B431185CB687D14D8C0C00000000FFFF0300504B0304140006000800000021001E06781015000000200000001E000000786C2F776F726B73686565
m.lcFileBinary = m.lcFileBinary + 0h74732F62696E617279496E646578312E62696ED29260000205108106A632310011000000FFFF0300504B0304140006000800000021004B7C9F083E0100005102000011000801646F6350726F70732F636F72652E786D6C20A2040128A0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007C925F4BC33014C5DF05BF43C97B9B74835943DB81CA9E1C085614DF4272D7159B3F24D16EDFDEB4DD6A0743C84BEE39F7774F2EC9D707D9463F605DA35581D284A00814D7A2517581DEAA4D9CA1C879A6046BB582021DC1A175797B937343B9B6F062B501EB1B7051202947B929D0DE7B4331767C0F92B92438541077DA4AE6C3D5D6D830FEC56AC00B42565882678279867B606C26223A21059F90E6DBB6
m.lcFileBinary = m.lcFileBinary + 0h0340700C2D4850DEE13449F19FD78395EE6AC3A0CC9CB2F14713DE748A3B670B3E8A93FBE09AC9D8755DD22D8718217F8A3FB6CFAFC353E346F5BBE280CA5C70CA2D30AF6D99E3F9252CAE65CE6FC38E770D888763D0AFD4041FE28E1010510840C7B867E57DF9F8546D50D9EF3026F771BAAA08A1C3F9EC475EF4F781C6823C0DFE9F98F54472572D085D66946433E21930E6BEFC04E52F000000FFFF0300504B0304140006000800000021006F7E771280010000FE02000010000801646F6350726F70732F6170702E786D6C20A2040128A00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C92416BE3301085EF85FD0F46F7464E589625C82AA569E9614B0349B367551EC7228A64345393F4D7
m.lcFileBinary = m.lcFileBinary + 0h776C93C6D9EDA93A8DE63D9E3E8DA46E0E7B9FB590D0C55088E9241719041B4B17B68578593F5CFF16199209A5F13140218E80E246FFB852CB141B48E400338E0858889AA8994B89B686BDC109CB81952AA6BD21DEA6AD8C55E52C2CA27DDB432039CBF35F120E04A184F2BAF90C1443E2BCA5EF8696D1767CB8591F1B06D6EAB669BCB386F896FAC9D914315694DD1F2C7825C7A262BA15D8B7E4E8A87325C75BB5B2C6C31D07EBCA780425CF0DF508A61BDAD2B8845AB5346FC1524C19BA771EDB4C64AF06A1C329446B92338118ABB30D9BBEF60D52D27F63DA610D40A8241B86665F8EBDE3DAFDD4D3DEC0C5A5B10B184058B8445C3BF280CFD5D224FA
m.lcFileBinary = m.lcFileBinary + 0h82783A26EE1906DE0167D5F10D678EF9FA2BF349FF64FF7161872FCD3A2E0CC16976974DB5AA4D8292C77DD2CF0DF5C8634BBE0BB9AB4DD84279F2FC2F742FBD19BEB39ECE2639AFFE814F3D25CF1F577F000000FFFF0300504B01022D0014000600080000002100558086C16D010000020400001300000000000000000000000000000000005B436F6E74656E745F54797065735D2E786D6C504B01022D00140006000800000021004382E3C5F70000004C0200000B000000000000000000000000007B0300005F72656C732F2E72656C73504B01022D001400060008000000210006332055E50000002D0200001A00000000000000000000000000690600
m.lcFileBinary = m.lcFileBinary + 0h00786C2F5F72656C732F776F726B626F6F6B2E62696E2E72656C73504B01022D0014000600080000002100A76734B792000000C00000000F000000000000000000000000008E080000786C2F776F726B626F6F6B2E62696E504B01022D0014000600080000002100F98F44D4E0000000CA0100000D000000000000000000000000004D090000786C2F7374796C65732E62696E504B01022D0014000600080000002100E9A625B882060000531B00001300000000000000000000000000580A0000786C2F7468656D652F7468656D65312E786D6C504B01022D0014000600080000002100A1512698C10000001C01000023000000000000000000000000000B
m.lcFileBinary = m.lcFileBinary + 0h110000786C2F776F726B7368656574732F5F72656C732F7368656574312E62696E2E72656C73504B01022D0014000600080000002100A273D38D810000001601000018000000000000000000000000000D120000786C2F776F726B7368656574732F7368656574312E62696E504B01022D00140006000800000021001E06781015000000200000001E00000000000000000000000000C4120000786C2F776F726B7368656574732F62696E617279496E646578312E62696E504B01022D00140006000800000021004B7C9F083E01000051020000110000000000000000000000000015130000646F6350726F70732F636F72652E786D6C504B01022D001400
m.lcFileBinary = m.lcFileBinary + 0h06000800000021006F7E771280010000FE02000010000000000000000000000000008A150000646F6350726F70732F6170702E786D6C504B0506000000000B000B00DB020000401800000000
CASE m.lcExcelFileExtension = "XLSM"
m.lcFileBinary = 0h504B03041400060008000000210038088E4F60010000F20300001300DB015B436F6E74656E745F54797065735D2E786D6C20A2D70128A00002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000A4934D6EC2301085F7957A87C8DB2A31745155158105A5CB96053D80B127C4C27FF2181A6EDF495290401481D838B2A279DFBC37E3D1A4B126DB4244ED5DC986C58065E0A457DAAD4AF6BDF8C85F59864938258C7750B21D209B8C1F1F468B5D00CCA8DA61C9EA94C21BE7286BB0020B1FC0D19FCA472B125DE38A0721D76205FC793078E1D2BB042EE5A9D560E3D1173510B5826C2E62FA149638BC313C911AF4E7B0203D964DFBC2965D321182D15224EA9C6F9D3AA1E6BEAAB404E5E5C612ABE8C49E5A15FE2F10D3CE00DE8DC2104128AC019235452FBA27BF4325362665B38612E8438F60F0366B7F611654D9D9C7
m.lcFileBinary = m.lcFileBinary + 0h5A07BC40B89CDDE54C7E7C5C2FBD5F5F918AC51C1A0964B9B55E5821A39F39B134A0E8A2DDBEC373E3A639CDA30FC869AA57A08E37EC74D6D086AB40E5812421260D8774CEB169D55A975DD7C8BBCFFDFB76BC0407FDAB32903EC2ED21ECB7A2AD3EE39C772F76FC0B0000FFFF0300504B030414000600080000002100B5553023F50000004C0200000B00CE015F72656C732F2E72656C7320A2CA0128A000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008C92CF4EC3300CC6EF48BC43E4FBEA6E4808A1A5BB4C48BB21541EC024EE1FB58DA32440F7F68403824A63DBD1F6E7CF3F5BDEEEE669541F1C622F4EC3BA2841B133627BD76A78AD9F560FA06222676914C71A8E1C6157DDDE6C5F78A4949B62D7FBA8B28B8B1ABA94FC2362341D4F140BF1EC72A5913051CA6168D19319A865DC94E53D86BF1E502D3CD5C16A08077B07AA3EFA3CF9B2
m.lcFileBinary = m.lcFileBinary + 0hB7344D6F782FE67D62974E8C409E133BCB76E543660BA9CFDBA89A42CB498315F39CD311C9FB2263039E26DA5C4FF4FFB63871224B89D048E0F33CDF8A7340EBEB812E9F68A9F8BDCE3CE2A784E14D64F861C1C50F545F000000FFFF0300504B0304140006000800000021008D87DA70E00000002D0200001A000801786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C7320A2040128A0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000AC91CB6AC3301045F785FE83987D3D760AA594C8D99442B6C5FD00218F1FC496846692D67F5FE182DD404836D908AE06DD73246D773FE3A04E14B9F74E4391E5A0C8595FF7AED5F0557D3CBD826231AE368377A46122865DF9F8B0FDA4C1483A
m.lcFileBinary = m.lcFileBinary + 0hC45D1F58A516C71A3A91F086C8B6A3D170E603B934697C1C8DA4185B0CC61E4C4BB8C9F3178CFF3BA03CEB54FB5A43DCD7CFA0AA2924F2ED6EDF34BDA5776F8F2339B98040966948175095892D8986BF9C2547C0CBF8CD3DF1929E8556FA1C715E8B6B0EC53D1DBE7D3C704724ABC7B2C5384F16193CFBE4F2170000FFFF0300504B030414000600080000002100A460FAFF52010000270200000F000000786C2F776F726B626F6F6B2E786D6C8C915D6FC2201486EF97EC3F10EE272DA9CE185B93655BE6CD6232A7D7AC9C5A228506A8D57FBF534CE776B72BCE073CE7BC2FCBD5B9D1E404CE2B6B729A4E124AC094562A73C8E9E7F6F5614E890FC248A1
m.lcFileBinary = m.lcFileBinary + 0hAD819C5EC0D355717FB7ECAD3B7E597B2408303EA77508ED82315FD6D0083FB12D18EC54D6352260EA0ECCB70E84F435406834E34932638D50865E090BF71F86AD2A55C2B32DBB064CB8421C6811707D5FABD6D36259290DBBAB2222DAF65D34B8F75953A2850F2F52059039CD30B53DFC29B8AE7DEA941EBAD3644A59F12372E3085203B88D5327515ED0294A2454A2D3618B82C77958E719E7B3E1ED60CE4E41EF6F982125E7BD32D2F639E5199A7D19B31427923EB6F64A861A51D9FC567B0375A8434EE7499A0C74F60B1F2DC531F12426EAFD186CC625636D8D9230760B85815BCB3412C667A5D0250A1C8E78914F1F7954CFC63F2EBE010000FFFF03
m.lcFileBinary = m.lcFileBinary + 0h00504B030414000600080000002100A083C4AEA3010000640300000D000000786C2F7374796C65732E786D6CA453C16ADC3010BD17F20F42F746BB0B0D6DB19D436121909440B6D0AB6CC95EC16864A4F1B2EED767643BDEDD530EBD584F4F336F9E66E4E2F1EC419C6C4C2E6029B7F71B292C36C138EC4AF9E7B0FFFA5D8A441A8D8680B694A34DF2B1BAFB52241AC1BE1DAD25C112984A7924EA7F2A959AA3F53ADD87DE229FB4217A4DBC8D9D4A7DB4DAA49CE441ED369B07E5B54359156D404AA2090312BB5888AA48FFC44903335BA9AAA20910A2209667231383DADB39E29706574797C35AED1D8C33BDCBC4E46889F30E43CCA4CA25972571920358
m.lcFileBinary = m.lcFileBinary + 0h0DECB20126AAA2D74436E29E3762C187B1E7F2C8DD9865A6B84FA2BBA8C7EDEEDB55829A0A56451DA2E1EE5F5F7DA6AA026C4B6C34BAEE98570A3D7FEB40143C03E37417500343F591B100BE4E6301DEF284FEB637DAE756E0E0F79E9E4C2979D6B9091F902FB2C0596FDE64FD6BB559FBBF65C5B9BDD567C52BDB37A6D7F222CFBB94BFF39302B94A887A70400E6F05A7EBB3A6395F5AB0C913205DF3CBCDCD59AB70278C6DF50074580F4B79C12FD6B8C1FF58A35EDD29D02451CA0B7ECE93DA3E4C534EEBEF51BD030000FFFF0300504B030414000600080000002100E9A625B882060000531B000013000000786C2F7468656D652F7468656D65312E78
m.lcFileBinary = m.lcFileBinary + 0h6D6CEC594F6FDB3614BF0FD87720746F6D27B61B07758AD8B19BAD4D1BC46E871E6999965853A240D2497D1BDAE38001C3BA619701BBED306C2BD002BB749F265B87AD03FA15F6484AB218CB4BD2061BD6D58744227F7CFFDFE32375F5DA8388A1432224E571DBAB5DAE7A88C43E1FD338687B7786FD4B1B1E920AC763CC784CDADE9C48EFDAD6FBEF5DC59B2A241141B03E969BB8ED854A259B958AF46118CBCB3C2131CC4DB888B082571154C6021F01DD8855D6AAD56625C234F6508C23207B7B32A13E41434DD2DBCA88F718BCC64AEA019F8981264D9C15063B9ED63442CE659709748859DB033E637E34240F948718960A26DA5ED5FCBCCAD6D50ADE
m.lcFileBinary = m.lcFileBinary + 0h4C1731B5626D615DDFFCD275E982F174CDF014C128675AEBD75B577672FA06C0D432AED7EB757BB59C9E0160DF074DAD2C459AF5FE46AD93D12C80ECE332ED6EB551ADBBF802FDF525995B9D4EA7D14A65B1440DC83ED697F01BD5667D7BCDC11B90C53796F0F5CE76B7DB74F00664F1CD257CFF4AAB5977F10614321A4F97D0DAA1FD7E4A3D874C38DB2D856F007CA39AC2172888863CBA348B098FD5AA588BF07D2EFA00D04086158D919A2764827D88E22E8E468262CD006F125C98B143BE5C1AD2BC90F4054D54DBFB30C190110B7AAF9E7FFFEAF953F4EAF993E387CF8E1FFE74FCE8D1F1C31F2D2D67E12E8E83E2C297DF7EF6E7D71FA33F9E7EF3F2
m.lcFileBinary = m.lcFileBinary + 0hF117E57859C4FFFAC327BFFCFC793910326821D18B2F9FFCF6ECC98BAF3EFDFDBBC725F06D814745F8904644A25BE4081DF0087433867125272371BE15C3105367050E817609E99E0A1DE0AD396665B80E718D775740F128035E9FDD77641D8462A66809E71B61E400F738671D2E4A0D7043F32A5878388B8372E66256C41D607C58C6BB8B63C7B5BD590255330B4AC7F6DD903862EE331C2B1C909828A4E7F8949012EDEE51EAD8758FFA824B3E51E81E451D4C4B4D32A4232790168B7669047E9997E90CAE766CB3771775382BD37A871CBA484808CC4A841F12E698F13A9E291C95911CE288150D7E13ABB04CC8C15CF8455C4F2AF074401847BD3191B2
m.lcFileBinary = m.lcFileBinary + 0h6CCD6D01FA169C7E0343BD2A75FB1E9B472E52283A2DA37913735E44EEF06937C45152861DD0382C623F905308518CF6B92A83EF713743F43BF801C72BDD7D9712C7DDA717823B3470445A04889E9909ED4B28D44EFD8D68FC77C59851A8C63606DE15E3B6B70D5B53594AEC9E28C1AB70FFC1C2BB8367F13E81585FDE78DED5DD7775D77BEBEBEEAA5C3E6BB55D1458A8BDBA79B07DB1E992A3954DF28432365073466E4AD3274BD82CC67D18D4EBCC0191E487A62484C7B4B83BB84060B30609AE3EA22A1C8438811EBBE66922814C490712255CC2D9CE0C97D2D678E8D3953D1936F499C1D60389D51E1FDBE1753D9C1D0D723266CB09CCF93363B4AE09
m.lcFileBinary = m.lcFileBinary + 0h9C95D9FA959428A8FD3ACC6A5AA83373AB19D14CA973B8E52A830F975583C1DC9AD08520E85DC0CA4D38A26BD67036C18C8CB5DDED069CB9C578E1225D24433C26A98FB4DECB3EAA192765B1622E0320764A7CA4CF79A758ADC0ADA5C9BE01B7B338A9C8AEBE825DE6BD37F15216C10B2FE9BC3D918E2C2E26278BD151DB6B35D61A1EF271D2F62670AC85C72801AF4BDDF86116C0DD90AF840DFB5393D964F9C29BAD4C3137096A705361EDBEA4B053071221D50E96A10D0D339586008B35272BFF5A03CC7A510AD8487F0D29D6372018FE3529C08EAE6BC964427C5574766144DBCEBEA6A594CF141183707C84466C260E30B85F872AE833A6126E274C45
m.lcFileBinary = m.lcFileBinary + 0hD02F7095A6AD6DA6DCE29C265DF102CBE0EC38664988D372AB5334CB640B37799CCB60DE0AE2816EA5B21BE5CEAF8A49F90B52A518C6FF3355F47E02D705EB63ED011F6E7205463A5FDB1E172AE450859290FA7D018D83A91D102D701D0BD31054709F6CFE0B72A8FFDB9CB3344C5AC3A94F1DD000090AFB910A0521FB50964CF49D42AC96EE5D96244B0999882A882B132BF6881C1236D435B0A9F7760F8510EAA69AA465C0E04EC69FFB9E66D028D04D4E31DF9C1A92EFBD3607FEE9CEC7263328E5D661D3D064F6CF452CD955ED7AB33CDB7B8B8AE889459B55CFB2029815B682569AF6AF29C239B75A5BB196345E6B64C28117973586C1BC214AE0D207
m.lcFileBinary = m.lcFileBinary + 0hE93FB0FF51E133FB71426FA8437E00B515C1B7064D0CC206A2FA926D3C902E907670048D931DB4C1A44959D3A6AD93B65AB6595F70A79BF33D616C2DD959FC7D4E63E7CD99CBCEC9C58B34766A61C7D6766CA5A9C1B32753148626D941C638C67CD52A7E78E2A3FBE0E81DB8E29F31254D30C1672581A1F51C983C80E4B71CCDD2ADBF000000FFFF0300504B030414000600080000002100075F38D31E010000C701000018000000786C2F776F726B7368656574732F7368656574312E786D6C8C514D6BC3300CBD0FF61F8CEE8BD38D6EA324298352B6C360ECEBEE2472626A5BC156D7EDDFCF496819F4B29B3EDE7BD2938AF5B7B3E20B4334E44B586439
m.lcFileBinary = m.lcFileBinary + 0h08F40DB5C677257CBC6FAFEE414456BE55963C96F08311D6D5E54571A0B08B3D228BA4E063093DF3B09232363D3A15331AD0A78EA6E014A73474320E01553B919C95D7797E2B9D321E668555F88F06696D1ADC50B377E87916096815A7FD636F860855D19AD41B0D8980BA848705C8AA98C67E1A3CC43FB16055BFA1C586B14DEE418CAE6AA2DD087C4AA57CA4CA33EE7672F512448B5AED2DBFD2E1114DD77312599EA66D14AB441F5487CF2A74C6476151274C9EDD8108337E8A9986A9BA04511333B963D6A783613A4C9EDD80D0447C4CC6B54E2FA87E010000FFFF0300504B0304140006000800000021000ACFE8CF3F0100005102000011000801646F
m.lcFileBinary = m.lcFileBinary + 0h6350726F70732F636F72652E786D6C20A2040128A0000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000007C92CB6AC3301045F785FE83D1DE969C904785ED405BB26AA0509794EE8434494CAD07925A277F5FD94E5C0742411BCDBD73E66A50B63ACA3AFA01EB2AAD7294260445A0B81695DAE7E8BD5CC74B1439CF9460B55690A31338B42AEEEF326E28D7165EAD36607D052E0A24E52837393A786F28C68E1F40329704870AE24E5BC97CB8DA3D368C7FB13DE00921732CC133C13CC32D303603119D91820F48F36DEB0E2038861A2428EF709AA4F8CFEBC14A77B3A153464E59F993096F3AC71DB305EFC5C17D74D5606C9A2669A65D8C903FC51F9B97B7EEA971A5DA5D7140452638E51698D7B6C8F0
m.lcFileBinary = m.lcFileBinary + 0hF812165733E73761C7BB0AC4E329E8376A8277717B08882804A07DDC8BB29D3E3D976B54B43B8CC9439CCE4B4268773EDB9157FD6DA0BE20CF83FF272E5B2259941342A70B3A9B8D8817409FFBFA1314BF000000FFFF0300504B0304140006000800000021006F7E771280010000FE02000010000801646F6350726F70732F6170702E786D6C20A2040128A000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009C92416BE3301085EF85FD0F46F7464E589625C82AA569E9614B0349B367551EC7228A64345393F4D7776C93C6D9EDA93A8DE63D9E3E8DA46E0E7B9FB590D0C55088E9241719041B4B17B68578593F5CFF16199209A5F13140218E80E246FFB852CB141B48E400338E0858889AA8994B
m.lcFileBinary = m.lcFileBinary + 0h89B686BDC109CB81952AA6BD21DEA6AD8C55E52C2CA27DDB432039CBF35F120E04A184F2BAF90C1443E2BCA5EF8696D1767CB8591F1B06D6EAB669BCB386F896FAC9D914315694DD1F2C7825C7A262BA15D8B7E4E8A87325C75BB5B2C6C31D07EBCA780425CF0DF508A61BDAD2B8845AB5346FC1524C19BA771EDB4C64AF06A1C329446B92338118ABB30D9BBEF60D52D27F63DA610D40A8241B86665F8EBDE3DAFDD4D3DEC0C5A5B10B184058B8445C3BF280CFD5D224FA82783A26EE1906DE0167D5F10D678EF9FA2BF349FF64FF7161872FCD3A2E0CC16976974DB5AA4D8292C77DD2CF0DF5C8634BBE0BB9AB4DD84279F2FC2F742FBD19BEB39ECE2639
m.lcFileBinary = m.lcFileBinary + 0hAFFE814F3D25CF1F577F000000FFFF0300504B01022D001400060008000000210038088E4F60010000F20300001300000000000000000000000000000000005B436F6E74656E745F54797065735D2E786D6C504B01022D0014000600080000002100B5553023F50000004C0200000B000000000000000000000000006C0300005F72656C732F2E72656C73504B01022D00140006000800000021008D87DA70E00000002D0200001A0000000000000000000000000058060000786C2F5F72656C732F776F726B626F6F6B2E786D6C2E72656C73504B01022D0014000600080000002100A460FAFF52010000270200000F000000000000000000000000007808
m.lcFileBinary = m.lcFileBinary + 0h0000786C2F776F726B626F6F6B2E786D6C504B01022D0014000600080000002100A083C4AEA3010000640300000D00000000000000000000000000F7090000786C2F7374796C65732E786D6C504B01022D0014000600080000002100E9A625B882060000531B00001300000000000000000000000000C50B0000786C2F7468656D652F7468656D65312E786D6C504B01022D0014000600080000002100075F38D31E010000C7010000180000000000000000000000000078120000786C2F776F726B7368656574732F7368656574312E786D6C504B01022D00140006000800000021000ACFE8CF3F010000510200001100000000000000000000000000CC13
m.lcFileBinary = m.lcFileBinary + 0h0000646F6350726F70732F636F72652E786D6C504B01022D00140006000800000021006F7E771280010000FE020000100000000000000000000000000042160000646F6350726F70732F6170702E786D6C504B050600000000090009003E020000F81800000000
OTHERWISE && XLS
m.lcFileBinary = 0hD0CF11E0A1B11AE1000000000000000000000000000000003E000300FEFF0900060000000000000000000000010000000100000000000000001000001A00000001000000FEFFFFFF0000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFDFFFFFF1C000000030000000400000005000000060000000700000008000000090000000A0000000B0000000C0000000D0000000E0000000F00000010000000110000001200000013000000140000001500000016000000170000001800000019000000FEFFFFFFFEFFFFFF1D000000FEFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFF52006F006F007400200045006E00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500FFFFFFFFFFFFFFFF020000002008020000000000C00000000000004600000000000000000000000030C843AA2911C9011B000000800200000000000057006F0072006B0062006F006F006B000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200020104000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000002000000892F00
m.lcFileBinary = m.lcFileBinary + 0h00000000000500530075006D006D0061007200790049006E0066006F0072006D006100740069006F006E000000000000000000000000000000000000000000000000000000280002010100000003000000FFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000C800000000000000050044006F00630075006D0065006E007400530075006D006D0061007200790049006E0066006F0072006D006100740069006F006E000000000000000000000038000201FFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000004000000E000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000908100000060500A91FCD07C100010006040000E1000200B004C10002000000E20000005C0070000200002020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202042000200B004610102000000C00100003D01020001009C0002001000190002000000120002000000130002000000AF0102000000BC01020000003D001200F0006900D5394A1F380000000000010058024000020000008D00020000002200020000
m.lcFileBinary = m.lcFileBinary + 0h000E0002000100B70102000000DA000200000031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00DC000000080090010000000200AA0701430061006C00690062007200690031001E00680101003800BC020000000200AA0701430061006D00620072006900610031001E002C0101003800BC020000000200AA0701430061006C00690062007200
m.lcFileBinary = m.lcFileBinary + 0h690031001E00040101003800BC020000000200AA0701430061006C00690062007200690031001E00DC0001003800BC020000000200AA0701430061006C00690062007200690031001E00DC000000110090010000000200AA0701430061006C00690062007200690031001E00DC000000140090010000000200AA0701430061006C00690062007200690031001E00DC0000003C0090010000000200AA0701430061006C00690062007200690031001E00DC0000003E0090010000000200AA0701430061006C00690062007200690031001E00DC0001003F00BC020000000200AA0701430061006C00690062007200690031001E00DC0001003400BC02000000
m.lcFileBinary = m.lcFileBinary + 0h0200AA0701430061006C00690062007200690031001E00DC000000340090010000000200AA0701430061006C00690062007200690031001E00DC0001000900BC020000000200AA0701430061006C00690062007200690031001E00DC0000000A0090010000000200AA0701430061006C00690062007200690031001E00DC000200170090010000000200AA0701430061006C00690062007200690031001E00DC0001000800BC020000000200AA0701430061006C00690062007200690031001E00DC000000090090010000000200AA0701430061006C0069006200720069001E041C000500170000222422232C2323305F293B5C28222422232C2323305C29
m.lcFileBinary = m.lcFileBinary + 0h1E04210006001C0000222422232C2323305F293B5B5265645D5C28222422232C2323305C291E04220007001D0000222422232C2323302E30305F293B5C28222422232C2323302E30305C291E0427000800220000222422232C2323302E30305F293B5B5265645D5C28222422232C2323302E30305C291E0437002A003200005F282224222A20232C2323305F293B5F282224222A205C28232C2323305C293B5F282224222A20222D225F293B5F28405F291E042E0029002900005F282A20232C2323305F293B5F282A205C28232C2323305C293B5F282A20222D225F293B5F28405F291E043F002C003A00005F282224222A20232C2323302E30305F293B5F
m.lcFileBinary = m.lcFileBinary + 0h282224222A205C28232C2323302E30305C293B5F282224222A20222D223F3F5F293B5F28405F291E0436002B003100005F282A20232C2323302E30305F293B5F282A205C28232C2323302E30305C293B5F282A20222D223F3F5F293B5F28405F29E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF20000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E000140000000000F5FF200000000000000000000000C020E0001400000000000100200000000000000000000002C020E000140005000000F5FF200000B400000000000000049F20E000140005
m.lcFileBinary = m.lcFileBinary + 0h000000F5FF200000B40000000000000004AD20E000140005000000F5FF200000B40000000000000004AA20E000140005000000F5FF200000B40000000000000004AE20E000140005000000F5FF200000B400000000000000049B20E000140005000000F5FF200000B40000000000000004AF20E000140005000000F5FF200000B40000000000000004AC20E000140005000000F5FF200000B400000000000000049D20E000140005000000F5FF200000B400000000000000048B20E000140005000000F5FF200000B40000000000000004AE20E000140005000000F5FF200000B40000000000000004AC20E000140005000000F5FF200000B4000000000000
m.lcFileBinary = m.lcFileBinary + 0h0004B320E000140015000000F5FF200000B400000000000000049E20E000140015000000F5FF200000B400000000000000049D20E000140015000000F5FF200000B400000000000000048B20E000140015000000F5FF200000B40000000000000004A420E000140015000000F5FF200000B40000000000000004B120E000140015000000F5FF200000B40000000000000004B420E000140015000000F5FF200000B40000000000000004BE20E000140015000000F5FF200000B400000000000000048A20E000140015000000F5FF200000B40000000000000004B920E000140015000000F5FF200000B40000000000000004A420E000140015000000F5FF20
m.lcFileBinary = m.lcFileBinary + 0h0000B40000000000000004B120E000140015000000F5FF200000B40000000000000004B520E00014000B000000F5FF200000B40000000000000004AD20E00014000F000000F5FF200000941111970B970B00049620E000140011000000F5FF200000946666BF1FBF1F0004B720E000140005002B00F5FF200000F80000000000000000C020E000140005002900F5FF200000F80000000000000000C020E000140005002C00F5FF200000F80000000000000000C020E000140005002A00F5FF200000F80000000000000000C020E000140013000000F5FF200000F40000000000000000C020E00014000A000000F5FF200000B40000000000000004AA20E000
m.lcFileBinary = m.lcFileBinary + 0h140007000000F5FF200000D400500000001F0000C020E000140008000000F5FF200000D400500000000B0000C020E000140009000000F5FF200000D400200000000F0000C020E000140009000000F5FF200000F40000000000000000C020E00014000D000000F5FF200000941111970B970B0004AF20E000140010000000F5FF200000D400600000001A0000C020E00014000C000000F5FF200000B40000000000000004AB20E000140005000000F5FF2000009C1111160B160B00049A20E00014000E000000F5FF200000941111BF1FBF1F00049620E000140005000900F5FF200000F80000000000000000C020E000140006000000F5FF200000F4000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000C020E000140014000000F5FF200000D4006100003E1F0000C020E000140012000000F5FF200000F40000000000000000C0207C0814007C080000000000000000000000003E00DED9EE787D082D007D080000000000000000000000000000000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000100000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000200000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000300000002000D00140003
m.lcFileBinary = m.lcFileBinary + 0h0000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000400000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000500000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000600000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000700000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000800000002000D001400030000000100000030305C
m.lcFileBinary = m.lcFileBinary + 0h293B5F282A0E000500027D082D007D080000000000000000000000000900000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000A00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000B00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000C00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000D00000002000D001400030000000100000030305C293B5F282A0E00050002
m.lcFileBinary = m.lcFileBinary + 0h7D082D007D080000000000000000000000000E00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000000F00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000002B00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000002C00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000002D00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D0800000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000002E00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000003A00000002000D001400030000000100000030305C293B5F282A0E000500027D082D007D080000000000000000000000003B00000002000D001400030000000300000030305C293B5F282A0E000500017D0841007D080000000000000000000000003100000003000D001400030000000300000030305C293B5F282A0E000500020800140003000000040000003B5F28405F2920207D0841007D080000000000000000000000003200000003000D001400030000000300000030305C293B5F282A0E00050002
m.lcFileBinary = m.lcFileBinary + 0h080014000300FF3F040000003B5F28405F2920207D0841007D080000000000000000000000003300000003000D001400030000000300000030305C293B5F282A0E000500020800140003003233040000003B5F28405F2920207D082D007D080000000000000000000000003400000002000D001400030000000300000030305C293B5F282A0E000500027D0841007D080000000000000000000000003000000003000D00140002000000006100FF30305C293B5F282A0E000500020400140002000000C6EFCEFF3B5F28405F2920207D0841007D080000000000000000000000002800000003000D001400020000009C0006FF30305C293B5F282A0E000500
m.lcFileBinary = m.lcFileBinary + 0h020400140002000000FFC7CEFF3B5F28405F2920207D0841007D080000000000000000000000003700000003000D001400020000009C6500FF30305C293B5F282A0E000500020400140002000000FFEB9CFF3B5F28405F2920207D0891007D080000000000000000000000003500000007000D001400020000003F3F76FF30305C293B5F282A0E000500020400140002000000FFCC99FF3B5F28405F29202007001400020000007F7F7FFF202020202020202008001400020000007F7F7FFF202020202020202009001400020000007F7F7FFF00000000000000000A001400020000007F7F7FFF00000000000000007D0891007D0800000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h00003900000007000D001400020000003F3F3FFF30305C293B5F282A0E000500020400140002000000F2F2F2FF3B5F28405F29202007001400020000003F3F3FFF202020202020202008001400020000003F3F3FFF202020202020202009001400020000003F3F3FFF00000000000000000A001400020000003F3F3FFF00000000000000007D0891007D080000000000000000000000002900000007000D00140002000000FA7D00FF30305C293B5F282A0E000500020400140002000000F2F2F2FF3B5F28405F29202007001400020000007F7F7FFF202020202020202008001400020000007F7F7FFF202020202020202009001400020000007F7F7FFF00
m.lcFileBinary = m.lcFileBinary + 0h000000000000000A001400020000007F7F7FFF00000000000000007D0841007D080000000000000000000000003600000003000D00140002000000FA7D00FF30305C293B5F282A0E000500020800140002000000FF8001FF3B5F28405F2920207D0891007D080000000000000000000000002A00000007000D001400030000000000000030305C293B5F282A0E000500020400140002000000A5A5A5FF3B5F28405F29202007001400020000003F3F3FFF202020202020202008001400020000003F3F3FFF202020202020202009001400020000003F3F3FFF00000000000000000A001400020000003F3F3FFF00000000000000007D082D007D0800000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000003D00000002000D00140002000000FF0000FF30305C293B5F282A0E000500027D0891007D080000000000000000000000003800000007000D001400030000000100000030305C293B5F282A0E000500020400140002000000FFFFCCFF3B5F28405F2920200700140002000000B2B2B2FF20202020202020200800140002000000B2B2B2FF20202020202020200900140002000000B2B2B2FF00000000000000000A00140002000000B2B2B2FF00000000000000007D082D007D080000000000000000000000002F00000002000D001400020000007F7F7FFF30305C293B5F282A0E000500027D0855007D08000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h3C00000004000D001400030000000100000030305C293B5F282A0E000500020700140003000000040000003B5F28405F29202008001400030000000400000020202020202020207D0841007D080000000000000000000000002200000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000040000003B5F28405F2920207D0841007D080000000000000000000000001000000003000D001400030000000100000030305C293B5F282A0E000500020400140003006566040000003B5F28405F2920207D0841007D080000000000000000000000001600000003000D001400030000000100000030305C293B5F282A0E00
m.lcFileBinary = m.lcFileBinary + 0h050002040014000300CC4C040000003B5F28405F2920207D0841007D080000000000000000000000001C00000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233040000003B5F28405F2920207D0841007D080000000000000000000000002300000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000050000003B5F28405F2920207D0841007D080000000000000000000000001100000003000D001400030000000100000030305C293B5F282A0E000500020400140003006566050000003B5F28405F2920207D0841007D080000000000000000000000001700000003000D
m.lcFileBinary = m.lcFileBinary + 0h001400030000000100000030305C293B5F282A0E00050002040014000300CC4C050000003B5F28405F2920207D0841007D080000000000000000000000001D00000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233050000003B5F28405F2920207D0841007D080000000000000000000000002400000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000060000003B5F28405F2920207D0841007D080000000000000000000000001200000003000D001400030000000100000030305C293B5F282A0E000500020400140003006566060000003B5F28405F2920207D084100
m.lcFileBinary = m.lcFileBinary + 0h7D080000000000000000000000001800000003000D001400030000000100000030305C293B5F282A0E00050002040014000300CC4C060000003B5F28405F2920207D0841007D080000000000000000000000001E00000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233060000003B5F28405F2920207D0841007D080000000000000000000000002500000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000070000003B5F28405F2920207D0841007D080000000000000000000000001300000003000D001400030000000100000030305C293B5F282A0E00050002040014
m.lcFileBinary = m.lcFileBinary + 0h0003006566070000003B5F28405F2920207D0841007D080000000000000000000000001900000003000D001400030000000100000030305C293B5F282A0E00050002040014000300CC4C070000003B5F28405F2920207D0841007D080000000000000000000000001F00000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233070000003B5F28405F2920207D0841007D080000000000000000000000002600000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000080000003B5F28405F2920207D0841007D080000000000000000000000001400000003000D001400030000
m.lcFileBinary = m.lcFileBinary + 0h000100000030305C293B5F282A0E000500020400140003006566080000003B5F28405F2920207D0841007D080000000000000000000000001A00000003000D001400030000000100000030305C293B5F282A0E00050002040014000300CC4C080000003B5F28405F2920207D0841007D080000000000000000000000002000000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233080000003B5F28405F2920207D0841007D080000000000000000000000002700000003000D001400030000000000000030305C293B5F282A0E000500020400140003000000090000003B5F28405F2920207D0841007D0800000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000000001500000003000D001400030000000100000030305C293B5F282A0E000500020400140003006566090000003B5F28405F2920207D0841007D080000000000000000000000001B00000003000D001400030000000100000030305C293B5F282A0E00050002040014000300CC4C090000003B5F28405F2920207D0841007D080000000000000000000000002100000003000D001400030000000000000030305C293B5F282A0E000500020400140003003233090000003B5F28405F2920209302120010000D0000323025202D20416363656E743192084D0092080000000000000000000001041EFF0D0032003000250020002D0020004100
m.lcFileBinary = m.lcFileBinary + 0h6300630065006E00740031000000030001000C0007046566DBE5F1FF05000C0007010000000000FF25000500029302120011000D0000323025202D20416363656E743292084D00920800000000000000000000010422FF0D0032003000250020002D00200041006300630065006E00740032000000030001000C0007056566F2DDDCFF05000C0007010000000000FF25000500029302120012000D0000323025202D20416363656E743392084D00920800000000000000000000010426FF0D0032003000250020002D00200041006300630065006E00740033000000030001000C0007066566EAF1DDFF05000C0007010000000000FF250005000293021200
m.lcFileBinary = m.lcFileBinary + 0h13000D0000323025202D20416363656E743492084D0092080000000000000000000001042AFF0D0032003000250020002D00200041006300630065006E00740034000000030001000C0007076566E5E0ECFF05000C0007010000000000FF25000500029302120014000D0000323025202D20416363656E743592084D0092080000000000000000000001042EFF0D0032003000250020002D00200041006300630065006E00740035000000030001000C0007086566DBEEF3FF05000C0007010000000000FF25000500029302120015000D0000323025202D20416363656E743692084D00920800000000000000000000010432FF0D0032003000250020002D
m.lcFileBinary = m.lcFileBinary + 0h00200041006300630065006E00740036000000030001000C0007096566FDE9D9FF05000C0007010000000000FF25000500029302120016000D0000343025202D20416363656E743192084D0092080000000000000000000001041FFF0D0034003000250020002D00200041006300630065006E00740031000000030001000C000704CC4CB8CCE4FF05000C0007010000000000FF25000500029302120017000D0000343025202D20416363656E743292084D00920800000000000000000000010423FF0D0034003000250020002D00200041006300630065006E00740032000000030001000C000705CC4CE6B9B8FF05000C0007010000000000FF25000500
m.lcFileBinary = m.lcFileBinary + 0h029302120018000D0000343025202D20416363656E743392084D00920800000000000000000000010427FF0D0034003000250020002D00200041006300630065006E00740033000000030001000C000706CC4CD7E4BCFF05000C0007010000000000FF25000500029302120019000D0000343025202D20416363656E743492084D0092080000000000000000000001042BFF0D0034003000250020002D00200041006300630065006E00740034000000030001000C000707CC4CCCC0DAFF05000C0007010000000000FF2500050002930212001A000D0000343025202D20416363656E743592084D0092080000000000000000000001042FFF0D0034003000
m.lcFileBinary = m.lcFileBinary + 0h250020002D00200041006300630065006E00740035000000030001000C000708CC4CB6DDE8FF05000C0007010000000000FF2500050002930212001B000D0000343025202D20416363656E743692084D00920800000000000000000000010433FF0D0034003000250020002D00200041006300630065006E00740036000000030001000C000709CC4CFCD5B4FF05000C0007010000000000FF2500050002930212001C000D0000363025202D20416363656E743192084D00920800000000000000000000010420FF0D0036003000250020002D00200041006300630065006E00740031000000030001000C000704323395B3D7FF05000C0007000000FFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFF2500050002930212001D000D0000363025202D20416363656E743292084D00920800000000000000000000010424FF0D0036003000250020002D00200041006300630065006E00740032000000030001000C0007053233D99795FF05000C0007000000FFFFFFFF2500050002930212001E000D0000363025202D20416363656E743392084D00920800000000000000000000010428FF0D0036003000250020002D00200041006300630065006E00740033000000030001000C0007063233C2D69AFF05000C0007000000FFFFFFFF2500050002930212001F000D0000363025202D20416363656E743492084D0092080000000000000000000001042CFF0D
m.lcFileBinary = m.lcFileBinary + 0h0036003000250020002D00200041006300630065006E00740034000000030001000C0007073233B2A1C7FF05000C0007000000FFFFFFFF25000500029302120020000D0000363025202D20416363656E743592084D00920800000000000000000000010430FF0D0036003000250020002D00200041006300630065006E00740035000000030001000C000708323393CDDDFF05000C0007000000FFFFFFFF25000500029302120021000D0000363025202D20416363656E743692084D00920800000000000000000000010434FF0D0036003000250020002D00200041006300630065006E00740036000000030001000C0007093233FAC090FF05000C000700
m.lcFileBinary = m.lcFileBinary + 0h0000FFFFFFFF250005000293020C002200070000416363656E74319208410092080000000000000000000001041DFF070041006300630065006E00740031000000030001000C00070400004F81BDFF05000C0007000000FFFFFFFF250005000293020C002300070000416363656E743292084100920800000000000000000000010421FF070041006300630065006E00740032000000030001000C0007050000C0504DFF05000C0007000000FFFFFFFF250005000293020C002400070000416363656E743392084100920800000000000000000000010425FF070041006300630065006E00740033000000030001000C00070600009BBB59FF05000C000700
m.lcFileBinary = m.lcFileBinary + 0h0000FFFFFFFF250005000293020C002500070000416363656E743492084100920800000000000000000000010429FF070041006300630065006E00740034000000030001000C00070700008064A2FF05000C0007000000FFFFFFFF250005000293020C002600070000416363656E74359208410092080000000000000000000001042DFF070041006300630065006E00740035000000030001000C00070800004BACC6FF05000C0007000000FFFFFFFF250005000293020C002700070000416363656E743692084100920800000000000000000000010431FF070041006300630065006E00740036000000030001000C0007090000F79646FF05000C000700
m.lcFileBinary = m.lcFileBinary + 0h0000FFFFFFFF25000500029302080028000300004261649208390092080000000000000000000001011BFF03004200610064000000030001000C0005FF0000FFC7CEFF05000C0005FF00009C0006FF25000500029302100029000B000043616C63756C6174696F6E92088100920800000000000000000000010216FF0B00430061006C00630075006C006100740069006F006E000000070001000C0005FF0000F2F2F2FF05000C0005FF0000FA7D00FF250005000206000E0005FF00007F7F7FFF010007000E0005FF00007F7F7FFF010008000E0005FF00007F7F7FFF010009000E0005FF00007F7F7FFF010093020F002A000A0000436865636B2043656C
m.lcFileBinary = m.lcFileBinary + 0h6C92087F00920800000000000000000000010217FF0A0043006800650063006B002000430065006C006C000000070001000C0005FF0000A5A5A5FF05000C0007000000FFFFFFFF250005000206000E0005FF00003F3F3FFF060007000E0005FF00003F3F3FFF060008000E0005FF00003F3F3FFF060009000E0005FF00003F3F3FFF0600930204002B8003FF92082000920800000000000000000000010503FF050043006F006D006D00610000000000930204002C8006FF92082800920800000000000000000000010506FF090043006F006D006D00610020005B0030005D0000000000930204002D8004FF92082600920800000000000000000000010504
m.lcFileBinary = m.lcFileBinary + 0hFF0800430075007200720065006E006300790000000000930204002E8007FF92082E00920800000000000000000000010507FF0C00430075007200720065006E006300790020005B0030005D0000000000930215002F001000004578706C616E61746F7279205465787492084700920800000000000000000000010235FF10004500780070006C0061006E00610074006F0072007900200054006500780074000000020005000C0005FF00007F7F7FFF2500050002930209003000040000476F6F6492083B0092080000000000000000000001011AFF040047006F006F0064000000030001000C0005FF0000C6EFCEFF05000C0005FF0000006100FF250005
m.lcFileBinary = m.lcFileBinary + 0h000293020E00310009000048656164696E67203192084700920800000000000000000000010310FF0900480065006100640069006E006700200031000000030005000C00070300001F497DFF250005000207000E00070400004F81BDFF050093020E00320009000048656164696E67203292084700920800000000000000000000010311FF0900480065006100640069006E006700200032000000030005000C00070300001F497DFF250005000207000E000704FF3FA8C0DEFF050093020E00330009000048656164696E67203392084700920800000000000000000000010312FF0900480065006100640069006E006700200033000000030005000C0007
m.lcFileBinary = m.lcFileBinary + 0h0300001F497DFF250005000207000E000704323395B3D7FF020093020E00340009000048656164696E67203492083900920800000000000000000000010313FF0900480065006100640069006E006700200034000000020005000C00070300001F497DFF250005000293020A003500050000496E70757492087500920800000000000000000000010214FF050049006E007000750074000000070001000C0005FF0000FFCC99FF05000C0005FF00003F3F76FF250005000206000E0005FF00007F7F7FFF010007000E0005FF00007F7F7FFF010008000E0005FF00007F7F7FFF010009000E0005FF00007F7F7FFF01009302100036000B00004C696E6B6564
m.lcFileBinary = m.lcFileBinary + 0h2043656C6C92084B00920800000000000000000000010218FF0B004C0069006E006B00650064002000430065006C006C000000030005000C0005FF0000FA7D00FF250005000207000E0005FF0000FF8001FF060093020C0037000700004E65757472616C9208410092080000000000000000000001011CFF07004E00650075007400720061006C000000030001000C0005FF0000FFEB9CFF05000C0005FF00009C6500FF250005000293020400008000FF92083300920800000000000000000000010100FF06004E006F0072006D0061006C000000020005000C0007010000000000FF25000500029302090038000400004E6F746592086200920800000000
m.lcFileBinary = m.lcFileBinary + 0h00000000000001020AFF04004E006F00740065000000050001000C0005FF0000FFFFCCFF06000E0005FF0000B2B2B2FF010007000E0005FF0000B2B2B2FF010008000E0005FF0000B2B2B2FF010009000E0005FF0000B2B2B2FF010093020B0039000600004F757470757492087700920800000000000000000000010215FF06004F00750074007000750074000000070001000C0005FF0000F2F2F2FF05000C0005FF00003F3F3FFF250005000206000E0005FF00003F3F3FFF010007000E0005FF00003F3F3FFF010008000E0005FF00003F3F3FFF010009000E0005FF00003F3F3FFF0100930204003A8005FF9208240092080000000000000000000001
m.lcFileBinary = m.lcFileBinary + 0h0505FF0700500065007200630065006E0074000000000093020A003B000500005469746C659208310092080000000000000000000001030FFF05005400690074006C0065000000020005000C00070300001F497DFF250005000193020A003C00050000546F74616C92084D00920800000000000000000000010319FF050054006F00740061006C000000040005000C0007010000000000FF250005000206000E00070400004F81BDFF010007000E00070400004F81BDFF0600930211003D000C00005761726E696E67205465787492083F0092080000000000000000000001020BFF0C005700610072006E0069006E00670020005400650078007400000002
m.lcFileBinary = m.lcFileBinary + 0h0005000C0005FF0000FF0000FF25000500028E0858008E080000000000000000000090000000110011005400610062006C0065005300740079006C0065004D0065006400690075006D0039005000690076006F0074005300740079006C0065004C0069006700680074003100360060010200000085000E00032E0000000006005368656574319A0818009A0800000000000000000000010000000000000001000000A3081000A30800000000000000000000000000008C00040001000100C1010800C10100001DEB0100FC0008000000000000000000FF00020008006308160063080000000000000000000016000000040000000200960810009608000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000042E501009B0810009B0800000000000000000000010000008C0810008C0800000000000000000000000000000A0000000908100000061000A91FCD07C1000100060400000B021000000000000000000000000000152F00000D00020001000C00020064000F000200010011000200000010000800FCA9F1D24D62503F5F00020001002A00020000002B00020000008200020001008000080000000000000000002502040000002C0181000200C104140000001500000083000200000084000200000026000800666666666666E63F27000800666666666666E63F28000800000000000000E83F29000800000000000000E83FA10022000000
m.lcFileBinary = m.lcFileBinary + 0h2C01010001000100040042E50100333333333333D33F333333333333D33F74009C0826009C0800000000000000000000000000000000000000000000000000003C33000000000000000055000200080000020E0000000000000000000000000000003E021200B606000000004000000000000000000000008B0810008B0800000000000000000000000002001D000F0003000000000000010000000000000067081700670800000000000000000000020001FFFFFFFF034400000A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000200000003000000FEFFFFFF050000000600000007000000FEFFFFFF09000000FEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFF0000060002000000000000000000000000000000000001000000E0859FF2F94F6810AB9108002B27B3D930000000980000000700000001000000400000000400000048000000080000005400000012000000600000000C000000780000000D00000084000000130000009000000002000000E40400001E00000004000000000000001E00000004000000000000001E000000100000004D6963726F736F667420457863656C004000000000C07C0D23D9C601400000000086FCA92911C90103000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FEFF000006000200000000000000000000000000000000000100000002D5CDD59C2E1B10939708002B2CF9AE30000000B000000008000000010000004800000017000000500000000B000000580000001000000060000000130000006800000016000000700000000D000000780000000C0000008B00000002000000E40400000300000000000C000B000000000000000B000000000000000B000000000000000B000000000000001E1000000100000007000000536865657431000C100000020000001E0000
m.lcFileBinary = m.lcFileBinary + 0h000B000000576F726B73686565747300030000000100000000000000000000000000000000000000000000000000000000000000000000000000010043006F006D0070004F0062006A0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012000200FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000800000072000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0hFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100FEFF030A0000FFFFFFFF2008020000000000C000000000000046260000004D6963726F736F6674204F666669636520457863656C203230303320576F726B736865657400060000004269666638000E000000457863656C2E53686565742E3800F439B271000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
m.lcFileBinary = m.lcFileBinary + 0h0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
ENDCASE
IF !EMPTY(m.lcFileBinary)
IF STRTOFILE(m.lcFileBinary, m.tcExcelFile, 0) > 0
m.llReturn = .T.
ENDIF
ENDIF
ENDIF
RETURN m.llReturn
ENDFUNC
**************************************************
*!* Code used to create hex binary of worksheet templates
**************************************************
*!* LOCAL lcBinary, lcCode
*!* _cliptext = STRCONV(FILETOSTR(GETFILE()),15)
*!* m.lcBinary = _ClipText
*!* m.lcCode = ""
*!* DO WHILE !EMPTY(m.lcBinary)
*!* m.lcCode = m.lcCode + CHR(9) + iif(Empty(m.lcCode), "m.FileBinary = ", "m.FileBinary = m.FileBinary + ") + "0h" + LEFT(m.lcBinary, 510) + CHR(13) + CHR(10)
*!* m.lcBinary = SUBSTR(m.lcBinary, 511)
*!* ENDDO
*!* _cliptext = m.lcCode

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,82 @@
Export the data displayed in a grid, or the data contained by a table / cursor
Properties:
a) To export the data displayed in a grid (only the visible columns)
Drop an instance of the exportxlsx class to your form and set :
- grid=grid reference
- label (optional)=the default file name; a reference to an object with the "caption" property; by default DATETIME()
b) To export the data contained in a table / cursor
Drop an instance of the exportxlsx class to your form and set :
- grid=table / cursor name
- label (optional)=the default file name; a reference an object with the "caption" property; by default DATETIME()
- cFields (optional)= list of fields to be displayed, separated by commas; by default all the fields are exported
- cHeaders (optional)= list of field headers to be displayed, separated by commas; by default the field names
c) Formatting properties (right click)
headbackcolor=back color for column headers (if >=0)
headfontbold= .T./.F.
headfontitalic= .T./.F.
headfontname=if not empty and installed
headfontsize=if>0
headforecolor=font color for column headers (if >=0)
rowbackcolor=back color for rows (if >=0)
rowfontbold= .T./.F.
rowfontitalic= .T./.F.
rowfontname=if not empty and installed
rowfontsize=if>0
rowforecolor=font color for rows (if >=0)
lMemoAsComment optional When passed as .T., memo fields are converted into memo while the cell contains the word "memo"
d) Miscelaneous
a) SheetName
character (default sheet1)
public
desired sheetname
b) sheetFirstCol
character (default A)
public
start column
c) sheetFirstRow
numeric (default 1)
public
start row
d) lastcol
character (XFD)
public
last valid column (maximum column / sheet)
e) lastrow
numeric (1048576)
public
last valid row (maximum number of rows / sheet)
f) autocolw
logical (default .F.)
public
.T. columns width are evaluated based on font size and the data type (the autosize feature)
g) nCodePage
numeric (default 0)
public
support for codpages for strings
acceptable values: 437,620,737,850,852,857,861,865,866,874,895,932,936,949,950,1250,1251,1252,1253,1254,1255,1256 (see VFP help)
h) lOpen
logical (default .F.)
public
when .T. the document is open
i) LangId
Character (can be EN, RO,etc.)
Public
Default En
j) aErrMess[7]
Character array
Public
Error messages
support for more than 702 columns
stop the export after the row 1048576 and the column XFD
rows height depend on the font size
when memo columns are present, the row height depends on the number of CR (increase the row height according to the number of memo rows)
Comments boxes height and width are variable

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.