Headers → local tag names under each row record (or attributes if you map them). Fix illegal XML name characters in the sheet—spaces, slashes, leading digits—before export.
Rows → one repeated sibling element per line (typical XSD line-feed pattern). Empty cells emit empty elements; xsi:nil is a schema choice, not automatic here.
Quick pass: match “first row is column names”, delimiter, skip, and limit → convert → diff one <record> against headers → validate a small slice with your XSD or partner sample.
Shape: siblings under one root
<data>
<record>…</record>
<record>…</record>
</data>