Files
wehub-resource-sync 8cb1f9f479
Publish SDK (PyPI) / publish (push) Has been cancelled
Publish SDK (npm) / publish (@aionui/officecli-sdk) (push) Has been cancelled
SDK smoke / smoke (windows-latest) (push) Has been cancelled
Publish SDK (npm) / publish (@officecli/officecli-sdk) (push) Has been cancelled
Publish SDK (npm) / publish (@officecli/sdk) (push) Has been cancelled
Publish SDK (npm) / publish (officecli-sdk) (push) Has been cancelled
SDK smoke / smoke (macos-latest) (push) Has been cancelled
SDK smoke / smoke (ubuntu-latest) (push) Has been cancelled
Skill parity / diff (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:09:29 +08:00

289 lines
12 KiB
Python

#!/usr/bin/env python3
"""
Stock Charts Showcase — generates charts-stock.xlsx exercising the xlsx
`chart` element with chartType=stock: OHLC series (Open/High/Low/Close),
hi-low lines, up-down bars, axis/title/legend styling, data labels,
reference lines, borders, and number formats.
SDK twin of charts-stock.sh (officecli CLI). Both produce an equivalent
charts-stock.xlsx. This one drives the **officecli Python SDK**
(`pip install officecli-sdk`): one resident is started and every sheet and
chart is shipped over the named pipe in `doc.batch(...)` round-trips. Each
item is the same `{"command","parent","type","props"}` dict you'd put in an
`officecli batch` list.
3 chart sheets, 12 stock charts total:
1-Stock Fundamentals — basic OHLC, gridlines+axisfont, hiLowLines, updownbars
2-Stock Styling — title styling, axis lines, axis range, plot/chart fill
3-Stock Advanced — data labels, reference line, borders, number format
Usage:
pip install officecli-sdk # plus the `officecli` binary on PATH
python3 charts-stock.py
"""
import os
import sys
# --- locate the SDK: prefer an installed `officecli-sdk`, else the in-repo copy
try:
import officecli # pip install officecli-sdk
except ImportError:
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)),
"..", "..", "..", "sdk", "python"))
import officecli
FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "charts-stock.xlsx")
def add_sheet(name):
"""One `add sheet` item in batch-shape."""
return {"command": "add", "parent": "/", "type": "sheet", "props": {"name": name}}
def chart(sheet, **props):
"""One `add chart` item in batch-shape, parented to a sheet."""
return {"command": "add", "parent": f"/{sheet}", "type": "chart", "props": props}
print(f"Building {FILE} ...")
with officecli.create(FILE, "--force") as doc:
# ======================================================================
# Sheet: 1-Stock Fundamentals
# ======================================================================
print("\n--- 1-Stock Fundamentals ---")
items = [add_sheet("1-Stock Fundamentals")]
# ------------------------------------------------------------------
# Chart 1: Basic OHLC stock chart
# Features: chartType=stock, 4 series (Open/High/Low/Close), catTitle, axisTitle
# ------------------------------------------------------------------
items.append(chart("1-Stock Fundamentals",
chartType="stock",
title="ACME Corp Weekly OHLC",
series1="Open:142,145,148,150,147,152",
series2="High:148,151,155,156,153,158",
series3="Low:139,142,145,147,144,149",
series4="Close:145,148,150,147,152,155",
categories="Week 1,Week 2,Week 3,Week 4,Week 5,Week 6",
x="0", y="0", width="12", height="18",
catTitle="Week", axisTitle="Price ($)",
legend="bottom"))
# ------------------------------------------------------------------
# Chart 2: Stock with gridlines and axisfont
# Features: gridlines, axisfont on stock chart
# ------------------------------------------------------------------
items.append(chart("1-Stock Fundamentals",
chartType="stock",
title="Tech Sector Daily",
series1="Open:210,215,212,218,220",
series2="High:218,222,219,225,228",
series3="Low:207,211,208,214,216",
series4="Close:215,212,218,220,225",
categories="Mon,Tue,Wed,Thu,Fri",
x="13", y="0", width="12", height="18",
gridlines="D9D9D9:0.5",
axisfont="9:666666",
legend="bottom"))
# ------------------------------------------------------------------
# Chart 3: Stock with hiLowLines
# Features: hiLowLines=true (vertical lines connecting high to low)
# ------------------------------------------------------------------
items.append(chart("1-Stock Fundamentals",
chartType="stock",
title="Energy Sector with Hi-Low Lines",
series1="Open:78,80,82,79,83,85",
series2="High:84,86,88,85,89,91",
series3="Low:75,77,79,76,80,82",
series4="Close:80,82,79,83,85,88",
categories="Jan,Feb,Mar,Apr,May,Jun",
x="0", y="19", width="12", height="18",
hiLowLines="true",
legend="bottom"))
# ------------------------------------------------------------------
# Chart 4: Stock with updownbars
# Features: updownbars=gapWidth:upColor:downColor
# ------------------------------------------------------------------
items.append(chart("1-Stock Fundamentals",
chartType="stock",
title="Pharma Index with Up-Down Bars",
series1="Open:55,58,56,60,62,59",
series2="High:61,63,62,66,68,65",
series3="Low:52,55,53,57,59,56",
series4="Close:58,56,60,62,59,63",
categories="Jan,Feb,Mar,Apr,May,Jun",
x="13", y="19", width="12", height="18",
updownbars="100:70AD47:C00000",
legend="bottom"))
doc.batch(items)
# ======================================================================
# Sheet: 2-Stock Styling
# ======================================================================
print("--- 2-Stock Styling ---")
items = [add_sheet("2-Stock Styling")]
# ------------------------------------------------------------------
# Chart 1: Title styling, legend positioning
# Features: title.font/size/color/bold, legend=right, legendfont
# ------------------------------------------------------------------
items.append(chart("2-Stock Styling",
chartType="stock",
title="Styled Stock Chart",
series1="Open:165,170,168,172,175",
series2="High:175,178,176,180,183",
series3="Low:160,165,163,168,170",
series4="Close:170,168,172,175,180",
categories="Mon,Tue,Wed,Thu,Fri",
x="0", y="0", width="12", height="18",
**{"title.font": "Georgia", "title.size": "16",
"title.color": "1F4E79", "title.bold": "true"},
legend="right", legendfont="10:333333:Calibri"))
# ------------------------------------------------------------------
# Chart 2: Series effects, axisLine, catAxisLine
# Features: axisLine, catAxisLine on stock chart
# ------------------------------------------------------------------
items.append(chart("2-Stock Styling",
chartType="stock",
title="Axis Line Styling",
series1="Open:92,95,93,97,99",
series2="High:99,102,100,104,106",
series3="Low:88,91,89,93,95",
series4="Close:95,93,97,99,103",
categories="W1,W2,W3,W4,W5",
x="13", y="0", width="12", height="18",
hiLowLines="true",
axisLine="333333:1.5", catAxisLine="333333:1.5",
legend="bottom"))
# ------------------------------------------------------------------
# Chart 3: axisMin/Max, majorUnit
# Features: axisMin/Max, majorUnit
# ------------------------------------------------------------------
items.append(chart("2-Stock Styling",
chartType="stock",
title="Custom Axis Range",
series1="Open:120,125,122,128,130",
series2="High:132,138,135,140,142",
series3="Low:115,120,118,124,126",
series4="Close:125,122,128,130,135",
categories="Day 1,Day 2,Day 3,Day 4,Day 5",
x="0", y="19", width="12", height="18",
axisMin="110", axisMax="150",
majorUnit="10",
updownbars="100:70AD47:C00000",
legend="bottom"))
# ------------------------------------------------------------------
# Chart 4: plotFill, chartFill, roundedCorners
# Features: plotFill, chartFill, roundedCorners
# ------------------------------------------------------------------
items.append(chart("2-Stock Styling",
chartType="stock",
title="Styled Chart Area",
series1="Open:48,50,52,49,53",
series2="High:55,57,59,56,60",
series3="Low:44,46,48,45,49",
series4="Close:50,52,49,53,56",
categories="Mon,Tue,Wed,Thu,Fri",
x="13", y="19", width="12", height="18",
plotFill="F0F4F8", chartFill="FAFAFA",
roundedCorners="true",
hiLowLines="true",
legend="bottom"))
doc.batch(items)
# ======================================================================
# Sheet: 3-Stock Advanced
# ======================================================================
print("--- 3-Stock Advanced ---")
items = [add_sheet("3-Stock Advanced")]
# ------------------------------------------------------------------
# Chart 1: dataLabels, labelFont
# Features: dataLabels, labelPos, labelFont on stock
# ------------------------------------------------------------------
items.append(chart("3-Stock Advanced",
chartType="stock",
title="Stock with Data Labels",
series1="Open:185,190,188,192,195",
series2="High:195,198,196,200,203",
series3="Low:180,185,183,188,190",
series4="Close:190,188,192,195,200",
categories="W1,W2,W3,W4,W5",
x="0", y="0", width="12", height="18",
dataLabels="true", labelPos="top",
labelFont="8:666666:false",
legend="bottom"))
# ------------------------------------------------------------------
# Chart 2: referenceLine (support/resistance)
# Features: referenceLine as support/resistance level
# ------------------------------------------------------------------
items.append(chart("3-Stock Advanced",
chartType="stock",
title="Support & Resistance",
series1="Open:105,108,106,110,112,109",
series2="High:112,115,113,117,119,116",
series3="Low:101,104,102,106,108,105",
series4="Close:108,106,110,112,109,113",
categories="Jan,Feb,Mar,Apr,May,Jun",
x="13", y="0", width="12", height="18",
referenceLine="115:C00000:Resistance",
hiLowLines="true",
legend="bottom"))
# ------------------------------------------------------------------
# Chart 3: chartArea.border, plotArea.border
# Features: chartArea.border, plotArea.border
# ------------------------------------------------------------------
items.append(chart("3-Stock Advanced",
chartType="stock",
title="Bordered Stock Chart",
series1="Open:72,75,73,77,79",
series2="High:79,82,80,84,86",
series3="Low:68,71,69,73,75",
series4="Close:75,73,77,79,83",
categories="Mon,Tue,Wed,Thu,Fri",
x="0", y="19", width="12", height="18",
**{"chartArea.border": "333333:1.5",
"plotArea.border": "999999:0.75"},
updownbars="100:70AD47:C00000",
legend="bottom"))
# ------------------------------------------------------------------
# Chart 4: dispUnits, axisNumFmt
# Features: axisNumFmt (dollar format)
# ------------------------------------------------------------------
items.append(chart("3-Stock Advanced",
chartType="stock",
title="Large Cap Stock",
series1="Open:2850,2900,2880,2920,2950",
series2="High:2950,2980,2960,3000,3020",
series3="Low:2800,2850,2830,2870,2900",
series4="Close:2900,2880,2920,2950,2990",
categories="Q1,Q2,Q3,Q4,Q5",
x="13", y="19", width="12", height="18",
axisNumFmt="$#,##0",
hiLowLines="true",
legend="bottom"))
doc.batch(items)
# Remove blank default Sheet1 (all data is inline)
doc.send({"command": "remove", "path": "/Sheet1"})
doc.send({"command": "save"})
# context exit closes the resident, flushing the workbook to disk.
print(f"\nDone! Generated: {FILE}")
print(" 3 chart sheets, 12 stock charts total")