| 762 | yield from self._generate_body(coloffset) |
| 763 | |
| 764 | def _format_hierarchical_rows(self) -> Iterable[ExcelCell]: |
| 765 | if self._has_aliases or self.header: |
| 766 | self.rowcounter += 1 |
| 767 | |
| 768 | gcolidx = 0 |
| 769 | |
| 770 | if self.index: |
| 771 | index_labels = self.df.index.names |
| 772 | # check for aliases |
| 773 | if self.index_label and isinstance( |
| 774 | self.index_label, (list, tuple, np.ndarray, Index) |
| 775 | ): |
| 776 | index_labels = self.index_label |
| 777 | |
| 778 | # MultiIndex columns require an extra row |
| 779 | # with index names (blank if None) for |
| 780 | # unambiguous round-trip, Issue #11328 |
| 781 | if isinstance(self.columns, MultiIndex): |
| 782 | self.rowcounter += 1 |
| 783 | |
| 784 | # if index labels are not empty go ahead and dump |
| 785 | if com.any_not_none(*index_labels) and self.header is not False: |
| 786 | for cidx, name in enumerate(index_labels): |
| 787 | yield ExcelCell(self.rowcounter - 1, cidx, name, None) |
| 788 | |
| 789 | if self.merge_cells and self.merge_cells != "columns": |
| 790 | # Format hierarchical rows as merged cells. |
| 791 | level_strs = self.df.index._format_multi( |
| 792 | sparsify=True, include_names=False |
| 793 | ) |
| 794 | level_lengths = get_level_lengths(level_strs) |
| 795 | |
| 796 | for spans, levels, level_codes in zip( |
| 797 | level_lengths, |
| 798 | self.df.index.levels, |
| 799 | self.df.index.codes, |
| 800 | strict=False, |
| 801 | ): |
| 802 | values = levels.take( |
| 803 | level_codes, |
| 804 | allow_fill=levels._can_hold_na, |
| 805 | fill_value=levels._na_value, |
| 806 | ) |
| 807 | # GH#60099 |
| 808 | if isinstance(values[0], Period): |
| 809 | values = values.to_timestamp() |
| 810 | |
| 811 | for i, span_val in spans.items(): |
| 812 | mergestart, mergeend = None, None |
| 813 | if span_val > 1: |
| 814 | mergestart = self.rowcounter + i + span_val - 1 |
| 815 | mergeend = gcolidx |
| 816 | yield CssExcelCell( |
| 817 | row=self.rowcounter + i, |
| 818 | col=gcolidx, |
| 819 | val=values[i], |
| 820 | style=None, |
| 821 | css_styles=getattr(self.styler, "ctx_index", None), |