Add render data
This commit is contained in:
parent
a072c9bdc3
commit
bcce720783
|
@ -36,7 +36,7 @@ ID = 'org.myextension.test'
|
|||
|
||||
# ~ If you extension will be multilanguage set: True
|
||||
# ~ This feature used gettext, set pythonpath and easymacro in True
|
||||
# ~ Yu can used PoEdit for edit PO files and generate MO files.
|
||||
# ~ You can used PoEdit for edit PO files and generate MO files.
|
||||
# ~ https://poedit.net/
|
||||
USE_LOCALES = True
|
||||
DOMAIN = 'base'
|
||||
|
|
|
@ -446,8 +446,11 @@ def get_dispatch():
|
|||
return create_instance('com.sun.star.frame.DispatchHelper')
|
||||
|
||||
|
||||
def call_dispatch(url, args=()):
|
||||
frame = get_document().frame
|
||||
def call_dispatch(doc=None, url='', args=()):
|
||||
if doc is None:
|
||||
frame = get_document().frame
|
||||
else:
|
||||
frame = doc.frame
|
||||
dispatch = get_dispatch()
|
||||
dispatch.executeDispatch(frame, url, '', 0, args)
|
||||
return
|
||||
|
@ -987,7 +990,7 @@ class LOImage(object):
|
|||
return self.obj.Visible
|
||||
@visible.setter
|
||||
def visible(self, value):
|
||||
self_obj.Visible = value
|
||||
self.obj.Visible = value
|
||||
|
||||
def save(self, path):
|
||||
if is_dir(path):
|
||||
|
@ -1191,6 +1194,42 @@ class LOCalc(LODocument):
|
|||
c.rows_visible = False
|
||||
return
|
||||
|
||||
def _set_cell(self, k='', v=None, cell=None, value=False):
|
||||
if k:
|
||||
self._sd.setSearchString(k)
|
||||
ranges = self._search.findAll(self._sd)
|
||||
if ranges:
|
||||
ranges = ranges.getRangeAddressesAsString().split(';')
|
||||
for r in ranges:
|
||||
for c in r.split(','):
|
||||
cell = self._sheet.getCellRangeByName(c)
|
||||
if v is None:
|
||||
return cell
|
||||
if cell.getImplementationName() == 'ScCellObj':
|
||||
pattern = re.compile(k, re.IGNORECASE)
|
||||
nv = pattern.sub(v, cell.getString())
|
||||
if value:
|
||||
cell.setValue(nv)
|
||||
else:
|
||||
cell.setString(nv)
|
||||
return cell
|
||||
if cell:
|
||||
if cell.getImplementationName() == 'ScCellObj':
|
||||
ca = cell.getCellAddress()
|
||||
new_cell = self._sheet.getCellByPosition(ca.Column, ca.Row + 1)
|
||||
if value:
|
||||
new_cell.setValue(v)
|
||||
else:
|
||||
new_cell.setString(v)
|
||||
return new_cell
|
||||
|
||||
def render(self, data, sheet=0):
|
||||
self.set_search_in(sheet)
|
||||
|
||||
for k, v in data.items():
|
||||
self._render_cells(k, v)
|
||||
return
|
||||
|
||||
|
||||
class LOCalcSheets(object):
|
||||
|
||||
|
@ -1353,6 +1392,30 @@ class LOCalcSheet(object):
|
|||
print('add_listener')
|
||||
return
|
||||
|
||||
def get_range_by_address(self, address):
|
||||
row_s = address.StartRow
|
||||
row_e = address.EndRow + 1
|
||||
col_s = address.StartColumn
|
||||
col_e = address.EndColumn + 1
|
||||
return LOCellRange(self.obj[row_s:row_e,col_s:col_e], self.doc)
|
||||
|
||||
def render(self, data, rango=None, clean=False):
|
||||
if rango is None:
|
||||
ra = self.obj.getPrintAreas()[0]
|
||||
rango = self.get_range_by_address(ra)
|
||||
|
||||
rango.render(data, clean)
|
||||
return rango
|
||||
|
||||
def find(self, search_string, rango=None):
|
||||
if rango is None:
|
||||
ra = self.obj.getPrintAreas()[0]
|
||||
rango = self.get_range_by_address(ra)
|
||||
|
||||
cell = rango.find(search_string)
|
||||
|
||||
return cell
|
||||
|
||||
|
||||
class LOWriter(LODocument):
|
||||
|
||||
|
@ -1686,6 +1749,11 @@ class LODraw(LODrawImpress):
|
|||
def __init__(self, obj):
|
||||
super().__init__(obj)
|
||||
|
||||
@property
|
||||
def selection(self):
|
||||
sel = self.obj.getCurrentSelection()
|
||||
return sel
|
||||
|
||||
|
||||
class LOMath(LODocument):
|
||||
|
||||
|
@ -1724,6 +1792,7 @@ class LOCellRange(object):
|
|||
return item.in_range(self)
|
||||
|
||||
def _init_values(self):
|
||||
self._sd = None
|
||||
self._type_obj = self.obj.ImplementationName
|
||||
self._type_content = EMPTY
|
||||
|
||||
|
@ -1880,7 +1949,7 @@ class LOCellRange(object):
|
|||
copy()
|
||||
self.clear(1023)
|
||||
self[0,0].select()
|
||||
call_dispatch('.uno:InsertContents', args)
|
||||
call_dispatch(self._doc, '.uno:InsertContents', args)
|
||||
set_clipboard('')
|
||||
return
|
||||
|
||||
|
@ -1951,6 +2020,12 @@ class LOCellRange(object):
|
|||
cursor.collapseToCurrentRegion()
|
||||
return LOCellRange(self.sheet[cursor.AbsoluteName].obj, self.doc)
|
||||
|
||||
@property
|
||||
def merged_area(self):
|
||||
cursor = self.sheet.get_cursor(self.obj[0,0])
|
||||
cursor.collapseToMergedArea()
|
||||
return LOCellRange(self.sheet[cursor.AbsoluteName].obj, self.doc)
|
||||
|
||||
@property
|
||||
def visible(self):
|
||||
cursor = self.sheet.get_cursor(self.obj)
|
||||
|
@ -1992,13 +2067,15 @@ class LOCellRange(object):
|
|||
|
||||
def insert_image(self, path, **kwargs):
|
||||
s = self.obj.Size
|
||||
w = kwargs.get('width', s.Width)
|
||||
w = kwargs.get('Width', s.Width)
|
||||
h = kwargs.get('Height', s.Height)
|
||||
data = kwargs.get('Data', '')
|
||||
img = self.doc.create_instance('com.sun.star.drawing.GraphicObjectShape')
|
||||
img.GraphicURL = _path_url(path)
|
||||
# ~ img.ResizeWithCell = True
|
||||
self.draw_page.add(img)
|
||||
img.Anchor = self.obj
|
||||
img.setSize(Size(w, h))
|
||||
img.Anchor = self.obj
|
||||
return
|
||||
|
||||
def insert_shape(self, tipo, **kwargs):
|
||||
|
@ -2127,6 +2204,132 @@ class LOCellRange(object):
|
|||
setattr(current, k, v)
|
||||
self.obj.Validation = current
|
||||
|
||||
def _set_new_value(self, cell, search, value):
|
||||
if not cell.ImplementationName == 'ScCellObj':
|
||||
return
|
||||
|
||||
if isinstance(value, str):
|
||||
pattern = re.compile(search, re.IGNORECASE)
|
||||
new_value = pattern.sub(value, cell.String)
|
||||
cell.String = new_value
|
||||
else:
|
||||
cell.Value = value
|
||||
return
|
||||
|
||||
def rows_insert(self, count=0):
|
||||
if not count:
|
||||
count = self.rows
|
||||
self.obj.Rows.insertByIndex(0, count)
|
||||
return
|
||||
|
||||
def rows_merge(self):
|
||||
for r in range(self.rows):
|
||||
self[r].obj.merge(True)
|
||||
return
|
||||
|
||||
def copy_format_from(self, rango):
|
||||
rango.select()
|
||||
copy(self._doc)
|
||||
self.select()
|
||||
args = {
|
||||
'Flags': 'T',
|
||||
'MoveMode': 4,
|
||||
}
|
||||
args = dict_to_property(args)
|
||||
url = '.uno:InsertContents'
|
||||
call_dispatch(self._doc, url, args)
|
||||
return
|
||||
|
||||
def _render_list(self, key, values):
|
||||
rango = None
|
||||
total_rows = len(values)
|
||||
try:
|
||||
rango = self.sheet[key]
|
||||
if total_rows > 1:
|
||||
cells = rango[0,0].offset(1).to_size(total_rows - 1, 1)
|
||||
name = cells.name
|
||||
cells.rows_insert()
|
||||
cells = self.sheet[name]
|
||||
cells.copy_format_from(rango)
|
||||
except Exception as e:
|
||||
print(key, e)
|
||||
|
||||
if rango is None:
|
||||
pass
|
||||
else:
|
||||
headers = list(rango.data[0])
|
||||
positions = {}
|
||||
for i, v in enumerate(headers):
|
||||
if not v:
|
||||
continue
|
||||
k = v[1:-1]
|
||||
if k in values[0]:
|
||||
positions[k] = i
|
||||
|
||||
data = []
|
||||
for row in values:
|
||||
new_row = headers[:]
|
||||
for k, v in positions.items():
|
||||
new_row[v] = row[k]
|
||||
data.append(new_row)
|
||||
|
||||
cell = rango[0,0]
|
||||
cell.copy_from(data)
|
||||
return
|
||||
|
||||
def _render_value(self, key, value, parent=''):
|
||||
if isinstance(value, dict):
|
||||
for k, v in value.items():
|
||||
self._render_value(k, v, key)
|
||||
return
|
||||
elif isinstance(value, (list, tuple)):
|
||||
self._render_list(key, value)
|
||||
return
|
||||
|
||||
search = f'{{{key}}}'
|
||||
if parent:
|
||||
search = f'{{{parent}.{key}}}'
|
||||
ranges = self.find_all(search)
|
||||
|
||||
for cell in ranges or range(0):
|
||||
self._set_new_value(cell, search, value)
|
||||
return
|
||||
|
||||
def clean_render(self, template='\{(\w.+)\}'):
|
||||
self._sd.SearchRegularExpression = True
|
||||
self._sd.setSearchString(template)
|
||||
self.obj.replaceAll(self._sd)
|
||||
return
|
||||
|
||||
def find(self, search_string):
|
||||
if self._sd is None:
|
||||
self._sd = self.sheet.obj.createSearchDescriptor()
|
||||
self._sd.SearchCaseSensitive = False
|
||||
|
||||
self._sd.setSearchString(search_string)
|
||||
cell = self.obj.findFirst(self._sd)
|
||||
return LOCellRange(self.sheet[cell.AbsoluteName].obj, self.doc)
|
||||
|
||||
def find_all(self, search_string):
|
||||
if self._sd is None:
|
||||
self._sd = self.sheet.obj.createSearchDescriptor()
|
||||
self._sd.SearchCaseSensitive = False
|
||||
|
||||
self._sd.setSearchString(search_string)
|
||||
ranges = self.obj.findAll(self._sd)
|
||||
return ranges
|
||||
|
||||
def render(self, data, clean=False):
|
||||
self._sd = self.sheet.obj.createSearchDescriptor()
|
||||
self._sd.SearchCaseSensitive = False
|
||||
|
||||
for k, v in data.items():
|
||||
self._render_value(k, v)
|
||||
|
||||
if clean:
|
||||
self.clean_render()
|
||||
return
|
||||
|
||||
|
||||
class EventsListenerBase(unohelper.Base, XEventListener):
|
||||
|
||||
|
@ -4751,8 +4954,13 @@ def set_clipboard(value):
|
|||
|
||||
|
||||
# ~ Export ok
|
||||
def copy():
|
||||
call_dispatch('.uno:Copy')
|
||||
def copy(doc):
|
||||
call_dispatch(doc, '.uno:Copy')
|
||||
return
|
||||
|
||||
|
||||
def paste(doc):
|
||||
call_dispatch(doc, '.uno:Paste')
|
||||
return
|
||||
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -615,7 +615,8 @@ def _get_info_path(path):
|
|||
|
||||
def _zip_embed(source, files):
|
||||
PATH = 'Scripts/python/'
|
||||
EASYMACRO = 'easymacro.'
|
||||
EASYMACRO = 'easymacro.py'
|
||||
FILE_ZIP = 'easymacro.zip'
|
||||
|
||||
p, f, name, e = _get_info_path(source)
|
||||
now = datetime.now().strftime('_%Y%m%d_%H%M%S')
|
||||
|
@ -623,12 +624,12 @@ def _zip_embed(source, files):
|
|||
copyfile(source, path_source)
|
||||
target = source
|
||||
|
||||
with zipfile.PyZipFile(EASYMACRO + 'zip', mode='w') as zf:
|
||||
zf.writepy(EASYMACRO + 'py')
|
||||
with zipfile.ZipFile(FILE_ZIP, mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
|
||||
zf.write(EASYMACRO)
|
||||
|
||||
xml = LiboXML()
|
||||
|
||||
path_easymacro = PATH + EASYMACRO + 'zip'
|
||||
path_easymacro = PATH + FILE_ZIP
|
||||
names = [f[1] for f in files] + [path_easymacro]
|
||||
nodes = []
|
||||
with zipfile.ZipFile(target, 'w', compression=zipfile.ZIP_DEFLATED) as zt:
|
||||
|
@ -647,14 +648,14 @@ def _zip_embed(source, files):
|
|||
data.append(name)
|
||||
zt.write(path, name)
|
||||
|
||||
zt.write(EASYMACRO + 'zip', path_easymacro)
|
||||
zt.write(FILE_ZIP, path_easymacro)
|
||||
data.append(path_easymacro)
|
||||
|
||||
xml.parse_manifest(xml_manifest)
|
||||
xml_manifest = xml.add_data_manifest(data)
|
||||
zt.writestr(path_manifest, xml_manifest)
|
||||
|
||||
os.unlink(EASYMACRO + 'zip')
|
||||
os.unlink(FILE_ZIP)
|
||||
return
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue