scripts/xlsx_to_csv.py
scripts/xlsx_to_csv.pyBrowse 11 files
559 tokens
2,367 bytes
Token encoding: o200k_base
Snapshot 24fd22b
← Back to SKILL.md
1#!/usr/bin/env python32"""Export one sheet of an .xlsx workbook to CSV.3 4Dates/datetimes are written in ISO format; None becomes an empty field.5With --data-only, formula cells yield their cached results (present only6if the file was last saved by Excel/LibreOffice; openpyxl never computes).7 8Usage:9 xlsx_to_csv.py book.xlsx out.csv10 xlsx_to_csv.py book.xlsx out.csv --sheet Data --encoding utf-8-sig11 xlsx_to_csv.py book.xlsx out.csv --delimiter ';' --data-only12"""13from __future__ import annotations14 15import argparse16import csv17import json18import sys19from datetime import date, datetime, time20 21from openpyxl import load_workbook22 23 24def to_text(value):25 if value is None:26 return ""27 if isinstance(value, datetime):28 # Excel stores pure dates as midnight datetimes; emit a bare date.29 if value.time() == time(0, 0):30 return value.date().isoformat()31 return value.isoformat()32 if isinstance(value, (date, time)):33 return value.isoformat()34 return value35 36 37def main(argv=None):38 ap = argparse.ArgumentParser(description=".xlsx sheet -> CSV exporter.")39 ap.add_argument("file", help="input .xlsx path")40 ap.add_argument("output", help="output CSV path")41 ap.add_argument("--sheet", help="sheet name (default: active)")42 ap.add_argument("--encoding", default="utf-8",43 help="CSV output encoding (default utf-8)")44 ap.add_argument("--delimiter", default=",")45 ap.add_argument("--data-only", action="store_true",46 help="cached formula results instead of formula strings")47 args = ap.parse_args(argv)48 49 wb = load_workbook(args.file, data_only=args.data_only)50 ws = wb[args.sheet] if args.sheet else wb.active51 52 with open(args.output, "w", newline="", encoding=args.encoding) as fh:53 writer = csv.writer(fh, delimiter=args.delimiter)54 count = 055 for row in ws.iter_rows(values_only=True):56 writer.writerow([to_text(v) for v in row])57 count += 158 59 print(json.dumps({"ok": True, "output": args.output, "sheet": ws.title,60 "rows": count}, ensure_ascii=False))61 return 062 63 64if __name__ == "__main__":65 try:66 sys.exit(main())67 except Exception as exc: # noqa: BLE00168 print(json.dumps({"ok": False, "error": str(exc)}), file=sys.stderr)69 sys.exit(1)70