{"id":15405695,"url":"https://github.com/zverok/bloxl","last_synced_at":"2026-02-21T10:30:50.290Z","repository":{"id":36840484,"uuid":"41147403","full_name":"zverok/bloxl","owner":"zverok","description":"Hi-level Excel-2007 reports DSL","archived":false,"fork":false,"pushed_at":"2016-04-13T21:27:39.000Z","size":176,"stargazers_count":3,"open_issues_count":6,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-19T19:48:55.874Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zverok.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-08-21T09:23:35.000Z","updated_at":"2017-06-21T14:07:44.000Z","dependencies_parsed_at":"2022-09-09T21:01:17.320Z","dependency_job_id":null,"html_url":"https://github.com/zverok/bloxl","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/zverok/bloxl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zverok%2Fbloxl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zverok%2Fbloxl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zverok%2Fbloxl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zverok%2Fbloxl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zverok","download_url":"https://codeload.github.com/zverok/bloxl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zverok%2Fbloxl/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29679049,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T09:33:50.764Z","status":"ssl_error","status_checked_at":"2026-02-21T09:33:19.949Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-01T16:18:17.115Z","updated_at":"2026-02-21T10:30:50.273Z","avatar_url":"https://github.com/zverok.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"# BloXL\n\nBloXL is high-level DSL for creating full-featured XLSX (and, in future,\nother spreadsheet formats) reports with formatting, charts, formula and\nheck.\n\nBloXL is currently in the very early stage of development, consisting\njust of vision and some code, implementing first steps of this vision.\nLike this:\n\n\u003e The journey of a thousand miles begins with a single step. ― Lao Tzu\n\nBloXL is NOT some \"new XLSX writer from scratch\" -- it is hi-level wrapper\nof existing one ([axlsx](https://github.com/randym/axlsx) currently,\nthough [write_xlsx](https://github.com/cxn03651/write_xlsx/) considered\nas an option).\n\n## Why\n\nUnfortunately, spreadsheets (and, most oftenly, Excel spreadsheets) is\nstill the only option for rich, detailed and editable reports, especially\nfor business environment.\n\nThere are two very mature and full-featured libraries, targeting production\nof xlsx (mentioned above). Though, those libraries, tightly resembling XLSX\nAPI and structure, are rather like \"assembler\" when you are trying to create\nsome complex reports, with formulas, charts, conditional formatting and stuff.\n\nSo, BloXL tries to close this gap. In fact, it tries to make \"spreadsheet\noutput\" feature more like \"views\", modular and embeddable.\n\n## How\n\nSteps to achieve aforementioned goals:\n\n1. DSL for hierarchical description of spreadsheet data, like \"two areas,\n  first of which has column with labels and column with values; another\n  one is a table with header row, body and footer... and so on\" -- **done**;\n2. notions of \"stylesheets\", separation of content from style (somehow\n  already present in xlsx format, yet hard to use); cascading of styles --\n  **next target**;\n3. DSL for chart description, allowing to describe it as-easy-as-possible,\n  like \"line chart from this array\", working uniformly for data on sheets\n  and data in Ruby Arrays;\n4. DSL for expressions, converted to Excel formulae, for defining cell\n  dependencies and conditional formatting;\n5. Clean API for modular and reusable design of parts of a report.\n\n## What\n\nFor now, only step (1) from above list is ready. BloXL allows you to\nwrite code like this:\n\n```ruby\nMARKS = [\n  ['A', 'F', 'B+']\n  ['B+', 'C-', 'D+']\n  ['A-', 'A', 'B+']\n]\n\nBloXL.open('semester1.xlsx') do |b|\n  b.row ['Semester 1 marks']\n  b.row                                   # empty row\n      \n  b.stack{                                # place children under each other\n                                          #   (the same as default behavior, yet\n                                          #   also provides logical grouping of children)\n    b.row ['', 'Math', 'Phisics', 'Art']  # one-dimensional array horizontally\n    b.bar{                                # place children leftmost of each other\n      b.column ['Bob', 'Ann', 'Kate']     # one-dimensional array vertically\n      b.table MARKS                       # two-dimensional table\n    }\n  }\nend\n```\n\nResults in:\n\n\u003cimg src=\"https://raw.github.com/zverok/bloxl/master/examples/screenshots/01-simple.png\" alt=\"Simple table\"/\u003e\n\nYou may argue it is not seem THAT better than raw Axlsx code? Then look\nat _slightly_ more complex example:\n\n```ruby\nrequire 'bundler/setup'\n$:.unshift 'lib'\nrequire 'bloxl'\n\nMARKS1 = [\n  %w[A  F  B+],\n  %w[B+ C- D+],\n  %w[A- A  B+]\n]\n\nMARKS2 = [\n  %w[D+ B- A ],\n  %w[B+ A  C+],\n  %w[A- B  A-]\n]\n\nSTUDENTS = ['Bob', 'Ann', 'Kate']\nCLASSES = ['Math', 'Phisics', 'Art']\n\nBloXL.open('examples/output/2tables.xlsx') do |b|\n\n  b.bar{\n    b.stack{                                \n      b.cell 'Semester 1'\n      b.row                                   \n      b.row ['', *CLASSES]  \n      b.bar{                                \n        b.column STUDENTS\n        b.table MARKS1\n      }\n    }\n    b.column\n    b.stack{                                \n      b.cell 'Semester 2'\n      b.row                                   \n      b.row ['', *CLASSES]  \n      b.bar{                                \n        b.column STUDENTS\n        b.table MARKS2\n      }\n    }\n  }\nend\n```\n\nThis is like table from ex.1, just placed two times alongside each other:\n\n\u003cimg src=\"https://raw.github.com/zverok/bloxl/master/examples/screenshots/02-2tables.png\" alt=\"Simple table\"/\u003e\n\nAlso, this approach allows furthed advances in styling: each grouped area can\nbe styled separately with inplace style or \"style class\" (which are planned\nto be cascaded in CSS fashion).\n\nLook ahead!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzverok%2Fbloxl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzverok%2Fbloxl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzverok%2Fbloxl/lists"}