# SourceSheet: source-to-spreadsheet sample

A focused, independent demonstration for a webpage/document data-entry request. All companies and domains in the supplied HTML are invented. This is not previous client work and does not contain the buyer's data.

## Inspect

The interactive page pairs each original source record with its normalized spreadsheet row. The Excel workbook has two sheets: Transfer and Source. All 12 source records remain visible: 9 ready, 2 with missing fields, and 1 duplicate candidate. The accepted CSV contains only the 9 ready records. Review CSV contains all 3 exceptions.

## Reproduce the transfer

Requires Python 3.11 or later. No third-party dependency, API key, network access or account is required.

```
python source_sheet.py
python -m unittest -v
```

Outputs are deterministic JSON and CSV. Raw input is preserved. Postal codes stay text, including leading zeros. CSV formula-like text is escaped, while the original value remains in JSON and the source. Opening a CSV in Excel may automatically convert identifiers; use the supplied XLSX or import the postal column as Text.

The parser supports this specific supplied HTML layout. It is not a general web crawler or OCR system. The customer's real source, fields, template and batch size must be reviewed before agreeing on a paid deliverable. A typo is not corrected by guessing; ambiguous content requires review.

## Excel presentation

The included XLSX is a checked sample generated from the JSON with the bundled spreadsheet authoring tool. The Python transfer works independently. Rebuilding the styled XLSX requires that separate authoring environment. No claim is made of integration with a customer's live Google Sheet.

Eight focused checks cover source reconciliation, missing values, duplicate retention, postal identifiers, raw preservation, CSV text safety, schema rejection and repeatable export.
