PyExcelerate - Accelerated Excel XLSX Writing Library for Python 2/3

Overview

PyExcelerate

Accelerated Excel XLSX writing library for Python

master: build-status-master dev: build-status-dev test coverage: coverage-status

Description

PyExcelerate is a Python for writing Excel-compatible XLSX spreadsheet files, with an emphasis on speed.

Benchmarks

Benchmark code located in pyexcelerate/tests/benchmark.py
Ubuntu 12.04 LTS, Core i5-3450, 8GB DDR3, Python 2.7.3

|          TEST_NAME          | NUM_ROWS | NUM_COLS | TIME_IN_SECONDS |
|-----------------------------|----------|----------|-----------------|
| pyexcelerate value fastest  |     1000 |      100 |            0.47 |
| pyexcelerate value faster   |     1000 |      100 |            0.51 |
| pyexcelerate value fast     |     1000 |      100 |            1.53 |
| xlsxwriter value            |     1000 |      100 |            0.84 |
| openpyxl                    |     1000 |      100 |            2.74 |
| pyexcelerate style cheating |     1000 |      100 |            1.23 |
| pyexcelerate style fastest  |     1000 |      100 |            2.40 |
| pyexcelerate style faster   |     1000 |      100 |            2.75 |
| pyexcelerate style fast     |     1000 |      100 |            6.15 |
| xlsxwriter style cheating   |     1000 |      100 |            1.21 |
| xlsxwriter style            |     1000 |      100 |            4.85 |
| openpyxl                    |     1000 |      100 |            6.32 |

* cheating refers to pregeneration of styles

Installation

PyExcelerate is supported on Python 2.7, 3.4, 3.5, 3.6, 3.7, and 3.8.

pip install pyexcelerate

Usage

Writing bulk data

Fastest

from pyexcelerate import Workbook

data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # data is a 2D array

wb = Workbook()
wb.new_sheet("sheet name", data=data)
wb.save("output.xlsx")

Writing bulk data to a range

PyExcelerate also permits you to write data to ranges directly, which is faster than writing cell-by-cell. If writing a Pandas DataFrame, see the note on compatibility.

Fastest

from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("test", data=[[1, 2], [3, 4]])
wb.save("output.xlsx")

Fast

from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("test")
ws.range("B2", "C3").value = [[1, 2], [3, 4]]
wb.save("output.xlsx")

Writing cell data

Faster

from datetime import datetime
from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.set_cell_value(1, 1, 15) # a number
ws.set_cell_value(1, 2, 20)
ws.set_cell_value(1, 3, "=SUM(A1,B1)") # a formula
ws.set_cell_value(1, 4, datetime.now()) # a date
wb.save("output.xlsx")

Fast

from datetime import datetime
from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws[1][1].value = 15 # a number
ws[1][2].value = 20
ws[1][3].value = "=SUM(A1,B1)" # a formula
ws[1][4].value = datetime.now() # a date
wb.save("output.xlsx")

Selecting cells by name

from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.cell("A1").value = 12
wb.save("output.xlsx")

Merging cells

from pyexcelerate import Workbook

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws[1][1].value = 15
ws.range("A1", "B1").merge()
wb.save("output.xlsx")

Styling cells

Styling cells causes non-negligible overhead. It will increase your execution time (up to 10x longer if done improperly!). Only style cells if absolutely necessary.

Fastest

from pyexcelerate import Workbook, Color, Style, Font, Fill, Format
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.set_cell_value(1, 1, 1)
ws.set_cell_style(1, 1, Style(font=Font(bold=True)))
ws.set_cell_style(1, 1, Style(font=Font(italic=True)))
ws.set_cell_style(1, 1, Style(font=Font(underline=True)))
ws.set_cell_style(1, 1, Style(font=Font(strikethrough=True)))
ws.set_cell_style(1, 1, Style(fill=Fill(background=Color(255,0,0,0))))
ws.set_cell_value(1, 2, datetime.now())
ws.set_cell_style(1, 1, Style(format=Format('mm/dd/yy')))
wb.save("output.xlsx")

Note that in this example, subsequent calls to set_cell_style() override the previous styles and they are not merged in. To have a combined style, create a single Style object with multiple properties, for example

ws.set_cell_style(1, 1, Style(font=Font(bold=True), format=Format('mm/dd/yy')))

Faster

from pyexcelerate import Workbook, Color
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.set_cell_value(1, 1, 1)
ws.get_cell_style(1, 1).font.bold = True
ws.get_cell_style(1, 1).font.italic = True
ws.get_cell_style(1, 1).font.underline = True
ws.get_cell_style(1, 1).font.strikethrough = True
ws.get_cell_style(1, 1).fill.background = Color(0, 255, 0, 0)
ws.set_cell_value(1, 2, datetime.now())
ws.get_cell_style(1, 1).format.format = 'mm/dd/yy'
wb.save("output.xlsx")

Fast

from pyexcelerate import Workbook, Color
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws[1][1].value = 1
ws[1][1].style.font.bold = True
ws[1][1].style.font.italic = True
ws[1][1].style.font.underline = True
ws[1][1].style.font.strikethrough = True
ws[1][1].style.fill.background = Color(0, 255, 0, 0)
ws[1][2].value = datetime.now()
ws[1][2].style.format.format = 'mm/dd/yy'
wb.save("output.xlsx")

Note that .style.format.format's repetition is due to planned support for conditional formatting and other related features. The formatting syntax may be improved in the future.

Styling ranges

from pyexcelerate import Workbook, Color
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("test")
ws.range("A1","C3").value = 1
ws.range("A1","C1").style.font.bold = True
ws.range("A2","C3").style.font.italic = True
ws.range("A3","C3").style.fill.background = Color(255, 0, 0, 0)
ws.range("C1","C3").style.font.strikethrough = True

Styling rows

A simpler (and faster) way to style an entire row.

Fastest

from pyexcelerate import Workbook, Color, Style, Fill
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.set_row_style(1, Style(fill=Fill(background=Color(255,0,0,0))))
wb.save("output.xlsx")

Faster

from pyexcelerate import Workbook, Color
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.get_row_style(1).fill.background = Color(255, 0, 0)
wb.save("output.xlsx")

Fast

from pyexcelerate import Workbook, Color
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws[1].style.fill.background = Color(255, 0, 0)
wb.save("output.xlsx")

Styling columns

Fastest

from pyexcelerate import Workbook, Color, Style, Fill
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.set_col_style(1, Style(fill=Fill(background=Color(255,0,0,0))))
wb.save("output.xlsx")

Available style attributes

Consistent with the implementation patterns above, the following style parameters are available:

ws[1][1].style.font.bold = True
ws[1][1].style.font.italic = True
ws[1][1].style.font.underline = True
ws[1][1].style.font.strikethrough = True
ws[1][1].style.font.color = Color(255, 0, 255)
ws[1][1].style.fill.background = Color(0, 255, 0)
ws[1][1].style.alignment.vertical = 'top'
ws[1][1].style.alignment.horizontal = 'right'
ws[1][1].style.alignment.rotation = 90
ws[1][1].style.alignment.wrap_text = True
ws[1][1].style.borders.top.color = Color(255, 0, 0)
ws[1][1].style.borders.right.style = '-.'

Each attribute also has constructors for implementing via set_cell_style().

The following border styles are available: .-, ..-, --, .., =, ., medium -., medium -.., medium --, /-., _

Setting row heights and column widths

Row heights and column widths are set using the size attribute in Style. Appropriate values are:

  • -1 for auto-fit
  • 0 for hidden
  • Any other value for the appropriate size.

For example, to hide column B:

from pyexcelerate import Workbook, Color, Style, Fill
from datetime import datetime

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws.set_col_style(2, Style(size=0))
wb.save("output.xlsx")

Linked styles

PyExcelerate supports using style objects instead manually setting each attribute as well. This permits you to modify the style at a later time.

from pyexcelerate import Workbook, Font

wb = Workbook()
ws = wb.new_sheet("sheet name")
ws[1][1].value = 1
font = Font(bold=True, italic=True, underline=True, strikethrough=True)
ws[1][1].style.font = font
wb.save("output.xlsx")

Pandas DataFrames

PyExcelerate does not support directly passing a Pandas DataFrame as the data argument to a new worksheet. If the sheet does not require having the headers rendered, the most efficient solution is:

ws = wb.new_sheet("sheet name", data=df.values.tolist())

Note that the conversion .tolist() is faster as PyExcelerate has some optimizations surrounding data that's provided in lists. If the sheet needs to have headers rendered, consider asking the Pandas maintainers to integrate PyExcelerate, use a transformation function, or convert your DataFrame to a list with the headers included.

Packaging with PyInstaller

PyInstaller is the only packager officially supported by PyExcelerate. Copy hook-pyexcelerate.Writer.py to your PyInstaller hooks directory.

Support

Please use the GitHub Issue Tracker and pull request system to report bugs/issues and submit improvements/changes, respectively. Pull requests must be based against the dev branch - if not, we will reject the PR and ask you to rebase against the correct branch. All nontrivial changes to code should be accompanied by a test when appropriate. We use the Nose testing framework.

Comments
  • Strange behaviour of created xlsx

    Strange behaviour of created xlsx

    Hello, I use the following code to create a simple xlsx:

    import pyexcelerate wb = pyexcelerate.Workbook() wb.new_sheet('sheet1', data=[['col11','col12','col13'],[1,2,3]]) wb.new_sheet('sheet2', data=[['col21','col22','col23'],['a','b','c']]) wb.save('bug.xlsx')

    If I open the document and I change the data in the first sheet, the same cell is modified in the second sheet. This happens only if the change of the value is the first thing I do. If I change sheet before the change, Excel works properly.

    opened by acGitUser 11
  • Error opening generated file with openpyxl

    Error opening generated file with openpyxl

    I have this error:

    Traceback (most recent call last): File "xlsError.py", line 13, in wbr = openpyxl.reader.excel.load_workbook(filename=filename,use_iterators=True) File "D:\Software\WinPython-64bit-2.7.6.4\python-2.7.6.amd64\lib\site-packages\openpyxl\reader\excel.py", line 155, in load_workbook raise InvalidFileException(unicode(e)) openpyxl.exceptions.InvalidFileException: "There is no item named 'xl/styles.xml' in the archive"

    while running this simple code: import openpyxl

    from pyexcelerate import Workbook

    data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # data is a 2D array filename = "output.xlsx" sheetname = "test"

    wb = Workbook() wb.new_sheet(sheetname, data=data) wb.save(filename)

    wbr = openpyxl.reader.excel.load_workbook(filename=filename,use_iterators=True) mySheet = wbr.get_sheet_by_name(sheetname)

    opened by acGitUser 11
  • Some benchmark optimisations

    Some benchmark optimisations

    The ws[row][col] changes in the run_pyexcelerate_optimization formatting benchmark slow it down significantly. Probably due to the fact that it is creating a Range object for each cell. Using the set_cell_value() method improves the performance.

    The majority of the rest of the slowdown could probably be avoided by using similar methods for setting the cell styles. (I see that there are some methods available but I didn't try them).

    Also, the run_xlsxwriter_optimization() benchmark is sub-optimal since it creates a format object each time through the inner loop. I've modified that benchmark to reflect how it would be done in practice by moving the format creation out of the loop.

    opened by jmcnamara 11
  • Broken 0.4.0 ?

    Broken 0.4.0 ?

    On a fresh Ubuntu 12.04 LTS (64bits), I do :

    $ sudo apt-get install ipython python-pip $ sudo pip install pyexcelerate Downloading/unpacking pyexcelerate Downloading PyExcelerate-0.4.0.tar.gz Running setup.py egg_info for package pyexcelerate Traceback (most recent call last): File "", line 14, in File "/home/vagrant/build/pyexcelerate/setup.py", line 4, in from pyexcelerate import version File "pyexcelerate/init.py", line 1, in from .Workbook import Workbook File "pyexcelerate/Workbook.py", line 2, in from .Writer import Writer File "pyexcelerate/Writer.py", line 7, in from jinja2 import Environment, FileSystemLoader ImportError: No module named jinja2 Complete output from command python setup.py egg_info: Traceback (most recent call last):

    File "", line 14, in

    File "/home/vagrant/build/pyexcelerate/setup.py", line 4, in

    from pyexcelerate import __version__
    

    File "pyexcelerate/init.py", line 1, in

    from .Workbook import Workbook
    

    File "pyexcelerate/Workbook.py", line 2, in

    from .Writer import Writer
    

    File "pyexcelerate/Writer.py", line 7, in

    from jinja2 import Environment, FileSystemLoader
    

    ImportError: No module named jinja2


    Command python setup.py egg_info failed with error code 1 Storing complete log in /home/vagrant/.pip/pip.log

    So I do : $ sudo pip install jinja2 $ sudo pip install pyexcelerate (went fine)

    Then, try it : $ ipython

    In [1]: from pyexcelerate import Workbook

    TemplateNotFound Traceback (most recent call last) /home/vagrant/ in () ----> 1 from pyexcelerate import Workbook

    /usr/local/lib/python2.7/dist-packages/pyexcelerate/init.py in () ----> 1 from .Workbook import Workbook 2 version = '0.4.0'

    /usr/local/lib/python2.7/dist-packages/pyexcelerate/Workbook.py in () 1 from . import Worksheet ----> 2 from .Writer import Writer 3 import time 4 5 class Workbook(object):

    /usr/local/lib/python2.7/dist-packages/pyexcelerate/Writer.py in () 8 from . import Color 9 ---> 10 class Writer(object): 11 if getattr(sys, 'frozen', None): 12 _basedir = getattr(sys, '_MEIPASS', sys.executable)

    /usr/local/lib/python2.7/dist-packages/pyexcelerate/Writer.py in Writer() 16 env = Environment(loader=FileSystemLoader(TEMPLATE_PATH), auto_reload=False) 17 ---> 18 _docProps_app_template = env.get_template("docProps/app.xml") 19 _docProps_core_template = env.get_template("docProps/core.xml") 20 _content_types_template = env.get_template("[Content_Types].xml")

    /usr/local/lib/python2.7/dist-packages/jinja2/environment.pyc in get_template(self, name, parent, globals) 789 if parent is not None: 790 name = self.join_path(name, parent) --> 791 return self._load_template(name, self.make_globals(globals)) 792 793 @internalcode

    /usr/local/lib/python2.7/dist-packages/jinja2/environment.pyc in _load_template(self, name, globals) 763 template.is_up_to_date): 764 return template --> 765 template = self.loader.load(self, name, globals) 766 if self.cache is not None: 767 self.cache[name] = template

    /usr/local/lib/python2.7/dist-packages/jinja2/loaders.pyc in load(self, environment, name, globals) 111 # first we try to get the source for this template together

    112         # with the filename and the uptodate function.
    

    --> 113 source, filename, uptodate = self.get_source(environment, name) 114 115 # try to load the code from the bytecode cache if there is a

    /usr/local/lib/python2.7/dist-packages/jinja2/loaders.pyc in get_source(self, environment, template) 176 return False 177 return contents, filename, uptodate --> 178 raise TemplateNotFound(template) 179 180 def list_templates(self):

    TemplateNotFound: docProps/app.xml

    In [2]:

    Thanx for your help !

    opened by odeckmyn 10
  • Add support for worksheet panes

    Add support for worksheet panes

    This allows splitting the view, into both frozen and unfrozen panes. I haven't tested this extensively yet.

    Any thoughts on the API?

    Example usage:

    # freeze the first row
    worksheet.panes = Panes(y=1)
    
    opened by AlexHill 9
  • Can' save excel

    Can' save excel

    Python : 3.7 OS : Windows 10 64 bit

    Below is my code:

     values = [data_df.columns] + list(data_df.values)
     wb = Workbook()
      wb.new_sheet('Sheet1', data=values)
      wb.save(module) ##throws error
    

    The last line of the code throws error :

    Exception has occurred: UnboundLocalError
    local variable 'z' referenced before assignment
    

    P.S : my dataframe has german characters.

    opened by anubhav1 8
  • Autosize for row and col not working

    Autosize for row and col not working

    Autosize for row and col not working.

    If I set autosize for row, I get count is not available for NoneType object (cell)

    If I set autosize for col, the column is hidden in the file

    opened by pkhetrapal 8
  • New Feature Request: Hyperlink support

    New Feature Request: Hyperlink support

    Is there hyperlink support present in PyExcelerate ? like in openpyxl : [https://openpyxl.readthedocs.io/en/latest/_modules/openpyxl/worksheet/hyperlink.html#Hyperlink] ?

    opened by dollardhingra 7
  • Unicode support

    Unicode support

    def get_col_xml_string(self, col):
        if col in self._col_styles and not self._col_styles[col].is_default:
            style = self._col_styles[col]
            if style.size == -1:
                size = 0
                for x, row in self._cells.items():
                    if col in row:
                        # size = max((len(str(row[col])) * 7 + 5) / 7, size)
                        size = max((len(str(row[col])) * 7 + 5) / 7, size)
    
    opened by DCastile 7
  • Formula not working

    Formula not working

    I'm trying to use HYPERLINK formula as follows -

    ws.set_cell_value(1, 1, '=HYPERLINK("www.someurl.com", "Click here")')

    But when I look at the underlying cell(1, 1) in excel file, it complains that formula is invalid. Actually pyexcelerate prepends an additional = sign, so above formula is translated to -

    ==HYPERLINK("www.someurl.com", "Click here")

    I also tried to use the formula without = sign as follows -

    ws.set_cell_value(1, 1, 'HYPERLINK("www.someurl.com", "Click here")')

    So in this is case excel client complains that that formula is invalid, it's because there is no = sign, so above formula is translated to -

    HYPERLINK("www.someurl.com", "Click here")

    valid formula must contain only one = sign in the cell, e.g.

    =HYPERLINK("www.someurl.com", "Click here") #This is valid

    opened by suyash248 6
  • Style hashes incomplete, causing loss of styles.

    Style hashes incomplete, causing loss of styles.

    Style hashes are incomplete, not accounting for quite a few style attributes. This prevents usage of many style cominations as they are thrown out during style alignment.

    opened by bazzisoft 6
  • DEPRECATION message: no .toml and wheel

    DEPRECATION message: no .toml and wheel

    DEPRECATION: MarkupSafe is being installed using the legacy 'setup.py install' method, because it does not have a 'pyproject.toml' and the 'wheel' package is not installed. pip 23.1 wil l enforce this behaviour change. A possible replacement is to enable the '--use-pep517' option. Discussion can be found at https://github.com/pypa/pip/issues/8559

    opened by leonkosak 0
  • Question about optimizing cell merge

    Question about optimizing cell merge

    Hi there, thanks for your great work! I got a large dataframe 30*10000 for example, and about 100 groups for each column to merge. Like

    for i in range(30):
            column = n2a(i+1)
            for j in range(100000 // 100 - 1):
                worksheet.range(f"{column}{j*100 + 1}", f"{column}{(j+1)*100}").merge()
    

    How can i speed up the merge function?

    opened by winterfell2021 2
  • Large dataframes containing strings generate invalid xlsx files

    Large dataframes containing strings generate invalid xlsx files

    For large dataframes containing strings with 500k rows and 60+ columns, pyexcelerate generates invalid .xlsx files that cannot be opened in Excel. Excel gives the error message: "We found a problem with some content in yourfile.xlsx. Do you want us to try to recover as much as we can?". Answering yes removes all invalid content, which yields an empty worksheet.

    from string import ascii_lowercase
    from pandas import DataFrame
    from pyexcelerate import Workbook
    from uuid import uuid4
    
    num_rows = 501000
    num_cols = 64
    
    # generate dataframe with column names
    column_names = [ f"Col{idx}" for idx in range(0, num_cols)]
    df = DataFrame(random.choice(list(ascii_lowercase), size=(num_rows, num_cols)), columns=column_names)
    
    # write to file
    output_filename = f"/tmp/{str(uuid4())}.xlsx"
    
    wb = Workbook()
    ws = wb.new_sheet("sheet name", data=df.values.tolist())
    wb.save(output_filename)
    

    The xlsx file is successfully written to disk, is 138Mb in size, but generates the above-mentionned error when being opened in Excel. Further inspection when opening the file in Python reveals that the Zip archive is invalid.

    Interestingly, the problem only occurs for large dataframes filled with strings. The problem does not occur:

    • For smaller dataframes
    • For dataframes of the same size filled only with integers

    Versions:

    • OS: macOS Catalina 10.15.7; Darwin Kernel Version 19.6.0
    • PyExcelerate==0.10.0
    • pandas==1.3.5
    opened by EdGaere 14
  • performance when serializing pandas DataFrames

    performance when serializing pandas DataFrames

    the function __get_cell_data (https://github.com/kz26/PyExcelerate/blob/dev/pyexcelerate/Worksheet.py#L227) operates on each cell individually. when serializing a pandas.DataFrame, most of the time, the columns are of a unique type (dtype) and could benefit from some "columnar" approach (instead of row by row, cell by cell approach) to speed up things:

    • the ´if´ statements could be evaluated only once per column
    • the conversion to string/xml could leverage some "apply / applymap" from pandas
    • ... have you already thought about ways to improve this by keeping the "columnar" info further down the pipe (vs transforming everything to cells) for DataFrames ? it is quite specific yet it is a case lot of pandas users are hitting (slowness in exporting to excel).
    opened by sdementen 11
  • When I use openpyxl to read the xlsx file generated by pyexcelerate, openpyxl prompts

    When I use openpyxl to read the xlsx file generated by pyexcelerate, openpyxl prompts "Workbook contains no default style"?

    I save the same file as another file with excel, and then it can be read with openpyxl, so I suspect that there is a problem with the pyexcelerate export file. How can I solve it?

    opened by TibbersGo 5
  • Replaced Part: /xl/worksheets/sheet1.xml part with XML error. A document must contain exactly one root element. Line 1, column 0.

    Replaced Part: /xl/worksheets/sheet1.xml part with XML error. A document must contain exactly one root element. Line 1, column 0.

    L_FB55 tmp

    Here is my code when using PyExcelerate

    from pyexcelerate import Workbook
    def to_excel(df, path, sheet_name="Documents"):
        data = [
            df.columns.tolist(),
        ] + df.values.tolist()
        wb = Workbook()
        wb.new_sheet(sheet_name, data=data)
        wb.save(path)
    

    I can't debug the error because I do not see any value to search. Does anyone know how to fix this?

    opened by amzar96 6
Releases(0.7.3)
A suite of utilities for converting to and working with CSV, the king of tabular file formats.

csvkit is a suite of command-line tools for converting to and working with CSV, the king of tabular file formats. It is inspired by pdftk, GDAL and th

wireservice 5.2k Dec 31, 2022
PyExcelerate - Accelerated Excel XLSX Writing Library for Python 2/3

PyExcelerate Accelerated Excel XLSX writing library for Python master: dev: test coverage: Authors: Kevin Wang and Kevin Zhang Copyright 2015 Kevin Wa

448 Dec 28, 2022
xlwings is a BSD-licensed Python library that makes it easy to call Python from Excel and vice versa. It works with Microsoft Excel on Windows and macOS.

xlwings - Make Excel fly with Python! xlwings (Open Source) xlwings is a BSD-licensed Python library that makes it easy to call Python from Excel and

xlwings 2.5k Jan 06, 2023
Xiaobo Zhang 30 Jan 08, 2023
Single API for reading, manipulating and writing data in csv, ods, xls, xlsx and xlsm files

pyexcel - Let you focus on data, instead of file formats Support the project If your company has embedded pyexcel and its components into a revenue ge

1.1k Dec 29, 2022
Upload an Excel/CSV file ( < 200 MB) and produce a short summary of the data.

Data-Analysis-Report Deployed App 1. What is this app? Upload an excel/csv file and produce a summary report of the data. 2. Where to upload? How to p

Easwaran T H 0 Feb 26, 2022
ExcelPeek is a tool designed to help investigate potentially malicious Microsoft Excel files.

ExcelPeek is a tool designed to help investigate potentially malicious Microsoft Excel files.

James Slaughter 37 Apr 16, 2022
Create Open XML PowerPoint documents in Python

python-pptx is a Python library for creating and updating PowerPoint (.pptx) files. A typical use would be generating a customized PowerPoint presenta

Steve Canny 1.7k Jan 05, 2023
BoobSnail allows generating Excel 4.0 XLM macro.

BoobSnail allows generating Excel 4.0 XLM macro. Its purpose is to support the RedTeam and BlueTeam in XLM macro generation.

STM Cyber 232 Nov 21, 2022
ObjTables: Tools for creating and reusing high-quality spreadsheets

ObjTables: Tools for creating and reusing high-quality spreadsheets ObjTables is a toolkit which makes it easy to use spreadsheets (e.g., XLSX workboo

Karr whole-cell modeling lab 7 Jun 14, 2021
Universal Office Converter - Convert between any document format supported by LibreOffice/OpenOffice.

Automated conversion and styling using LibreOffice Universal Office Converter (unoconv) is a command line tool to convert any document format that Lib

2.4k Jan 03, 2023
A wrapper library to read, manipulate and write data in xlsx and xlsm format using openpyxl

pyexcel-xlsx - Let you focus on data, instead of xlsx format pyexcel-xlsx is a tiny wrapper library to read, manipulate and write data in xlsx and xls

110 Nov 16, 2022
Transpiler for Excel formula like language to Python. Support script and module mode

Transpiler for Excel formula like language to Python. Support script and module mode (formulas are functions).

Edward Villegas-Pulgarin 1 Dec 07, 2021
A set of Python scripts for finding threats in Office365

Py365 A collection of scripts for finding threats in Office365 Risky Rules A tool for finding risky or suspicious inbox rules - more detail in this po

Martin Rothe 49 May 18, 2022
Excel-report-evaluator - A simple Python GUI application to aid with bulk evaluation of Microsoft Excel reports.

Excel Report Evaluator Simple Python GUI with Tkinter for evaluating Microsoft Excel reports (.xlsx-Files). Usage Start main.py and choose one of the

Alexander H. 1 Dec 29, 2021
Reads Data from given Excel File and exports Single PDFs and a complete PDF grouped by Gateway

E-Shelter Excel2QR Reads Data from given Excel File and exports Single PDFs and a complete PDF grouped by Gateway Features Reads Excel 2021 Export Sin

Stefan Knaak 1 Nov 13, 2021
Please use openpyxl where you can...

xlrd xlrd is a library for reading data and formatting information from Excel files in the historical .xls format. Warning This library will no longer

2k Dec 29, 2022
A Python module for creating Excel XLSX files.

XlsxWriter XlsxWriter is a Python module for writing files in the Excel 2007+ XLSX file format. XlsxWriter can be used to write text, numbers, formula

John McNamara 3.1k Dec 29, 2022
PowerShell module to import/export Excel spreadsheets, without Excel

PowerShell + Excel = Better Together Automate Excel via PowerShell without having Excel installed. Runs on Windows, Linux and MAC. Creating Tables, Pi

Doug Finke 2k Dec 30, 2022
Python Module for Tabular Datasets in XLS, CSV, JSON, YAML, &c.

Tablib: format-agnostic tabular dataset library _____ ______ ___________ ______ __ /_______ ____ /_ ___ /___(_)___ /_ _ __/_ __ `/__ _

Jazzband 4.2k Dec 30, 2022