Ejemplo n.º 1
0
def ar2workbook(ar, column_names=None):
    from openpyxl import Workbook
    from openpyxl.styles import Font
    # local import to avoid the following traceback:
    # Error in sys.exitfunc:
    # Traceback (most recent call last):
    #   File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
    #     func(*targs, **kargs)
    #   File "/openpyxl/writer/write_only.py", line 38, in _openpyxl_shutdown
    #     for path in ALL_TEMP_FILES:
    # TypeError: 'NoneType' object is not iterable

    # workbook = Workbook(guess_types=True)

    # removed `guess_types=True` because it caused trouble in openpyxl
    # 3.4.0 and because I don't know whether it is needed.

    workbook = Workbook()
    sheet = workbook.active
    sheet.title = sheet_name(ar.get_title())

    bold_font = Font(
        name='Calibri',
        size=11,
        bold=True,
    )

    fields, headers, widths = ar.get_field_info(column_names)

    for c, column in enumerate(fields):
        sheet.cell(row=1, column=c + 1).value = str(headers[c])
        sheet.cell(row=1, column=c + 1).font = bold_font
        # sheet.col(c).width = min(256 * widths[c] / 7, 65535)
        # 256 == 1 character width, max width=65535

    for c, column in enumerate(fields):
        for r, row in enumerate(ar.data_iterator, start=1):
            sf = column.field._lino_atomizer
            value = sf.full_value_from_object(row, ar)
            if type(value) == bool:
                value = value and 1 or 0
            elif isinstance(value, (Duration, Choice)):
                value = str(value)
            elif E.iselement(value):
                value = E.to_rst(value)
                # dd.logger.info("20160716 %s", value)
            elif isinstance(value, Promise):
                value = str(value)
            elif isinstance(value, IncompleteDate):
                if value.is_complete():
                    value = value.as_date()
                else:
                    value = str(value)
            elif isinstance(value, Model):
                value = str(value)
            sheet.cell(row=r + 1, column=c + 1).value = value

    return workbook
Ejemplo n.º 2
0
def ar2workbook(ar, column_names=None):
    from openpyxl import Workbook
    from openpyxl.styles import Font

    # local import to avoid the following traceback:
    # Error in sys.exitfunc:
    # Traceback (most recent call last):
    #   File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
    #     func(*targs, **kargs)
    #   File "/openpyxl/writer/write_only.py", line 38, in _openpyxl_shutdown
    #     for path in ALL_TEMP_FILES:
    # TypeError: 'NoneType' object is not iterable

    # workbook = Workbook(guess_types=True)

    # removed `guess_types=True` because it caused trouble in openpyxl
    # 3.4.0 and because I don't know whether it is needed.

    workbook = Workbook()
    sheet = workbook.active
    sheet.title = sheet_name(ar.get_title())

    bold_font = Font(name="Calibri", size=11, bold=True)

    fields, headers, widths = ar.get_field_info(column_names)

    for c, column in enumerate(fields):
        sheet.cell(row=1, column=c + 1).value = str(headers[c])
        sheet.cell(row=1, column=c + 1).font = bold_font
        # sheet.col(c).width = min(256 * widths[c] / 7, 65535)
        # 256 == 1 character width, max width=65535

    for c, column in enumerate(fields):
        for r, row in enumerate(ar.data_iterator, start=1):
            sf = column.field._lino_atomizer
            value = sf.full_value_from_object(row, ar)
            if type(value) == bool:
                value = value and 1 or 0
            elif isinstance(value, (Duration, Choice)):
                value = str(value)
            elif E.iselement(value):
                value = E.to_rst(value)
                # dd.logger.info("20160716 %s", value)
            elif isinstance(value, Promise):
                value = str(value)
            elif isinstance(value, IncompleteDate):
                if value.is_complete():
                    value = value.as_date()
                else:
                    value = str(value)
            elif isinstance(value, Model):
                value = str(value)
            sheet.cell(row=r + 1, column=c + 1).value = value

    return workbook
Ejemplo n.º 3
0
    def table2story(self,
                    ar,
                    column_names=None,
                    header_level=None,
                    nosummary=False,
                    stripped=True,
                    **kwargs):
        """Render the given table request as reStructuredText to stdout.
        See :meth:`ar.show <lino.core.request.BaseRequest.show>`.
        """

        if ar.actor.master is not None and not nosummary:
            if ar.actor.slave_grid_format == 'summary':
                s = E.to_rst(ar.actor.get_slave_summary(
                    ar.master_instance, ar),
                             stripped=stripped)
                if stripped:
                    s = s.strip()
                return s

        fields, headers, widths = ar.get_field_info(column_names)

        sums = [fld.zero for fld in fields]
        rows = []
        recno = 0
        for row in ar.sliced_data_iterator:
            recno += 1
            rows.append([x for x in ar.row2text(fields, row, sums)])
        if len(rows) == 0:
            s = unicode(ar.no_data_text)
            if not stripped:
                s = "\n" + s + "\n"
            return s

        if not ar.actor.hide_sums:
            has_sum = False
            for i in sums:
                if i:
                    #~ print '20120914 zero?', repr(i)
                    has_sum = True
                    break
            if has_sum:
                rows.append([x for x in ar.sums2html(fields, sums)])

        t = RstTable(headers, **kwargs)
        s = t.to_rst(rows)
        if header_level is not None:
            h = rstgen.header(header_level, ar.get_title())
            if stripped:
                h = h.strip()
            s = h + "\n" + s
            # s = E.tostring(E.h2(ar.get_title())) + s
        return s
Ejemplo n.º 4
0
    def table2story(self, ar, column_names=None, header_level=None,
                    nosummary=False, stripped=True, **kwargs):
        """Render the given table request as reStructuredText to stdout.
        See :meth:`ar.show <lino.core.request.BaseRequest.show>`.
        """

        if ar.actor.master is not None and not nosummary:
            if ar.actor.slave_grid_format == 'summary':
                s = E.to_rst(
                    ar.actor.get_slave_summary(ar.master_instance, ar),
                    stripped=stripped)
                if stripped:
                    s = s.strip()
                return s

        fields, headers, widths = ar.get_field_info(column_names)

        sums = [fld.zero for fld in fields]
        rows = []
        recno = 0
        for row in ar.sliced_data_iterator:
            recno += 1
            rows.append([x for x in ar.row2text(fields, row, sums)])
        if len(rows) == 0:
            s = unicode(ar.no_data_text)
            if not stripped:
                s = "\n" + s + "\n"
            return s

        if not ar.actor.hide_sums:
            has_sum = False
            for i in sums:
                if i:
                    #~ print '20120914 zero?', repr(i)
                    has_sum = True
                    break
            if has_sum:
                rows.append([x for x in ar.sums2html(fields, sums)])

        t = RstTable(headers, **kwargs)
        s = t.to_rst(rows)
        if header_level is not None:
            h = rstgen.header(header_level, ar.get_title())
            if stripped:
                h = h.strip()
            s = h + "\n" + s
            # s = E.tostring(E.h2(ar.get_title())) + s
        return s
Ejemplo n.º 5
0
    def show_story(self, ar, story, stripped=True, **kwargs):
        """Render the given story as reStructuredText to stdout."""
        from lino.core.actors import Actor
        from lino.core.requests import ActionRequest

        for item in story:
            if E.iselement(item):
                print(E.to_rst(item, stripped))
            elif isinstance(item, type) and issubclass(item, Actor):
                ar = item.default_action.request(parent=ar)
                self.show_table(ar, stripped=stripped, **kwargs)
            elif isinstance(item, ActionRequest):
                self.show_table(item, stripped=stripped, **kwargs)
                # print(item.table2rst(*args, **kwargs))
            elif isiterable(item):
                self.show_story(ar, item, stripped, **kwargs)
                # for i in self.show_story(ar, item, *args, **kwargs):
                #     print(i)
            else:
                raise Exception("Cannot handle %r" % item)
Ejemplo n.º 6
0
    def show_story(self, ar, story, stripped=True, **kwargs):
        """Render the given story as reStructuredText to stdout."""
        from lino.core.actors import Actor
        from lino.core.requests import ActionRequest

        for item in story:
            if E.iselement(item):
                print(E.to_rst(item, stripped))
            elif isinstance(item, type) and issubclass(item, Actor):
                ar = item.default_action.request(parent=ar)
                self.show_table(ar, stripped=stripped, **kwargs)
            elif isinstance(item, ActionRequest):
                self.show_table(item, stripped=stripped, **kwargs)
                # print(item.table2rst(*args, **kwargs))
            elif isiterable(item):
                self.show_story(ar, item, stripped, **kwargs)
                # for i in self.show_story(ar, item, *args, **kwargs):
                #     print(i)
            else:
                raise Exception("Cannot handle %r" % item)