|
48 | 48 | CSSWarning,
|
49 | 49 | )
|
50 | 50 | from pandas.io.formats.format import get_level_lengths
|
51 |
| -from pandas.io.formats.printing import pprint_thing |
52 | 51 |
|
53 | 52 | if TYPE_CHECKING:
|
54 | 53 | from pandas._typing import (
|
@@ -620,61 +619,43 @@ def _format_header_mi(self) -> Iterable[ExcelCell]:
|
620 | 619 | return
|
621 | 620 |
|
622 | 621 | columns = self.columns
|
623 |
| - level_strs = columns._format_multi( |
624 |
| - sparsify=self.merge_cells in {True, "columns"}, include_names=False |
625 |
| - ) |
| 622 | + merge_columns = self.merge_cells in {True, "columns"} |
| 623 | + level_strs = columns._format_multi(sparsify=merge_columns, include_names=False) |
626 | 624 | level_lengths = get_level_lengths(level_strs)
|
627 | 625 | coloffset = 0
|
628 | 626 | lnum = 0
|
629 | 627 |
|
630 | 628 | if self.index and isinstance(self.df.index, MultiIndex):
|
631 | 629 | coloffset = self.df.index.nlevels - 1
|
632 | 630 |
|
633 |
| - if self.merge_cells in {True, "columns"}: |
634 |
| - # Format multi-index as a merged cells. |
635 |
| - for lnum, name in enumerate(columns.names): |
636 |
| - yield ExcelCell( |
637 |
| - row=lnum, |
638 |
| - col=coloffset, |
639 |
| - val=name, |
640 |
| - style=None, |
641 |
| - ) |
| 631 | + for lnum, name in enumerate(columns.names): |
| 632 | + yield ExcelCell( |
| 633 | + row=lnum, |
| 634 | + col=coloffset, |
| 635 | + val=name, |
| 636 | + style=None, |
| 637 | + ) |
642 | 638 |
|
643 |
| - for lnum, (spans, levels, level_codes) in enumerate( |
644 |
| - zip(level_lengths, columns.levels, columns.codes) |
645 |
| - ): |
646 |
| - values = levels.take(level_codes) |
647 |
| - for i, span_val in spans.items(): |
648 |
| - mergestart, mergeend = None, None |
649 |
| - if span_val > 1: |
650 |
| - mergestart, mergeend = lnum, coloffset + i + span_val |
651 |
| - yield CssExcelCell( |
652 |
| - row=lnum, |
653 |
| - col=coloffset + i + 1, |
654 |
| - val=values[i], |
655 |
| - style=None, |
656 |
| - css_styles=getattr(self.styler, "ctx_columns", None), |
657 |
| - css_row=lnum, |
658 |
| - css_col=i, |
659 |
| - css_converter=self.style_converter, |
660 |
| - mergestart=mergestart, |
661 |
| - mergeend=mergeend, |
662 |
| - ) |
663 |
| - else: |
664 |
| - # Format in legacy format with dots to indicate levels. |
665 |
| - for i, values in enumerate(zip(*level_strs)): |
666 |
| - v = ".".join(map(pprint_thing, values)) |
| 639 | + for lnum, (spans, levels, level_codes) in enumerate( |
| 640 | + zip(level_lengths, columns.levels, columns.codes) |
| 641 | + ): |
| 642 | + values = levels.take(level_codes) |
| 643 | + for i, span_val in spans.items(): |
| 644 | + mergestart, mergeend = None, None |
| 645 | + if merge_columns and span_val > 1: |
| 646 | + mergestart, mergeend = lnum, coloffset + i + span_val |
667 | 647 | yield CssExcelCell(
|
668 | 648 | row=lnum,
|
669 | 649 | col=coloffset + i + 1,
|
670 |
| - val=v, |
| 650 | + val=values[i], |
671 | 651 | style=None,
|
672 | 652 | css_styles=getattr(self.styler, "ctx_columns", None),
|
673 | 653 | css_row=lnum,
|
674 | 654 | css_col=i,
|
675 | 655 | css_converter=self.style_converter,
|
| 656 | + mergestart=mergestart, |
| 657 | + mergeend=mergeend, |
676 | 658 | )
|
677 |
| - |
678 | 659 | self.rowcounter = lnum
|
679 | 660 |
|
680 | 661 | def _format_header_regular(self) -> Iterable[ExcelCell]:
|
@@ -798,11 +779,8 @@ def _format_hierarchical_rows(self) -> Iterable[ExcelCell]:
|
798 | 779 |
|
799 | 780 | # MultiIndex columns require an extra row
|
800 | 781 | # with index names (blank if None) for
|
801 |
| - # unambiguous round-trip, unless not merging, |
802 |
| - # in which case the names all go on one row Issue #11328 |
803 |
| - if isinstance(self.columns, MultiIndex) and ( |
804 |
| - self.merge_cells in {True, "columns"} |
805 |
| - ): |
| 782 | + # unambiguous round-trip, Issue #11328 |
| 783 | + if isinstance(self.columns, MultiIndex): |
806 | 784 | self.rowcounter += 1
|
807 | 785 |
|
808 | 786 | # if index labels are not empty go ahead and dump
|
|
0 commit comments