如何使用openpyxl设置Excel图表坐标轴刻度标签的字体?
用openpyxl设置Excel图表X轴刻度标签字体的正确方法
你当前的代码错误修改了X轴标题的字体,而非刻度标签的字体。要配置X轴刻度标签的字体,需要针对x_axis.tickLabels进行设置,x_axis.textProperties其实是用来设置轴标题文字属性的。
以下是修正后的完整代码:
from openpyxl import Workbook from openpyxl.chart import BarChart, Reference from openpyxl.chart.text import RichText from openpyxl.drawing.text import Font, CharacterProperties def main(): wb = Workbook() chart = _create_openpyxl_chart(wb) _format_chart(chart) wb.save("example.xlsx") def _format_chart(chart): font_type = 'Arial' font_size = 12 font_style = 'bold' font = Font(typeface=font_type) character_properties = CharacterProperties( sz=font_size * 100, # openpyxl中字体大小单位是1/100点 b=(font_style == 'bold'), latin=font, ) axis = chart.x_axis # 针对刻度标签进行设置,而非轴标题 if axis.tickLabels is None: axis.tickLabels = RichText() # 确保段落和文本块存在,避免索引错误 if not axis.tickLabels.paragraphs: axis.tickLabels.paragraphs.append(RichText.P()) paragraph = axis.tickLabels.paragraphs[0] if not paragraph.text: paragraph.text.append(RichText.Tt()) text_run = paragraph.text[0] text_run.properties = character_properties def _create_openpyxl_chart(wb): sheet = wb.active _create_example_data(sheet) chart = _create_stacked_bar_chart() _connect_chart_to_example_data(chart, sheet) sheet.add_chart(chart) return chart def _connect_chart_to_example_data(chart, sheet): values = Reference( sheet, min_col=1, max_col=4, min_row=2, max_row=4, ) chart.add_data( values, titles_from_data=True, from_rows=True, ) categories = Reference( sheet, min_col=2, max_col=4, min_row=1, max_row=1, ) chart.set_categories(categories) def _create_stacked_bar_chart(): chart = BarChart() chart.x_axis.title = "Year" chart.type = "col" chart.grouping = "stacked" chart.overlap = 100 return chart def _create_example_data(sheet): data = [ ["Category", 2017, 2018, 2019], ["Apples", 10, 7, 12], ["Oranges", 5, 3, 4], ["Bananas", 8, 6, 9], ] for row in data: sheet.append(row) if __name__ == '__main__': main()
关键说明:
- 核心修改是将操作对象从
axis.textProperties改为axis.tickLabels,这才是控制X轴刻度标签的属性 - 添加了对
paragraphs和text列表的空值判断,避免运行时出现索引越界错误 - 字体大小
sz的单位是1/100点,所以需要将字号乘以100(比如12号字体对应1200)
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

