Re: how to convert VB scripts to Gnumeric python
- From: Dean McCarron <dean mercuryresearch com>
- To: Gnumeric Mailing List <gnumeric-list gnome org>
- Subject: Re: how to convert VB scripts to Gnumeric python
- Date: Thu, 12 Apr 2018 10:35:07 -0700
I agree, for a python user the Gnumeric interface feels pretty alien, 
some kind of wrapper library would be a godsend. The python interpreter 
plugin had elements of a basic API in it, though as noted it's not 
really usable. As your example shows you really don't need that much in 
order to do useful things.
With my application these ended up being the primitives functions used:
    - Open file
    - Save file (including saving new files )
    - Get workbook object (by workbook_get_by_index or via 
workbook_get_by_name)
    - Get sheet object (by index or sheet_by_name)
    - Get cell content (using sheet.cell_get(col, rol) and 
sheet.cell_fetch(col, row) )
    - Get cell content and style (using cell.get_rendered_text() and 
cell.get_style() )
    - Set cell content and style (using cell.set_text() and 
sheet.style_set_pos() ) - as noted setting style caused gnm_style_unref 
errors
    - Some odds and ends related to sheet styling (sheet.style_get(col, 
row).get_border(5).line_type and sheet.row_is_hidden(row) 
sheet.col_is_hidden(col) ) that was specific to my application
With those pretty much everything can be done in python to construct 
more advanced operations (like copying and pasting a block.) This is 
slight off-topic, but the python interpreter hack allowed me to add some 
functionality to menus to extend python, having a new plugin to do that 
would be very handy but obviously a side project. One of the features 
Excel had that I ended up having to emulate in Python was cut/paste 
visible cells only, for example.
I played around a lot with using the sheet view interface initially (as 
I was trying to copy VB macros), primarily to do cut and paste. In the 
end it wasn't as reliable as I liked and I decided you could implement 
copy and paste using the get/set cell primitives instead. I continue to 
have issues with style formatting, though, and multi-cell formatting 
(like text wrapped across cells) was difficult enough that I skipped 
coding for it.
I don't have notes as to why but I know I had to avoid using the get/set 
value for some reason, it may be as simple as not knowing to use the 
Gnm.Value.new_int() object like you did in your example. Most of my 
application involves extracting and reformating existing data in sheets 
to new workbooks, so it may have simply been my dealing with existing data.
I don't think it would be too hard to put together a basic example 
application akin to a hello_world that does something simple like open a 
workbook and place data from an RSS feed into it and save it out.
What would be the best venue to share the initial patches and code 
without clogging the list with very long messages? Github?
On 04/12/2018 06:00 AM, Morten Welinder wrote:
Some progress.  I have something like this working now:
    import gi
    gi.require_version('Gnm', '1.12')
    from gi.repository import Gnm
    Gnm.init()
    wb = Gnm.Workbook.new_with_sheets(1)
    sheet = wb.sheet_by_index(0)
    sheet.cell_set_value(0,0,Gnm.Value.new_int(10))
    sheet.cell_set_value(0,1,Gnm.Value.new_float(1.0/3.0))
    sheet.cell_set_text(0,2,"=A1+A2")
    wb.recalc()
    for i in range(3):
        print sheet.cell_get_value(0,i).peek_string()
It's not a great API.  In fact, in it shows clear signs of being a 
bit foreign to Python.
A gotcha: all versions of introspection until about 2 months ago 
misunderstood "char const *" as "char *" causing problems with 
functions like value_peek_string.  Such functions will need to have 
their return value marked "transfer none".  ("const char *" worked 
fine, on the other hand.)
M.
[
Date Prev][
Date Next]   [
Thread Prev][
Thread Next]   
[
Thread Index]
[
Date Index]
[
Author Index]