From 62d2cd25c1a3bc22fc3e60b8d7ace04c2156f497 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sun, 4 Jul 2021 19:33:44 -0500 Subject: [PATCH] Documentation for Calc --- doc/build/.doctrees/environment.pickle | Bin 89847 -> 95313 bytes doc/build/.doctrees/main/calc.doctree | Bin 39500 -> 3137 bytes doc/build/.doctrees/main/calc_data.doctree | Bin 0 -> 4638 bytes doc/build/.doctrees/main/calc_doc.doctree | Bin 0 -> 5682 bytes doc/build/.doctrees/main/calc_ranges.doctree | Bin 0 -> 14023 bytes doc/build/.doctrees/main/calc_ranges2.doctree | Bin 0 -> 11360 bytes doc/build/.doctrees/main/calc_sheets.doctree | Bin 0 -> 23170 bytes doc/build/_sources/main/calc.rst.txt | 589 +----------------- doc/build/_sources/main/calc_data.rst.txt | 45 ++ doc/build/_sources/main/calc_doc.rst.txt | 50 ++ doc/build/_sources/main/calc_ranges.rst.txt | 190 ++++++ doc/build/_sources/main/calc_ranges2.rst.txt | 124 ++++ doc/build/_sources/main/calc_sheets.rst.txt | 332 ++++++++++ doc/build/main/calc.html | 584 ++--------------- doc/build/main/calc_data.html | 168 +++++ doc/build/main/calc_doc.html | 171 +++++ doc/build/main/calc_ranges.html | 310 +++++++++ doc/build/main/calc_ranges2.html | 242 +++++++ doc/build/main/calc_sheets.html | 426 +++++++++++++ doc/build/main/easymacro.html | 9 +- doc/build/objects.inv | Bin 498 -> 569 bytes doc/build/searchindex.js | 2 +- doc/source/main/calc.rst | 589 +----------------- doc/source/main/calc_data.rst | 45 ++ doc/source/main/calc_doc.rst | 50 ++ doc/source/main/calc_ranges.rst | 190 ++++++ doc/source/main/calc_ranges2.rst | 124 ++++ doc/source/main/calc_sheets.rst | 332 ++++++++++ source/easymacro.py | 89 ++- 29 files changed, 2934 insertions(+), 1727 deletions(-) create mode 100644 doc/build/.doctrees/main/calc_data.doctree create mode 100644 doc/build/.doctrees/main/calc_doc.doctree create mode 100644 doc/build/.doctrees/main/calc_ranges.doctree create mode 100644 doc/build/.doctrees/main/calc_ranges2.doctree create mode 100644 doc/build/.doctrees/main/calc_sheets.doctree create mode 100644 doc/build/_sources/main/calc_data.rst.txt create mode 100644 doc/build/_sources/main/calc_doc.rst.txt create mode 100644 doc/build/_sources/main/calc_ranges.rst.txt create mode 100644 doc/build/_sources/main/calc_ranges2.rst.txt create mode 100644 doc/build/_sources/main/calc_sheets.rst.txt create mode 100644 doc/build/main/calc_data.html create mode 100644 doc/build/main/calc_doc.html create mode 100644 doc/build/main/calc_ranges.html create mode 100644 doc/build/main/calc_ranges2.html create mode 100644 doc/build/main/calc_sheets.html create mode 100644 doc/source/main/calc_data.rst create mode 100644 doc/source/main/calc_doc.rst create mode 100644 doc/source/main/calc_ranges.rst create mode 100644 doc/source/main/calc_ranges2.rst create mode 100644 doc/source/main/calc_sheets.rst diff --git a/doc/build/.doctrees/environment.pickle b/doc/build/.doctrees/environment.pickle index 43d2fb8eda2299f6d1746d2a5e7ec448eca00b00..001a9f1d161a306f99357bdf2ae73ea5f69366cf 100644 GIT binary patch literal 95313 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 ALI3~& literal 89847 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 A(*OVf diff --git a/doc/build/.doctrees/main/calc.doctree b/doc/build/.doctrees/main/calc.doctree index 05f8d387d9d9fe377ce802fbc4e1c8bfa41cd025..43ef88bd3b1718c8bbb4a7ea982b62090ba4bc40 100644 GIT binary patch delta 517 zcmZ9J&r2Io5Xars{IW^3c(6rl8%j}WN+C$E{sDm;Lmsof+mkfB)Dw&vK`^Zy(CT+=*q` z`iu3;n$varwvopbEaNK9rfn>#q8o*AlyZ+WZJyCFZD0=bSa1kuR6$0rOhAu*Ea|I- z=iL=m3YpK}yDV@?6@bgc2SE;Pv{Yr1Iq)Kv&Z(sqr$``x6#vtN@s6p_v`?qnF>O5J z>J)pdE17|y%0734)Ps+HFrJPb^zjph7=bE=?6U{4L~7cq;Idfy5jO+oIziN?uPTqe z=K(jr%D*-fP~>UYh6Frn&Zv3mOVd8$!I9CR literal 39500 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 diff --git a/doc/build/.doctrees/main/calc_data.doctree b/doc/build/.doctrees/main/calc_data.doctree new file mode 100644 index 0000000000000000000000000000000000000000..f1f3857b0fa1f164dbe82654c908678d0c03d6c9 GIT binary patch literal 4638 zcmeHLUvDHw5%-QHdD_KT zGd=Y5*z1EshoVHWXo-gmLgE4OG58FT@)9YZh8KR-^KW-W%n4q2z|u<7)zwwiRrRZ` z^7Gc8u3uYme|9HLgp6kc76h>hc$(XdK>1n3W0QZ9-}-(2EI+ax&CXJlX`knI1suMR zVW4@OKgn&6*o_R+L3w^X<-U3w-sLPP zJo8eyXdLnethrlQGZHV;oyFI2QSl1=_$q#{;dhANEnGr;%Nc*CU>CQcx((GGyE)Fn zkQ*72i(9ReRH1h zK8u6?v|=B0t2lQMOg7al5%Yq-_a6(cy!2m4Xk7aaTzmZDu6GNrVHYBhyZC8dgD;}C-eUNV=6d&f4|R?WWWH*Q|>uZ zmqG@*Tm16y!Rv=ly4@n8_gy##Zqb$TM1gH`_>lM?Q$X+ce?x}{6y0a<$M45(>*p>T zsy%o3*laFs88GlgKuA<C%U{K@zg(6E6hFf9pBoQcie|H!5J~N4FYoBcq1a8K2`P z=?iDR^DoX+W#s?fdNFS`V4&jm_sgZsPeWqDDQ1$eRU) zhul%TGiiiZHM`JQ9w@utk=@cfQ5vluKjmS5eARXZ3+rXe?(vy~uM9I;S~0b3E8yd7 z3U$3RrepXD9C)W9P&!8AO{7cZAKRXclgxNL_Ei9`+;%cEx%1sSsl@mG;-<&7R@xJ2 z6+^D!XEN0{x!qBjS(MUpQgVB+w6i2a{KNJNp^X96(f!4ZrIU7-E|9`Y0{#izBfnie z=x}#{SN$sH9(!GLU+KULc!K1B8i`3_WZS-qC%7ZrAp;NH!9>n-(Y8J6j=hFtuS#Up zc92DhS7#l(>IkUsT*oXVfjf=@*TyNuz9A(k&jRJ483ETWpCu~g-uy|IBEIoXWh#sO z-0=dLvT?|9kK_{FcIN@P5L733hpcmuGo!9QZ3BUIA#9vZFlt#^drN$_Q!BuiI zacYE#La68%HU@wKBl6=7dw_I|yc(Ic`CickUfA9AJT`3R)lDA8*HBT`Z>13f#(tdv z(ka|@-K~qIhi;vfjy>=N<{=+pFQ5h=I|t(QNtU3gq#@f)&SeR>K<+4?n(C$|T%#(H zX5&S^T^@~j0GOUb7mWjucEd+|aN==HrJ;wxA5AQc#2?#L9-q?uY&VMP05~GKWE@DO zyYUQ~SB`3f*?A9&kSqq1KN2CJY55uI*8;Ves6mFbNxf(jC@_qJzD~sA`$&8tJ{KQ| z=i)Q*X=XdLLnDTp-o+Oq@xe%ZHp;{+G~<4buJ<`w=1;{(ncbd`j1#-l(2@-mJ+kmYXv6!z=(a T)s({64XBKjh^MDD8xQ^o$=kj& literal 0 HcmV?d00001 diff --git a/doc/build/.doctrees/main/calc_doc.doctree b/doc/build/.doctrees/main/calc_doc.doctree new file mode 100644 index 0000000000000000000000000000000000000000..6c136e02e50cda1e903d24c9179e423a8467ef33 GIT binary patch literal 5682 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 literal 0 HcmV?d00001 diff --git a/doc/build/.doctrees/main/calc_ranges2.doctree b/doc/build/.doctrees/main/calc_ranges2.doctree new file mode 100644 index 0000000000000000000000000000000000000000..dfbb56fe4836e270d85d47a3505c7f83f373eed1 GIT binary patch literal 11360 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 literal 0 HcmV?d00001 diff --git a/doc/build/_sources/main/calc.rst.txt b/doc/build/_sources/main/calc.rst.txt index 8dfd34d..f26ad34 100644 --- a/doc/build/_sources/main/calc.rst.txt +++ b/doc/build/_sources/main/calc.rst.txt @@ -1,4 +1,3 @@ - Calc ---- @@ -9,583 +8,11 @@ Remember, always import library. import easymacro as app -Document -~~~~~~~~ - -Current doc -^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - app.msgbox(doc.type) - - -Selection -^^^^^^^^^ - -* If selection is range get LOCalcRange, if selection is shape get LOShape, other selection get original pyuno object. - -.. code-block:: python - - doc = app.active - selection = doc.selection - app.msgbox(type(selection)) - - -Headers -^^^^^^^ - -* Hide or show columns and rows headers. - -.. code-block:: python - - doc = app.active - app.msgbox(doc.headers) - doc.headers = not doc.headers - app.msgbox(doc.headers) - doc.headers = not doc.headers - - -Tabs -^^^^ - -* Hide or show tab sheets. - -.. code-block:: python - - doc = app.active - app.msgbox(doc.tabs) - doc.tabs = not doc.tabs - app.msgbox(doc.tabs) - doc.tabs = not doc.tabs - - -Sheets -~~~~~~ - -Active sheet -^^^^^^^^^^^^ - -.. code-block:: python - - sheet = app.active_sheet - app.msgbox(sheet.name) - - # or - doc = app.active - sheet = doc.active - - -Get by index -^^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - sheet = doc[0] - app.msgbox(sheet.name) - - -Get by name -^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - sheet = doc['Sheet1'] - app.msgbox(sheet.name) - - -Contains -^^^^^^^^ - -.. code-block:: python - - doc = app.active - app.msgbox('Sheet1' in doc) - - -Get tuple with all names -^^^^^^^^^^^^^^^^^^^^^^^^ - -.. code-block:: python - - doc = app.active - app.msgbox(doc.names) - - -Count -^^^^^ - -.. code-block:: python - - doc = app.active - app.msgbox(len(doc)) - -New -^^^ - -* Always validate if new name not exists. - -.. code-block:: python - - doc = app.active - - sheet = doc.new_sheet() - # CAUTION: If 'NewSheet' exists, reset it to clean sheet. - doc['NewSheet'] = sheet - - # ~ or - - sheet = doc.insert('NewSheet2') - -* Insert multiple, get last insert. - -.. code-block:: python - - names = ('One', 'Two', 'Three') - sheet = doc.insert(names) - - -Move -^^^^ - -* Move by object to last position. - -.. code-block:: python - - sheet = doc[0] - doc.move(sheet) - -* Move by name to last position. - -.. code-block:: python - - doc.move('Sheet1') - -* Move to position. - -.. code-block:: python - - sheet = doc[0] - doc.move(sheet, 2) - -* Move from sheet - -.. code-block:: python - - sheet = app.active_sheet - sheet.move() - -* Move to position. - -.. code-block:: python - - sheet = app.active_sheet - sheet.move(2) - - -Remove -^^^^^^ - -* Remove by object. - -.. code-block:: python - - sheet = doc[0] - doc.remove(sheet) - -* Remove by name. - -.. code-block:: python - - doc.remove('One') - -* Remove from sheet. - -.. code-block:: python - - sheet = app.active_sheet - sheet.remove() - - -Copy -^^^^ - -* Copy inside the same spreadsheet. - -* By object - -.. code-block:: python - - sheet = doc[0] - doc.copy(sheet, 'OtherSheet') - -* By name - -.. code-block:: python - - doc.copy('Sheet1', 'Sheet2') - -* From sheet - -.. code-block:: python - - sheet = app.active_sheet - sheet.copy(sheet.name + '_2') - - -Copy from -^^^^^^^^^ - -* Copy sheet from one spreadsheet to other. - -.. code-block:: python - - doc = app.active - doc_source = app.docs['Contacts.ods'] - name_source = 'Names' - name_target = 'Names' - position = 0 - doc.copy_from(doc_source, name_source, name_target, position) - - -Copy to -^^^^^^^ - -* Copy from sheet with the same name - -.. code-block:: python - - doc = app.docs.new() - sheet = app.active_sheet - sheet.copy_to(doc) - -* Used new name - -.. code-block:: python - - doc = app.docs.new() - sheet = app.active_sheet - sheet.copy_to(doc, 'NewName') - - -Sort -^^^^ - -* Sort sheets by names. - -.. code-block:: python - - doc = app.active - doc.sort() - -Name -^^^^ - -* Name visible by the user. - -.. code-block:: python - - sheet = app.active_sheet - app.msgbox(sheet.name) - sheet.name = 'NewName' - app.msgbox(sheet.name) - - -Code name -^^^^^^^^^ - -* Name only accessible by code. - -.. code-block:: python - - sheet = app.active_sheet - app.msgbox(sheet.code_name) - sheet.code_name = 'my_name' - app.msgbox(sheet.code_name) - - -Visible -^^^^^^^ - -* Apply only with spreadsheet with two or more sheets. - -.. code-block:: python - - sheet = app.active_sheet - app.msgbox(sheet.visible) - sheet.visible = not sheet.visible - app.msgbox(sheet.visible) - sheet.visible = not sheet.visible - - -Is protected -^^^^^^^^^^^^ - -* If sheet is protected with password. - -.. code-block:: python - - sheet = app.active_sheet - app.msgbox(sheet.is_protected) - - -Set password -^^^^^^^^^^^^ - -.. code-block:: python - - sheet = app.active_sheet - sheet.password = 'letmein' - app.msgbox(sheet.is_protected) - - -Remove password -^^^^^^^^^^^^^^^ - -.. code-block:: python - - sheet = app.active_sheet - sheet.password = 'letmein' - app.msgbox(sheet.is_protected) - - sheet.unprotect('letmein') - app.msgbox(sheet.is_protected) - - -Tab color -^^^^^^^^^ - -.. code-block:: python - - sheet = app.active_sheet - app.msgbox(sheet.color) - - sheet.color = 'red' - app.msgbox(sheet.color) - - # RGB - sheet.color = (125, 200, 10) - app.msgbox(sheet.color) - - -Document parent -^^^^^^^^^^^^^^^ - -.. code-block:: python - - doc = sheet.doc - - -Activate -^^^^^^^^ - -.. code-block:: python - - doc = app.active - # Get last sheet - sheet = doc[-1] - - # Activate from doc - doc.activate(sheet) - - # Activate from sheet - sheet.activate() - - -Ranges -~~~~~~ - -Cells -^^^^^ - -* By name - -.. code-block:: python - - sheet = app.active_sheet - cell = sheet['A1'] - app.msgbox(cell.name) - - -* By position [row, column] - -.. code-block:: python - - cell = sheet[1, 4] - app.msgbox(cell.name) - - -Ranges -^^^^^^ - -* By name - -.. code-block:: python - - sheet = app.active_sheet - rango = sheet['B2:D5'] - app.msgbox(rango.name) - -* By position [start_row:end_row, start_column:end_column] - -.. code-block:: python - - rango = sheet[1:5,1:4] - app.msgbox(rango.name) - -* Group ranges - -.. code-block:: python - - doc = app.active - sheet = doc.active - last = doc[-1] - with doc.ranges as r: - # Add one range - r.add(sheet['A1:B2']) - r2 = sheet['C4:D5'] - r3 = last['E7:D8'] - r4 = last['E10:F12'] - # Add multiple ranges - r.add((r2, r3, r4)) - app.debug(r.names) - -* Get the same range in all sheets - -.. code-block:: python - - ranges = doc.get_ranges('A1:B1') - app.debug(ranges.names) - -* Get columns by name. - -.. code-block:: python - - sheet = app.active_sheet - rango = sheet['B:B'] - app.debug(rango.name) - - rango = sheet['D:F'] - app.debug(rango.name) - -* Get columns by position. - -.. code-block:: python - - sheet = app.active_sheet - # Column B - rango = sheet[0:,1] - app.debug(rango.name) - - # Columnas D:F - rango = sheet[0:,3:6] - app.debug(rango.name) - - -* Get rows - -.. code-block:: python - - sheet = app.active_sheet - # One row - row = sheet[1] - app.debug(row.name) - - # Range rows - row = sheet[3:10,0:] - app.debug(row.name) - - -Info ranges -^^^^^^^^^^^ - -* Get absolute name - -.. code-block:: python - - sheet = app.active_sheet - rango = sheet['A1:E10'] - app.msgbox(rango.name) - -* Get address - -.. code-block:: python - - sheet = app.active_sheet - rango = sheet['A1'] - a = rango.address - data = f"""Cell Address - Row: {a.Row} - Column: {a.Column} - """ - app.msgbox(data) - - rango = sheet['A1:E10'] - ra = rango.range_address - data = ( - f'Range Address:\n\n' - f'Star Row: {ra.StartRow}\n' - f'End Row: {ra.EndRow}\n' - f'Star Column: {ra.StartColumn}\n' - f'End Column: {ra.EndColumn}\n' - ) - app.msgbox(data) - - -Special ranges -^^^^^^^^^^^^^^ - -* Get used area - -.. code-block:: python - - sheet = app.active_sheet - rango = sheet.used_area - app.msgbox(rango.name) - -* Get current region - -.. code-block:: python - - rango = sheet['A1'].current_region - app.msgbox(rango.name) - -* Get next free cell - -.. code-block:: python - - cell = sheet['A1'].next_cell - app.msgbox(cell.name) - -* Get merged area - -.. code-block:: python - - sheet = app.active_sheet - rango = sheet['A1'].merged_area - app.msgbox(rango.name) - -* Get visible cells - -.. code-block:: python - - sheet = app.active_sheet - rangos = sheet['A1:E10'].visible - for r in rangos: - app.debug(r.name) - -* Get empty cells - -.. code-block:: python - - sheet = app.active_sheet - rangos = sheet['A1:E10'].empty - for r in rangos: - app.debug(r.name) - - -Manipulate ranges -~~~~~~~~~~~~~~~~~ +.. toctree:: + :maxdepth: 2 + + calc_doc.rst + calc_sheets.rst + calc_ranges.rst + calc_ranges2.rst + calc_data.rst diff --git a/doc/build/_sources/main/calc_data.rst.txt b/doc/build/_sources/main/calc_data.rst.txt new file mode 100644 index 0000000..5a2382b --- /dev/null +++ b/doc/build/_sources/main/calc_data.rst.txt @@ -0,0 +1,45 @@ + +Data +~~~~ + +Read +^^^^ + +* Get value from cell, automatic detect type and get value. + +.. code-block:: python + + sheet = app.active_sheet + cell = sheet['A1'] + + value = cell.value + info = f'Cell Type = {cell.type}\n\nCell Value = {cell.value}' + app.msgbox(info) + + +Write +^^^^^ + +* Automatic detect data type. + +.. code-block:: python + + sheet = app.active_sheet + + # ~ Set int + sheet['A1'].value = 1 + + # ~ Set float + sheet['A2'].value = 10.5 + + # ~ Set string + sheet['A3'].value = 'Damn World' + + # ~ Set date + sheet['A4'].value = app.today() + + # ~ Set time + sheet['A5'].value = app.now(True) + + # ~ Set datetime + sheet['A6'].value = app.now() diff --git a/doc/build/_sources/main/calc_doc.rst.txt b/doc/build/_sources/main/calc_doc.rst.txt new file mode 100644 index 0000000..f3a5f26 --- /dev/null +++ b/doc/build/_sources/main/calc_doc.rst.txt @@ -0,0 +1,50 @@ +Document +~~~~~~~~ + +Current doc +^^^^^^^^^^^ + +.. code-block:: python + + doc = app.active + app.msgbox(doc.type) + + +Selection +^^^^^^^^^ + +* If selection is range get LOCalcRange, if selection is shape get LOShape, other selection get original pyuno object. + +.. code-block:: python + + doc = app.active + selection = doc.selection + app.msgbox(type(selection)) + + +Headers +^^^^^^^ + +* Hide or show columns and rows headers. + +.. code-block:: python + + doc = app.active + app.msgbox(doc.headers) + doc.headers = not doc.headers + app.msgbox(doc.headers) + doc.headers = not doc.headers + + +Tabs +^^^^ + +* Hide or show tab sheets. + +.. code-block:: python + + doc = app.active + app.msgbox(doc.tabs) + doc.tabs = not doc.tabs + app.msgbox(doc.tabs) + doc.tabs = not doc.tabs diff --git a/doc/build/_sources/main/calc_ranges.rst.txt b/doc/build/_sources/main/calc_ranges.rst.txt new file mode 100644 index 0000000..84a34ed --- /dev/null +++ b/doc/build/_sources/main/calc_ranges.rst.txt @@ -0,0 +1,190 @@ +Cell and ranges +~~~~~~~~~~~~~~~ + +Cells +^^^^^ + +* By name + +.. code-block:: python + + sheet = app.active_sheet + cell = sheet['A1'] + app.msgbox(cell.name) + + +* By position [row, column] + +.. code-block:: python + + cell = sheet[1, 4] + app.msgbox(cell.name) + + +Ranges +^^^^^^ + +* By name + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['B2:D5'] + app.msgbox(rango.name) + +* By position [start_row:end_row, start_column:end_column] + +.. code-block:: python + + rango = sheet[1:5,1:4] + app.msgbox(rango.name) + +* Group ranges + +.. code-block:: python + + doc = app.active + sheet = doc.active + last = doc[-1] + with doc.ranges as r: + # Add one range + r.add(sheet['A1:B2']) + r2 = sheet['C4:D5'] + r3 = last['E7:D8'] + r4 = last['E10:F12'] + # Add multiple ranges + r.add((r2, r3, r4)) + app.debug(r.names) + +* Get the same range in all sheets + +.. code-block:: python + + ranges = doc.get_ranges('A1:B1') + app.debug(ranges.names) + +* Get columns by name. + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['B:B'] + app.debug(rango.name) + + rango = sheet['D:F'] + app.debug(rango.name) + +* Get columns by position. + +.. code-block:: python + + sheet = app.active_sheet + # Column B + rango = sheet[0:,1] + app.debug(rango.name) + + # Columnas D:F + rango = sheet[0:,3:6] + app.debug(rango.name) + + +* Get rows + +.. code-block:: python + + sheet = app.active_sheet + # One row + row = sheet[1] + app.debug(row.name) + + # Range rows + row = sheet[3:10,0:] + app.debug(row.name) + + +Info ranges +^^^^^^^^^^^ + +* Get absolute name + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['A1:E10'] + app.msgbox(rango.name) + +* Get address + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['A1'] + a = rango.address + data = f"""Cell Address + Row: {a.Row} + Column: {a.Column} + """ + app.msgbox(data) + + rango = sheet['A1:E10'] + ra = rango.range_address + data = ( + f'Range Address:\n\n' + f'Star Row: {ra.StartRow}\n' + f'End Row: {ra.EndRow}\n' + f'Star Column: {ra.StartColumn}\n' + f'End Column: {ra.EndColumn}\n' + ) + app.msgbox(data) + + +Special ranges +^^^^^^^^^^^^^^ + +* Get used area + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet.used_area + app.msgbox(rango.name) + +* Get current region + +.. code-block:: python + + rango = sheet['A1'].current_region + app.msgbox(rango.name) + +* Get next free cell + +.. code-block:: python + + cell = sheet['A1'].next_cell + app.msgbox(cell.name) + +* Get merged area + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['A1'].merged_area + app.msgbox(rango.name) + +* Get visible cells + +.. code-block:: python + + sheet = app.active_sheet + rangos = sheet['A1:E10'].visible + for r in rangos: + app.debug(r.name) + +* Get empty cells + +.. code-block:: python + + sheet = app.active_sheet + rangos = sheet['A1:E10'].empty + for r in rangos: + app.debug(r.name) diff --git a/doc/build/_sources/main/calc_ranges2.rst.txt b/doc/build/_sources/main/calc_ranges2.rst.txt new file mode 100644 index 0000000..d58ea7d --- /dev/null +++ b/doc/build/_sources/main/calc_ranges2.rst.txt @@ -0,0 +1,124 @@ +Manipulate ranges +~~~~~~~~~~~~~~~~~ + +**Not, not is necesary select range for manipulate** + +Select +^^^^^^ + +* Select from doc + +.. code-block:: python + + doc = app.active + sheet = app.active_sheet + + cell = sheet['A1'] + doc.select(cell) + + +* Select in self range + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['A1:C5'] + rango.select() + + +Move +^^^^ + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['A1:C5'] + rango.move(sheet['E6']) + +* Move to other sheet + +.. code-block:: python + + rango.move(doc[-1]['E6']) + + +Insert +^^^^^^ + +* Default insert down + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['A1:C1'] + rango.insert() + +* Insert and move right + +.. code-block:: python + + rango.insert(app.CellInsertMode.RIGHT) + +* Insert entire rows + +.. code-block:: python + + rango.insert(app.CellInsertMode.ROWS) + +* Insert entire columns + +.. code-block:: python + + rango.insert(app.CellInsertMode.COLUMNS) + + +Delete +^^^^^^ + +* Default move up + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['A1:C1'] + rango.delete() + +* Delete and move left + +.. code-block:: python + + rango.delete(app.CellDeleteMode.LEFT) + +* Delete entire rows + +.. code-block:: python + + rango.delete(app.CellDeleteMode.ROWS) + +* Delete entire columns + +.. code-block:: python + + rango.delete(app.CellDeleteMode.COLUMNS) + + +Copy +^^^^ + +* Using native method `copyRange`, current range always should be a cell and source should be a range. + +.. code-block:: python + + sheet = app.active_sheet + cell = sheet['A5'] + source = sheet['D1:E4'] + cell.copy_from(source) + +* From range to cell + +.. code-block:: python + + sheet = app.active_sheet + rango = sheet['A1:C5'] + target = sheet['E1'] + rango.copy_to(target) diff --git a/doc/build/_sources/main/calc_sheets.rst.txt b/doc/build/_sources/main/calc_sheets.rst.txt new file mode 100644 index 0000000..542a954 --- /dev/null +++ b/doc/build/_sources/main/calc_sheets.rst.txt @@ -0,0 +1,332 @@ +Sheets +~~~~~~ + +Active sheet +^^^^^^^^^^^^ + +.. code-block:: python + + sheet = app.active_sheet + app.msgbox(sheet.name) + + # or + doc = app.active + sheet = doc.active + + +Get by index +^^^^^^^^^^^^ + +.. code-block:: python + + doc = app.active + sheet = doc[0] + app.msgbox(sheet.name) + + +Get by name +^^^^^^^^^^^ + +.. code-block:: python + + doc = app.active + sheet = doc['Sheet1'] + app.msgbox(sheet.name) + + +Contains +^^^^^^^^ + +.. code-block:: python + + doc = app.active + app.msgbox('Sheet1' in doc) + + +Get tuple with all names +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + doc = app.active + app.msgbox(doc.names) + + +Count +^^^^^ + +.. code-block:: python + + doc = app.active + app.msgbox(len(doc)) + +New +^^^ + +* Always validate if new name not exists. + +.. code-block:: python + + doc = app.active + + sheet = doc.new_sheet() + # CAUTION: If 'NewSheet' exists, reset it to clean sheet. + doc['NewSheet'] = sheet + + # ~ or + + sheet = doc.insert('NewSheet2') + +* Insert multiple, get last insert. + +.. code-block:: python + + names = ('One', 'Two', 'Three') + sheet = doc.insert(names) + + +Move +^^^^ + +* Move by object to last position. + +.. code-block:: python + + sheet = doc[0] + doc.move(sheet) + +* Move by name to last position. + +.. code-block:: python + + doc.move('Sheet1') + +* Move to position. + +.. code-block:: python + + sheet = doc[0] + doc.move(sheet, 2) + +* Move from sheet + +.. code-block:: python + + sheet = app.active_sheet + sheet.move() + +* Move to position. + +.. code-block:: python + + sheet = app.active_sheet + sheet.move(2) + + +Remove +^^^^^^ + +* Remove by object. + +.. code-block:: python + + sheet = doc[0] + doc.remove(sheet) + +* Remove by name. + +.. code-block:: python + + doc.remove('One') + +* Remove from sheet. + +.. code-block:: python + + sheet = app.active_sheet + sheet.remove() + + +Copy +^^^^ + +* Copy inside the same spreadsheet. + +* By object + +.. code-block:: python + + sheet = doc[0] + doc.copy(sheet, 'OtherSheet') + +* By name + +.. code-block:: python + + doc.copy('Sheet1', 'Sheet2') + +* From sheet + +.. code-block:: python + + sheet = app.active_sheet + sheet.copy(sheet.name + '_2') + + +Copy from +^^^^^^^^^ + +* Copy sheet from one spreadsheet to other. + +.. code-block:: python + + doc = app.active + doc_source = app.docs['Contacts.ods'] + name_source = 'Names' + name_target = 'Names' + position = 0 + doc.copy_from(doc_source, name_source, name_target, position) + + +Copy to +^^^^^^^ + +* Copy from sheet with the same name + +.. code-block:: python + + doc = app.docs.new() + sheet = app.active_sheet + sheet.copy_to(doc) + +* Used new name + +.. code-block:: python + + doc = app.docs.new() + sheet = app.active_sheet + sheet.copy_to(doc, 'NewName') + + +Sort +^^^^ + +* Sort sheets by names. + +.. code-block:: python + + doc = app.active + doc.sort() + +Name +^^^^ + +* Name visible by the user. + +.. code-block:: python + + sheet = app.active_sheet + app.msgbox(sheet.name) + sheet.name = 'NewName' + app.msgbox(sheet.name) + + +Code name +^^^^^^^^^ + +* Name only accessible by code. + +.. code-block:: python + + sheet = app.active_sheet + app.msgbox(sheet.code_name) + sheet.code_name = 'my_name' + app.msgbox(sheet.code_name) + + +Visible +^^^^^^^ + +* Apply only with spreadsheet with two or more sheets. + +.. code-block:: python + + sheet = app.active_sheet + app.msgbox(sheet.visible) + sheet.visible = not sheet.visible + app.msgbox(sheet.visible) + sheet.visible = not sheet.visible + + +Is protected +^^^^^^^^^^^^ + +* If sheet is protected with password. + +.. code-block:: python + + sheet = app.active_sheet + app.msgbox(sheet.is_protected) + + +Set password +^^^^^^^^^^^^ + +.. code-block:: python + + sheet = app.active_sheet + sheet.password = 'letmein' + app.msgbox(sheet.is_protected) + + +Remove password +^^^^^^^^^^^^^^^ + +.. code-block:: python + + sheet = app.active_sheet + sheet.password = 'letmein' + app.msgbox(sheet.is_protected) + + sheet.unprotect('letmein') + app.msgbox(sheet.is_protected) + + +Tab color +^^^^^^^^^ + +.. code-block:: python + + sheet = app.active_sheet + app.msgbox(sheet.color) + + sheet.color = 'red' + app.msgbox(sheet.color) + + # RGB + sheet.color = (125, 200, 10) + app.msgbox(sheet.color) + + +Document parent +^^^^^^^^^^^^^^^ + +.. code-block:: python + + doc = sheet.doc + + +Activate +^^^^^^^^ + +.. code-block:: python + + doc = app.active + # Get last sheet + sheet = doc[-1] + + # Activate from doc + doc.activate(sheet) + + # Activate from sheet + sheet.activate() diff --git a/doc/build/main/calc.html b/doc/build/main/calc.html index bd4d299..6a1d3ff 100644 --- a/doc/build/main/calc.html +++ b/doc/build/main/calc.html @@ -15,7 +15,7 @@ - + @@ -39,544 +39,62 @@
import easymacro as app
 
-
-

Document

-
-

Current doc

-
doc = app.active
-app.msgbox(doc.type)
-
-
-
-
-

Selection

-
    -
  • If selection is range get LOCalcRange, if selection is shape get LOShape, other selection get original pyuno object.

  • +
    +
-
-

Headers

-
-
-

Tabs

-
-
-
-

Sheets

-
-

Active sheet

-
sheet = app.active_sheet
-app.msgbox(sheet.name)
-
-# or
-doc = app.active
-sheet = doc.active
-
-
-
-
-

Get by index

-
doc = app.active
-sheet = doc[0]
-app.msgbox(sheet.name)
-
-
-
-
-

Get by name

-
doc = app.active
-sheet = doc['Sheet1']
-app.msgbox(sheet.name)
-
-
-
-
-

Contains

-
doc = app.active
-app.msgbox('Sheet1' in doc)
-
-
-
-
-

Get tuple with all names

-
doc = app.active
-app.msgbox(doc.names)
-
-
-
-
-

Count

-
doc = app.active
-app.msgbox(len(doc))
-
-
-
-
-

New

-
    -
  • Always validate if new name not exists.

  • + +
  • Manipulate ranges -
    doc = app.active
    -
    -sheet = doc.new_sheet()
    -# CAUTION: If 'NewSheet' exists, reset it to clean sheet.
    -doc['NewSheet'] = sheet
    -
    -# ~ or
    -
    -sheet = doc.insert('NewSheet2')
    -
    -
    -
      -
    • Insert multiple, get last insert.

    • + +
    • Data -
      names = ('One', 'Two', 'Three')
      -sheet = doc.insert(names)
      -
      -
      -
-
-

Move

-
    -
  • Move by object to last position.

  • +
-
sheet = doc[0]
-doc.move(sheet)
-
-
    -
  • Move by name to last position.

  • -
-
doc.move('Sheet1')
-
-
-
    -
  • Move to position.

  • -
-
sheet = doc[0]
-doc.move(sheet, 2)
-
-
-
    -
  • Move from sheet

  • -
-
sheet = app.active_sheet
-sheet.move()
-
-
-
    -
  • Move to position.

  • -
-
sheet = app.active_sheet
-sheet.move(2)
-
-
-
-
-

Remove

-
    -
  • Remove by object.

  • -
-
sheet = doc[0]
-doc.remove(sheet)
-
-
-
    -
  • Remove by name.

  • -
-
doc.remove('One')
-
-
-
    -
  • Remove from sheet.

  • -
-
sheet = app.active_sheet
-sheet.remove()
-
-
-
-
-

Copy

-
    -
  • Copy inside the same spreadsheet.

  • -
  • By object

  • -
-
sheet = doc[0]
-doc.copy(sheet, 'OtherSheet')
-
-
-
    -
  • By name

  • -
-
doc.copy('Sheet1', 'Sheet2')
-
-
-
    -
  • From sheet

  • -
-
sheet = app.active_sheet
-sheet.copy(sheet.name + '_2')
-
-
-
-
-

Copy from

-
    -
  • Copy sheet from one spreadsheet to other.

  • -
-
doc = app.active
-doc_source = app.docs['Contacts.ods']
-name_source = 'Names'
-name_target = 'Names'
-position = 0
-doc.copy_from(doc_source, name_source, name_target, position)
-
-
-
-
-

Copy to

-
    -
  • Copy from sheet with the same name

  • -
-
doc = app.docs.new()
-sheet = app.active_sheet
-sheet.copy_to(doc)
-
-
-
    -
  • Used new name

  • -
-
doc = app.docs.new()
-sheet = app.active_sheet
-sheet.copy_to(doc, 'NewName')
-
-
-
-
-

Sort

-
    -
  • Sort sheets by names.

  • -
-
doc = app.active
-doc.sort()
-
-
-
-
-

Name

-
    -
  • Name visible by the user.

  • -
-
sheet = app.active_sheet
-app.msgbox(sheet.name)
-sheet.name = 'NewName'
-app.msgbox(sheet.name)
-
-
-
-
-

Code name

-
    -
  • Name only accessible by code.

  • -
-
sheet = app.active_sheet
-app.msgbox(sheet.code_name)
-sheet.code_name = 'my_name'
-app.msgbox(sheet.code_name)
-
-
-
-
-

Visible

-
    -
  • Apply only with spreadsheet with two or more sheets.

  • -
-
sheet = app.active_sheet
-app.msgbox(sheet.visible)
-sheet.visible = not sheet.visible
-app.msgbox(sheet.visible)
-sheet.visible = not sheet.visible
-
-
-
-
-

Is protected

-
    -
  • If sheet is protected with password.

  • -
-
sheet = app.active_sheet
-app.msgbox(sheet.is_protected)
-
-
-
-
-

Set password

-
sheet = app.active_sheet
-sheet.password = 'letmein'
-app.msgbox(sheet.is_protected)
-
-
-
-
-

Remove password

-
sheet = app.active_sheet
-sheet.password = 'letmein'
-app.msgbox(sheet.is_protected)
-
-sheet.unprotect('letmein')
-app.msgbox(sheet.is_protected)
-
-
-
-
-

Tab color

-
sheet = app.active_sheet
-app.msgbox(sheet.color)
-
-sheet.color = 'red'
-app.msgbox(sheet.color)
-
-# RGB
-sheet.color = (125, 200, 10)
-app.msgbox(sheet.color)
-
-
-
-
-

Document parent

-
doc = sheet.doc
-
-
-
-
-

Activate

-
doc = app.active
-# Get last sheet
-sheet = doc[-1]
-
-# Activate from doc
-doc.activate(sheet)
-
-# Activate from sheet
-sheet.activate()
-
-
-
-
-
-

Ranges

-
-

Cells

-
    -
  • By name

  • -
-
sheet = app.active_sheet
-cell = sheet['A1']
-app.msgbox(cell.name)
-
-
-
    -
  • By position [row, column]

  • -
-
cell = sheet[1, 4]
-app.msgbox(cell.name)
-
-
-
-
-

Ranges

-
    -
  • By name

  • -
-
sheet = app.active_sheet
-rango = sheet['B2:D5']
-app.msgbox(rango.name)
-
-
-
    -
  • By position [start_row:end_row, start_column:end_column]

  • -
-
rango = sheet[1:5,1:4]
-app.msgbox(rango.name)
-
-
-
    -
  • Group ranges

  • -
-
doc = app.active
-sheet = doc.active
-last = doc[-1]
-with doc.ranges as r:
-    # Add one range
-    r.add(sheet['A1:B2'])
-    r2 = sheet['C4:D5']
-    r3 = last['E7:D8']
-    r4 = last['E10:F12']
-    # Add multiple ranges
-    r.add((r2, r3, r4))
-    app.debug(r.names)
-
-
-
    -
  • Get the same range in all sheets

  • -
-
ranges = doc.get_ranges('A1:B1')
-app.debug(ranges.names)
-
-
-
    -
  • Get columns by name.

  • -
-
sheet = app.active_sheet
-rango = sheet['B:B']
-app.debug(rango.name)
-
-rango = sheet['D:F']
-app.debug(rango.name)
-
-
-
    -
  • Get columns by position.

  • -
-
sheet = app.active_sheet
-# Column B
-rango = sheet[0:,1]
-app.debug(rango.name)
-
-# Columnas D:F
-rango = sheet[0:,3:6]
-app.debug(rango.name)
-
-
-
    -
  • Get rows

  • -
-
sheet = app.active_sheet
-# One row
-row = sheet[1]
-app.debug(row.name)
-
-# Range rows
-row = sheet[3:10,0:]
-app.debug(row.name)
-
-
-
-
-

Info ranges

-
    -
  • Get absolute name

  • -
-
sheet = app.active_sheet
-rango = sheet['A1:E10']
-app.msgbox(rango.name)
-
-
-
    -
  • Get address

  • -
-
sheet = app.active_sheet
-rango = sheet['A1']
-a = rango.address
-data = f"""Cell Address
-Row: {a.Row}
-Column: {a.Column}
-"""
-app.msgbox(data)
-
-rango = sheet['A1:E10']
-ra = rango.range_address
-data = (
-    f'Range Address:\n\n'
-    f'Star Row: {ra.StartRow}\n'
-    f'End Row: {ra.EndRow}\n'
-    f'Star Column: {ra.StartColumn}\n'
-    f'End Column: {ra.EndColumn}\n'
-)
-app.msgbox(data)
-
-
-
-
-

Special ranges

-
    -
  • Get used area

  • -
-
sheet = app.active_sheet
-rango = sheet.used_area
-app.msgbox(rango.name)
-
-
-
    -
  • Get current region

  • -
-
rango = sheet['A1'].current_region
-app.msgbox(rango.name)
-
-
-
    -
  • Get next free cell

  • -
-
cell = sheet['A1'].next_cell
-app.msgbox(cell.name)
-
-
-
    -
  • Get merged area

  • -
-
sheet = app.active_sheet
-rango = sheet['A1'].merged_area
-app.msgbox(rango.name)
-
-
-
    -
  • Get visible cells

  • -
-
sheet = app.active_sheet
-rangos = sheet['A1:E10'].visible
-for r in rangos:
-    app.debug(r.name)
-
-
-
    -
  • Get empty cells

  • -
-
sheet = app.active_sheet
-rangos = sheet['A1:E10'].empty
-for r in rangos:
-    app.debug(r.name)
-
-
-
-
-
-

Manipulate ranges

-
@@ -621,7 +139,7 @@
  • Documentation overview
  • diff --git a/doc/build/main/calc_data.html b/doc/build/main/calc_data.html new file mode 100644 index 0000000..3a5eccf --- /dev/null +++ b/doc/build/main/calc_data.html @@ -0,0 +1,168 @@ + + + + + + + + + Data — ZAZ documentation + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    + +
    +

    Data

    +
    +

    Read

    +
      +
    • Get value from cell, automatic detect type and get value.

    • +
    +
    sheet = app.active_sheet
    +cell = sheet['A1']
    +
    +value = cell.value
    +info = f'Cell Type = {cell.type}\n\nCell Value = {cell.value}'
    +app.msgbox(info)
    +
    +
    +
    +
    +

    Write

    +
      +
    • Automatic detect data type.

    • +
    +
    sheet = app.active_sheet
    +
    +# ~ Set int
    +sheet['A1'].value = 1
    +
    +# ~ Set float
    +sheet['A2'].value = 10.5
    +
    +# ~ Set string
    +sheet['A3'].value = 'Damn World'
    +
    +# ~ Set date
    +sheet['A4'].value = app.today()
    +
    +# ~ Set time
    +sheet['A5'].value = app.now(True)
    +
    +# ~ Set datetime
    +sheet['A6'].value = app.now()
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/doc/build/main/calc_doc.html b/doc/build/main/calc_doc.html new file mode 100644 index 0000000..7fe017d --- /dev/null +++ b/doc/build/main/calc_doc.html @@ -0,0 +1,171 @@ + + + + + + + + + Document — ZAZ documentation + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    + +
    +

    Document

    +
    +

    Current doc

    +
    doc = app.active
    +app.msgbox(doc.type)
    +
    +
    +
    +
    +

    Selection

    +
      +
    • If selection is range get LOCalcRange, if selection is shape get LOShape, other selection get original pyuno object.

    • +
    +
    doc = app.active
    +selection = doc.selection
    +app.msgbox(type(selection))
    +
    +
    +
    +
    +

    Headers

    +
      +
    • Hide or show columns and rows headers.

    • +
    +
    doc = app.active
    +app.msgbox(doc.headers)
    +doc.headers = not doc.headers
    +app.msgbox(doc.headers)
    +doc.headers = not doc.headers
    +
    +
    +
    +
    +

    Tabs

    +
      +
    • Hide or show tab sheets.

    • +
    +
    doc = app.active
    +app.msgbox(doc.tabs)
    +doc.tabs = not doc.tabs
    +app.msgbox(doc.tabs)
    +doc.tabs = not doc.tabs
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/doc/build/main/calc_ranges.html b/doc/build/main/calc_ranges.html new file mode 100644 index 0000000..6f9e56d --- /dev/null +++ b/doc/build/main/calc_ranges.html @@ -0,0 +1,310 @@ + + + + + + + + + Cell and ranges — ZAZ documentation + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    + +
    +

    Cell and ranges

    +
    +

    Cells

    +
      +
    • By name

    • +
    +
    sheet = app.active_sheet
    +cell = sheet['A1']
    +app.msgbox(cell.name)
    +
    +
    +
      +
    • By position [row, column]

    • +
    +
    cell = sheet[1, 4]
    +app.msgbox(cell.name)
    +
    +
    +
    +
    +

    Ranges

    +
      +
    • By name

    • +
    +
    sheet = app.active_sheet
    +rango = sheet['B2:D5']
    +app.msgbox(rango.name)
    +
    +
    +
      +
    • By position [start_row:end_row, start_column:end_column]

    • +
    +
    rango = sheet[1:5,1:4]
    +app.msgbox(rango.name)
    +
    +
    +
      +
    • Group ranges

    • +
    +
    doc = app.active
    +sheet = doc.active
    +last = doc[-1]
    +with doc.ranges as r:
    +    # Add one range
    +    r.add(sheet['A1:B2'])
    +    r2 = sheet['C4:D5']
    +    r3 = last['E7:D8']
    +    r4 = last['E10:F12']
    +    # Add multiple ranges
    +    r.add((r2, r3, r4))
    +    app.debug(r.names)
    +
    +
    +
      +
    • Get the same range in all sheets

    • +
    +
    ranges = doc.get_ranges('A1:B1')
    +app.debug(ranges.names)
    +
    +
    +
      +
    • Get columns by name.

    • +
    +
    sheet = app.active_sheet
    +rango = sheet['B:B']
    +app.debug(rango.name)
    +
    +rango = sheet['D:F']
    +app.debug(rango.name)
    +
    +
    +
      +
    • Get columns by position.

    • +
    +
    sheet = app.active_sheet
    +# Column B
    +rango = sheet[0:,1]
    +app.debug(rango.name)
    +
    +# Columnas D:F
    +rango = sheet[0:,3:6]
    +app.debug(rango.name)
    +
    +
    +
      +
    • Get rows

    • +
    +
    sheet = app.active_sheet
    +# One row
    +row = sheet[1]
    +app.debug(row.name)
    +
    +# Range rows
    +row = sheet[3:10,0:]
    +app.debug(row.name)
    +
    +
    +
    +
    +

    Info ranges

    +
      +
    • Get absolute name

    • +
    +
    sheet = app.active_sheet
    +rango = sheet['A1:E10']
    +app.msgbox(rango.name)
    +
    +
    +
      +
    • Get address

    • +
    +
    sheet = app.active_sheet
    +rango = sheet['A1']
    +a = rango.address
    +data = f"""Cell Address
    +Row: {a.Row}
    +Column: {a.Column}
    +"""
    +app.msgbox(data)
    +
    +rango = sheet['A1:E10']
    +ra = rango.range_address
    +data = (
    +    f'Range Address:\n\n'
    +    f'Star Row: {ra.StartRow}\n'
    +    f'End Row: {ra.EndRow}\n'
    +    f'Star Column: {ra.StartColumn}\n'
    +    f'End Column: {ra.EndColumn}\n'
    +)
    +app.msgbox(data)
    +
    +
    +
    +
    +

    Special ranges

    +
      +
    • Get used area

    • +
    +
    sheet = app.active_sheet
    +rango = sheet.used_area
    +app.msgbox(rango.name)
    +
    +
    +
      +
    • Get current region

    • +
    +
    rango = sheet['A1'].current_region
    +app.msgbox(rango.name)
    +
    +
    +
      +
    • Get next free cell

    • +
    +
    cell = sheet['A1'].next_cell
    +app.msgbox(cell.name)
    +
    +
    +
      +
    • Get merged area

    • +
    +
    sheet = app.active_sheet
    +rango = sheet['A1'].merged_area
    +app.msgbox(rango.name)
    +
    +
    +
      +
    • Get visible cells

    • +
    +
    sheet = app.active_sheet
    +rangos = sheet['A1:E10'].visible
    +for r in rangos:
    +    app.debug(r.name)
    +
    +
    +
      +
    • Get empty cells

    • +
    +
    sheet = app.active_sheet
    +rangos = sheet['A1:E10'].empty
    +for r in rangos:
    +    app.debug(r.name)
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/doc/build/main/calc_ranges2.html b/doc/build/main/calc_ranges2.html new file mode 100644 index 0000000..9185117 --- /dev/null +++ b/doc/build/main/calc_ranges2.html @@ -0,0 +1,242 @@ + + + + + + + + + Manipulate ranges — ZAZ documentation + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    + +
    +

    Manipulate ranges

    +

    Not, not is necesary select range for manipulate

    +
    +

    Select

    +
      +
    • Select from doc

    • +
    +
    doc = app.active
    +sheet = app.active_sheet
    +
    +cell = sheet['A1']
    +doc.select(cell)
    +
    +
    +
      +
    • Select in self range

    • +
    +
    sheet = app.active_sheet
    +rango = sheet['A1:C5']
    +rango.select()
    +
    +
    +
    +
    +

    Move

    +
    sheet = app.active_sheet
    +rango = sheet['A1:C5']
    +rango.move(sheet['E6'])
    +
    +
    +
      +
    • Move to other sheet

    • +
    +
    rango.move(doc[-1]['E6'])
    +
    +
    +
    +
    +

    Insert

    +
      +
    • Default insert down

    • +
    +
    sheet = app.active_sheet
    +rango = sheet['A1:C1']
    +rango.insert()
    +
    +
    +
      +
    • Insert and move right

    • +
    +
    rango.insert(app.CellInsertMode.RIGHT)
    +
    +
    +
      +
    • Insert entire rows

    • +
    +
    rango.insert(app.CellInsertMode.ROWS)
    +
    +
    +
      +
    • Insert entire columns

    • +
    +
    rango.insert(app.CellInsertMode.COLUMNS)
    +
    +
    +
    +
    +

    Delete

    +
      +
    • Default move up

    • +
    +
    sheet = app.active_sheet
    +rango = sheet['A1:C1']
    +rango.delete()
    +
    +
    +
      +
    • Delete and move left

    • +
    +
    rango.delete(app.CellDeleteMode.LEFT)
    +
    +
    +
      +
    • Delete entire rows

    • +
    +
    rango.delete(app.CellDeleteMode.ROWS)
    +
    +
    +
      +
    • Delete entire columns

    • +
    +
    rango.delete(app.CellDeleteMode.COLUMNS)
    +
    +
    +
    +
    +

    Copy

    +
      +
    • Using native method copyRange, current range always should be a cell and source should be a range.

    • +
    +
    sheet = app.active_sheet
    +cell = sheet['A5']
    +source = sheet['D1:E4']
    +cell.copy_from(source)
    +
    +
    +
      +
    • From range to cell

    • +
    +
    sheet = app.active_sheet
    +rango = sheet['A1:C5']
    +target = sheet['E1']
    +rango.copy_to(target)
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/doc/build/main/calc_sheets.html b/doc/build/main/calc_sheets.html new file mode 100644 index 0000000..e48c4fc --- /dev/null +++ b/doc/build/main/calc_sheets.html @@ -0,0 +1,426 @@ + + + + + + + + + Sheets — ZAZ documentation + + + + + + + + + + + + + + + + + + + +
    +
    +
    + + +
    + +
    +

    Sheets

    +
    +

    Active sheet

    +
    sheet = app.active_sheet
    +app.msgbox(sheet.name)
    +
    +# or
    +doc = app.active
    +sheet = doc.active
    +
    +
    +
    +
    +

    Get by index

    +
    doc = app.active
    +sheet = doc[0]
    +app.msgbox(sheet.name)
    +
    +
    +
    +
    +

    Get by name

    +
    doc = app.active
    +sheet = doc['Sheet1']
    +app.msgbox(sheet.name)
    +
    +
    +
    +
    +

    Contains

    +
    doc = app.active
    +app.msgbox('Sheet1' in doc)
    +
    +
    +
    +
    +

    Get tuple with all names

    +
    doc = app.active
    +app.msgbox(doc.names)
    +
    +
    +
    +
    +

    Count

    +
    doc = app.active
    +app.msgbox(len(doc))
    +
    +
    +
    +
    +

    New

    +
      +
    • Always validate if new name not exists.

    • +
    +
    doc = app.active
    +
    +sheet = doc.new_sheet()
    +# CAUTION: If 'NewSheet' exists, reset it to clean sheet.
    +doc['NewSheet'] = sheet
    +
    +# ~ or
    +
    +sheet = doc.insert('NewSheet2')
    +
    +
    +
      +
    • Insert multiple, get last insert.

    • +
    +
    names = ('One', 'Two', 'Three')
    +sheet = doc.insert(names)
    +
    +
    +
    +
    +

    Move

    +
      +
    • Move by object to last position.

    • +
    +
    sheet = doc[0]
    +doc.move(sheet)
    +
    +
    +
      +
    • Move by name to last position.

    • +
    +
    doc.move('Sheet1')
    +
    +
    +
      +
    • Move to position.

    • +
    +
    sheet = doc[0]
    +doc.move(sheet, 2)
    +
    +
    +
      +
    • Move from sheet

    • +
    +
    sheet = app.active_sheet
    +sheet.move()
    +
    +
    +
      +
    • Move to position.

    • +
    +
    sheet = app.active_sheet
    +sheet.move(2)
    +
    +
    +
    +
    +

    Remove

    +
      +
    • Remove by object.

    • +
    +
    sheet = doc[0]
    +doc.remove(sheet)
    +
    +
    +
      +
    • Remove by name.

    • +
    +
    doc.remove('One')
    +
    +
    +
      +
    • Remove from sheet.

    • +
    +
    sheet = app.active_sheet
    +sheet.remove()
    +
    +
    +
    +
    +

    Copy

    +
      +
    • Copy inside the same spreadsheet.

    • +
    • By object

    • +
    +
    sheet = doc[0]
    +doc.copy(sheet, 'OtherSheet')
    +
    +
    +
      +
    • By name

    • +
    +
    doc.copy('Sheet1', 'Sheet2')
    +
    +
    +
      +
    • From sheet

    • +
    +
    sheet = app.active_sheet
    +sheet.copy(sheet.name + '_2')
    +
    +
    +
    +
    +

    Copy from

    +
      +
    • Copy sheet from one spreadsheet to other.

    • +
    +
    doc = app.active
    +doc_source = app.docs['Contacts.ods']
    +name_source = 'Names'
    +name_target = 'Names'
    +position = 0
    +doc.copy_from(doc_source, name_source, name_target, position)
    +
    +
    +
    +
    +

    Copy to

    +
      +
    • Copy from sheet with the same name

    • +
    +
    doc = app.docs.new()
    +sheet = app.active_sheet
    +sheet.copy_to(doc)
    +
    +
    +
      +
    • Used new name

    • +
    +
    doc = app.docs.new()
    +sheet = app.active_sheet
    +sheet.copy_to(doc, 'NewName')
    +
    +
    +
    +
    +

    Sort

    +
      +
    • Sort sheets by names.

    • +
    +
    doc = app.active
    +doc.sort()
    +
    +
    +
    +
    +

    Name

    +
      +
    • Name visible by the user.

    • +
    +
    sheet = app.active_sheet
    +app.msgbox(sheet.name)
    +sheet.name = 'NewName'
    +app.msgbox(sheet.name)
    +
    +
    +
    +
    +

    Code name

    +
      +
    • Name only accessible by code.

    • +
    +
    sheet = app.active_sheet
    +app.msgbox(sheet.code_name)
    +sheet.code_name = 'my_name'
    +app.msgbox(sheet.code_name)
    +
    +
    +
    +
    +

    Visible

    +
      +
    • Apply only with spreadsheet with two or more sheets.

    • +
    +
    sheet = app.active_sheet
    +app.msgbox(sheet.visible)
    +sheet.visible = not sheet.visible
    +app.msgbox(sheet.visible)
    +sheet.visible = not sheet.visible
    +
    +
    +
    +
    +

    Is protected

    +
      +
    • If sheet is protected with password.

    • +
    +
    sheet = app.active_sheet
    +app.msgbox(sheet.is_protected)
    +
    +
    +
    +
    +

    Set password

    +
    sheet = app.active_sheet
    +sheet.password = 'letmein'
    +app.msgbox(sheet.is_protected)
    +
    +
    +
    +
    +

    Remove password

    +
    sheet = app.active_sheet
    +sheet.password = 'letmein'
    +app.msgbox(sheet.is_protected)
    +
    +sheet.unprotect('letmein')
    +app.msgbox(sheet.is_protected)
    +
    +
    +
    +
    +

    Tab color

    +
    sheet = app.active_sheet
    +app.msgbox(sheet.color)
    +
    +sheet.color = 'red'
    +app.msgbox(sheet.color)
    +
    +# RGB
    +sheet.color = (125, 200, 10)
    +app.msgbox(sheet.color)
    +
    +
    +
    +
    +

    Document parent

    +
    doc = sheet.doc
    +
    +
    +
    +
    +

    Activate

    +
    doc = app.active
    +# Get last sheet
    +sheet = doc[-1]
    +
    +# Activate from doc
    +doc.activate(sheet)
    +
    +# Activate from sheet
    +sheet.activate()
    +
    +
    +
    +
    + + +
    + +
    +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/doc/build/main/easymacro.html b/doc/build/main/easymacro.html index e7d231d..773c409 100644 --- a/doc/build/main/easymacro.html +++ b/doc/build/main/easymacro.html @@ -140,10 +140,11 @@
  • Calc
  • Writer
      diff --git a/doc/build/objects.inv b/doc/build/objects.inv index ffdefbfb9c16506eed90664ab10562956aff051b..6bef283eb6592d008f5838ea7fef0494cc456d39 100644 GIT binary patch delta 464 zcmV;>0WbdY1Gxl{bALgO+#nD|_k9X-fJu~DW;aPEQlvy`X+|1pHmzz?Z6jf@FxIqp zxkj#+lLRPiaKM>OtEm6qZ&YAfR6=pQvC;BR5-up&-AC5O?)%R6l708(A=$WYyeV@$ zqil4K%xd=X@bc%^?~ysv)T6Rsg;wtlJqYyy22@)mA2! zX>offB?HA7HH(D%|3%zW#!paUm?T&%Q^pR_?(Bm!%6JTQ1hu+~wq!y(ZadVI$qo!* zoO@`DF2GeG_J4=C7%($S?O~1)?pKz$?-Kgem(hEJevp+BFG3{ZY73p+{o4h-Nbomp z%8R+$syB3_rj&GDS3~vQZq$UQOS~Gmf!BT9s|i24)j#;F5f;sU0O={>Ijku}C|fz@ z&|RJ$SMsSzLmR+$H z;|TXFbKI+lKKU|cFHkpfVb_BZiP+7dqg(4L=uL#5waNEA#ugVpbJLV`g)y*rj+vYA zbel2244l_-?|&xz(RF|Dvk{h?^#SOo5r@#@5TWeCm4iC`qg=^4nwHjpt@2X^6_I@i zfMVn%#&cP%WljYZsSjUHvd5D)N5+e;T&9vg;fWJT5OLDVYNi_*wxQX=>(cbw!NByJ n+lA!uote1*VEf)y?nRi