openpyxl merge requestshttps://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests2018-11-17T17:25:48Zhttps://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/293Removing absolute_import statements2018-11-17T17:25:48ZBitbucket ImporterRemoving absolute_import statements*Created originally on Bitbucket by [pythooonuser (Felix Siebeneicker)](https://bitbucket.org/%7Bba558ba0-bda6-46a5-9310-750083cde298%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Remove...*Created originally on Bitbucket by [pythooonuser (Felix Siebeneicker)](https://bitbucket.org/%7Bba558ba0-bda6-46a5-9310-750083cde298%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Removed absolute\_import future statements from /openpyxl
Test Output:
py36: commands succeeded
py37: commands succeeded
SKIPPED: pypy3: InterpreterNotFound: pypy3
py37-nolxml: commands succeeded
py37-lxml: commands succeeded
py37-keep\_vba: commands succeeded
nopillow: commands succeeded
xfail: commands succeeded
pandas: commands succeeded
numpy: commands succeeded
doc: commands succeeded
doctest: commands succeededhttps://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/292Adding myself to AUTHORS.rst2018-11-17T16:24:09ZBitbucket ImporterAdding myself to AUTHORS.rst*Created originally on Bitbucket by [pythooonuser (Felix Siebeneicker)](https://bitbucket.org/%7Bba558ba0-bda6-46a5-9310-750083cde298%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Adding...*Created originally on Bitbucket by [pythooonuser (Felix Siebeneicker)](https://bitbucket.org/%7Bba558ba0-bda6-46a5-9310-750083cde298%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Adding myself to AUTHORS.rst
* Sorting names ascendinghttps://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/291Updating the development documentation in regards to Windows - 2.62018-11-17T16:03:19ZBitbucket ImporterUpdating the development documentation in regards to Windows - 2.6*Created originally on Bitbucket by [pythooonuser (Felix Siebeneicker)](https://bitbucket.org/%7Bba558ba0-bda6-46a5-9310-750083cde298%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Updati...*Created originally on Bitbucket by [pythooonuser (Felix Siebeneicker)](https://bitbucket.org/%7Bba558ba0-bda6-46a5-9310-750083cde298%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Updating development introduction
* Fixing typo in header
* Restructuring development section
* Adding note for upstream reference
* Adding changes after review
* Reworking file specification sectionhttps://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/290AUTHORS.rst edited. Fixed Typo2020-06-26T12:05:17ZBitbucket ImporterAUTHORS.rst edited. Fixed Typo*Created originally on Bitbucket by [steven somersbury (Liam Sanders)](https://bitbucket.org/%7B026e1b96-49c2-4f9b-96ab-4e2200c83817%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
AUTHORS.r...*Created originally on Bitbucket by [steven somersbury (Liam Sanders)](https://bitbucket.org/%7B026e1b96-49c2-4f9b-96ab-4e2200c83817%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
AUTHORS.rst edited. Fixed Typohttps://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/289Improve range error detection in cell.utils.range_boundaries()2020-06-26T12:05:15ZBitbucket ImporterImprove range error detection in cell.utils.range_boundaries()*Created originally on Bitbucket by [stephenrauch (Stephen Rauch)](https://bitbucket.org/%7B09c6e4a1-d2c7-47c0-8afc-08bba22f4b59%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Improve ran...*Created originally on Bitbucket by [stephenrauch (Stephen Rauch)](https://bitbucket.org/%7B09c6e4a1-d2c7-47c0-8afc-08bba22f4b59%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Improve range error detection in cell.utils.range\_boundaries\(\)https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/287Add missing use of string formatter in error messages2020-06-26T12:05:12ZBitbucket ImporterAdd missing use of string formatter in error messages*Created originally on Bitbucket by [tehhowch (Benjamin Hauch)](https://bitbucket.org/%7B948794c8-c2fa-475d-baee-5aa372bed1bd%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Also added mis...*Created originally on Bitbucket by [tehhowch (Benjamin Hauch)](https://bitbucket.org/%7B948794c8-c2fa-475d-baee-5aa372bed1bd%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Also added missing `/` as path separator for test coverage output
I ran some grep regex on the repo and didn’t pick up any other obvious missing string formatters:
```shell
grep -nir -P "\\(.*\{0\}" * | fgrep -v "format"
grep -nir -P "\\(.*\{\d\}" * | fgrep -v "format"
grep -nir -P "raise " * | fgrep -v ".format"
```
It's possible these utility methods should not throw just because they were \(`range_boundaries` & others\) or were not \(`range_to_tuple`\) given a valid coordinate or range **with a sheet name attached**. That's a larger design issue that shouldn't hold up this PR.
One blocked use case is sorting a `MultiCellRange`'s `ranges` via the `key` function, in order to minimize the changeset if serializing the addresses \(e.g. to JSON\) or provide some other logical assertions about working with the result.
```python
mcr = get_MultiCellRange_somehow()
ranges = ' '.join(mcr.ranges)).split() # optional
ranges.sort(key=range_to_tuple) # all ranges must be fully qualified
ranges.sort(key=range_boundaries) # no ranges can be fully qualified
```
It’s still possible to sort, but one has to write their own key function to do it.https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/286Fix disjoint cellrange calculation2020-06-26T12:05:11ZBitbucket ImporterFix disjoint cellrange calculation*Created originally on Bitbucket by [tehhowch (Benjamin Hauch)](https://bitbucket.org/%7B948794c8-c2fa-475d-baee-5aa372bed1bd%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Add additional...*Created originally on Bitbucket by [tehhowch (Benjamin Hauch)](https://bitbucket.org/%7B948794c8-c2fa-475d-baee-5aa372bed1bd%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Add additional cases to disjoint tests
* Highlights issue with existing `isdisjoint` implementation
* Update `isdisjoint` calculation
* Use cached `title` variable
* Update docstrings to improve clarity
* Fix some punctuation / grammar errors
* Add missing backtick formatter
* Rephrase the docstring for `union` to clarify what it does
* Update type hints for method arguments & return values
Closes [https://bitbucket.org/openpyxl/openpyxl/issues/1116/erroneous-behavior-of-cellrange-isdisjoint](https://bitbucket.org/openpyxl/openpyxl/issues/1116/erroneous-behavior-of-cellrange-isdisjoint)https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/2852.5 - Fix #723 Tokenizer failure for quoted sheet name in second half of range2018-10-20T17:37:08ZBitbucket Importer2.5 - Fix #723 Tokenizer failure for quoted sheet name in second half of range*Created originally on Bitbucket by [stephenrauch (Stephen Rauch)](https://bitbucket.org/%7B09c6e4a1-d2c7-47c0-8afc-08bba22f4b59%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Fix #723 To...*Created originally on Bitbucket by [stephenrauch (Stephen Rauch)](https://bitbucket.org/%7B09c6e4a1-d2c7-47c0-8afc-08bba22f4b59%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Fix #723 Tokenizer failure for quoted sheet name in second half of rangehttps://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/2842.5 - Fix Whitespace in front of infix operator turns it into a prefix operat...2020-06-26T12:05:08ZBitbucket Importer2.5 - Fix Whitespace in front of infix operator turns it into a prefix operator in formula tokenizer*Created originally on Bitbucket by [stephenrauch (Stephen Rauch)](https://bitbucket.org/%7B09c6e4a1-d2c7-47c0-8afc-08bba22f4b59%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
A space in fr...*Created originally on Bitbucket by [stephenrauch (Stephen Rauch)](https://bitbucket.org/%7B09c6e4a1-d2c7-47c0-8afc-08bba22f4b59%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
A space in front of `-` or `+` causes the token to be interpreted as prefix instead of infix. in the formula tokenizer.https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/281Modified to support a formula with a line feeds.2020-06-26T12:05:04ZBitbucket ImporterModified to support a formula with a line feeds.*Created originally on Bitbucket by [ysdfix (Masato Yoshida)](https://bitbucket.org/%7B215c6f33-1223-4e30-8896-080dd74b1648%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
I canceled the pre...*Created originally on Bitbucket by [ysdfix (Masato Yoshida)](https://bitbucket.org/%7B215c6f33-1223-4e30-8896-080dd74b1648%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
I canceled the previous PR\(#280\) and created a new PR.
* Modified to support a formula with a line feeds
* Added test read formula with a line feeds.
* Edited unit tests in TestTokenizer.
This change is related to [#723](https://bitbucket.org/openpyxl/openpyxl/issues/723/tokenizer-fails-when-encountering).
This change is to support workbooks with formulas containing newlines\(line-feeds\).https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/277Add test for issue #832 / commit 75eb6db2018-08-13T14:17:46ZBitbucket ImporterAdd test for issue #832 / commit 75eb6db*Created originally on Bitbucket by [snord (Stefan)](https://bitbucket.org/%7B27017c75-cdab-4bbc-a0fa-bd2e009d7e53%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
Test that `load_workbook(.....*Created originally on Bitbucket by [snord (Stefan)](https://bitbucket.org/%7B27017c75-cdab-4bbc-a0fa-bd2e009d7e53%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
Test that `load_workbook(...., read_only=True)` does not leak file descriptor\(s\).https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/271Call from_excel with an offset in worksheet openpyxl.reader.worksheet2020-06-26T12:04:49ZBitbucket ImporterCall from_excel with an offset in worksheet openpyxl.reader.worksheet*Created originally on Bitbucket by [bjwebb (Ben Webb)](https://bitbucket.org/%7B6fc79bf2-665b-41ff-898d-b74e9065badb%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
This ensures that files ...*Created originally on Bitbucket by [bjwebb (Ben Webb)](https://bitbucket.org/%7B6fc79bf2-665b-41ff-898d-b74e9065badb%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
This ensures that files with a mac base date are loaded correctly.https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/267Image read2020-06-26T12:04:44ZBitbucket ImporterImage read*Created originally on Bitbucket by [Paul Joyce](https://bitbucket.org/%7B3b769536-9572-4672-b994-695c6b854793%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
This PR adds support for readin...*Created originally on Bitbucket by [Paul Joyce](https://bitbucket.org/%7B3b769536-9572-4672-b994-695c6b854793%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
This PR adds support for reading images embedded in worksheet. It is modelled on the way charts are read from a worksheet.https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/266Changes .itervalues() to .items()2020-06-26T12:04:42ZBitbucket ImporterChanges .itervalues() to .items()*Created originally on Bitbucket by [mschieder (Magnus Schieder)](https://bitbucket.org/%7Bd4c43f93-ff82-492f-9735-df6362249388%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
See [https://b...*Created originally on Bitbucket by [mschieder (Magnus Schieder)](https://bitbucket.org/%7Bd4c43f93-ff82-492f-9735-df6362249388%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
See [https://bitbucket.org/openpyxl/openpyxl/pull-requests/265/mergedcells-are-only-created-for-the/diff](https://bitbucket.org/openpyxl/openpyxl/pull-requests/265/mergedcells-are-only-created-for-the/diff)https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/265MergedCells are only created for the purpose of writing.2020-06-26T12:04:41ZBitbucket ImporterMergedCells are only created for the purpose of writing.*Created originally on Bitbucket by [mschieder (Magnus Schieder)](https://bitbucket.org/%7Bd4c43f93-ff82-492f-9735-df6362249388%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
See [https://b...*Created originally on Bitbucket by [mschieder (Magnus Schieder)](https://bitbucket.org/%7Bd4c43f93-ff82-492f-9735-df6362249388%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
See [https://bitbucket.org/openpyxl/openpyxl/pull-requests/261/fix-for-missing-borders/diff](https://bitbucket.org/openpyxl/openpyxl/pull-requests/261/fix-for-missing-borders/diff)
Now the MergedCells are only created for the purpose of writing, so they can't disturb any other parts of openpyxl.
test\_style\_assignment in openpyxl/reader/tests test\_excel.py
Saving the border style to the top-left cell will create a new border style for that cell.
Old border style of the top-left cell:
<border>
<left style="mediumDashed">
<color theme="6"/>
</left>
<right/>
<top style="mediumDashed">
<color theme="6"/>
</top>
<bottom/>
<diagonal/>
</border>
New border style of the top-left cell:
<border>
<left style="mediumDashed">
<color theme="6"/>
</left>
<right style="mediumDashed">
<color theme="6"/>
</right>
<top style="mediumDashed">
<color theme="6"/>
</top>
<bottom style="mediumDashed">
<color theme="6"/>
</bottom>
<diagonal/>
</border>
The old border style is not deleted, the number of border styles \(len\(wb.\_borders\)\) is higher.
In this test there is only one style for merge-cells and therefore one additional border.https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/261Fix for missing borders.2020-06-26T12:04:33ZBitbucket ImporterFix for missing borders.*Created originally on Bitbucket by [mschieder (Magnus Schieder)](https://bitbucket.org/%7Bd4c43f93-ff82-492f-9735-df6362249388%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
See https://bi...*Created originally on Bitbucket by [mschieder (Magnus Schieder)](https://bitbucket.org/%7Bd4c43f93-ff82-492f-9735-df6362249388%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
See https://bitbucket.org/openpyxl/openpyxl/issues/988/merge-cells-loosing-style-information
When dealing with merged Cells, Excel and Libreoffice create phantom cells to
keep border information for merged cells. This is unwanted behaviour.
Openpyxl eleminates those phantom cells.
Excel and Libreoffice receive the fills and the positioning from the upper
left cell of the merged cell.
MergedCellRange stores the border information of a merged cell in the top left
cell of the merged cell. For this the upper left cell gets the border
information of the bottom and right border from the bottom right cell of the
merged cell, if available.
The remaining cells in the merged cell are stored as MergedCell objects. The
MergedCells at the edge of the merged cell gets its borders from the upper
left cell.
- The top MergedCells get the top border from the top left cell.
- The bottom MergedCells get the bottom border from the top left cell.
- The left MergedCells get the left border from the top left cell.
- The right MergedCells get the right border from the top left cell.
When formatting the top left cell of the merged cell, the complete merged cell
is formatted.https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/260Fold Rows2018-05-28T06:56:26ZBitbucket ImporterFold Rows*Created originally on Bitbucket by [alessandrocucci (Alessandro Cucci)](https://bitbucket.org/%7Bae8fdec5-7592-4aeb-a4dc-4f5be54ee60f%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
Hello g...*Created originally on Bitbucket by [alessandrocucci (Alessandro Cucci)](https://bitbucket.org/%7Bae8fdec5-7592-4aeb-a4dc-4f5be54ee60f%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
Hello guys,
I need to get row folding for a report, but it seems it cannot be done \(only hiding is possible at the moment\). I make some small changes to get the work done, and since this can help other people I made a pull request. Thanks for all the work you’re doing!
Ref.
[https://openpyxl.readthedocs.io/en/stable/usage.html#fold-columns-outline](https://openpyxl.readthedocs.io/en/stable/usage.html#fold-columns-outline)
[https://stackoverflow.com/questions/27133731/folding-multiple-rows-with-openpyxl](https://stackoverflow.com/questions/27133731/folding-multiple-rows-with-openpyxl)https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/253added test for LineBreak2018-05-08T09:18:00ZBitbucket Importeradded test for LineBreak*Created originally on Bitbucket by [oryon-dominik (Dominik Geldmacher)](https://bitbucket.org/%7B665279ad-58ea-4412-9122-4b79f0dabde0%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
*Created originally on Bitbucket by [oryon-dominik (Dominik Geldmacher)](https://bitbucket.org/%7B665279ad-58ea-4412-9122-4b79f0dabde0%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
https://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/2522.5 - Support for gradient in charts2020-06-26T12:04:21ZBitbucket Importer2.5 - Support for gradient in charts*Created originally on Bitbucket by [barthisrael (Israel Barth Rubio)](https://bitbucket.org/%7B6821ea9f-c1bf-443c-a2e9-8874e343353c%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Gradien...*Created originally on Bitbucket by [barthisrael (Israel Barth Rubio)](https://bitbucket.org/%7B6821ea9f-c1bf-443c-a2e9-8874e343353c%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
* Gradient in charts
* gradient unit test correctionhttps://foss.heptapod.net/openpyxl/openpyxl/-/merge_requests/248Remove all unused test files2020-06-26T12:04:13ZBitbucket ImporterRemove all unused test files*Created originally on Bitbucket by [jdufresne (Jon Dufresne)](https://bitbucket.org/%7B9ce3b42b-d597-4036-a2c0-329083a4ccc9%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
The removed files...*Created originally on Bitbucket by [jdufresne (Jon Dufresne)](https://bitbucket.org/%7B9ce3b42b-d597-4036-a2c0-329083a4ccc9%7D/)*
*Was already merged in Bitbucket before import, marked as merged by the import user*
The removed files are unused by tests and have zero references in the code. Can safely remove them and reduce the size of the package.