fileformer
search⌘KtranslateENexpand_moreupload_fileConvert
Converters8 file families · 44 direct conversions
What changes in a conversionarrow_forward
home / documents / xlsx

Convert XLSX Document Free

What a spreadsheet cell actually stores

An .xlsx is a ZIP of XML. A cell holds a raw value, a type letter and a style number. The style points to a number format, and only the format decides whether 46298 is a number or 3 October 2026. Formulas carry the last result Excel calculated, which other programs trust as-is. Open a workbook, or the sample written here, and click any cell to follow it from XML to what you see.

folder_openOpen .xlsxSample workbookevent_repeatFlip to 1904 datesdownloadDownload
q3-orders.xlsx: sample written here: hidden sheets, a stale total, a lost card digit, a phantom date, a legacy-hashed sheet password
Orders!G4xl/worksheets/sheet1.xml
<c r="G4" s="2"><f>E4+F4</f><v>90</v></c>
subdirectory_arrow_righttypet omitted or "n": a number
subdirectory_arrow_rightstored<v>90</v>
subdirectory_arrow_rightstyles="2" → cellXfs[2] → numFmtId 165
subdirectory_arrow_rightnumber format“"£"#,##0.00” (custom, in styles.xml)
subdirectory_arrow_rightformula=E4+F4 · <v> is the last cached result
shown in the cell£90.00
table_chartOrdersvisibility_offLookuplockAuditvisible · 58 cells · dimension A1:J9 · frozen 1 row(s)
ABCDEFGHIJ1OrderDateCustomerPostcodeNetVATTotalPaidCardNote2100103/10/2026Harbour Café02134£250.00£50.00£300.00TRUE4.11111E+15card typed as a number3100210-04-26Nordlicht GmbH02139£1,234.50£246.90£1,481.40FALSE4111111111111111card stored as text4100303/10/2026Ōsaka Trading90210£80.00£16.00£90.00TRUETotal cached before Net was changed5100410/5/26 18:00Smith & Sons00501£0.00£0.00#DIV/0!VAT share of a zero order6100529/02/1900Leap-year testserial 60 in the 1900 system712:00half a day, formatted h:mm8internal: margin floor 38%, do not send9Totals£1,564.50£312.90#DIV/0!
Orders!G4
XML typenumber
raw <v>90
number format165 · "£"#,##0.00
Excel shows£90.00
JavaScript reads90
15 significant digits90
as 1900 date1900-03-30
as 1904 date1904-03-31
pandas / LibreOffice1900-03-30 00:00:00
recomputed96

What this workbook is hiding or getting wrong

error2 hidden sheet(s): Lookup (hidden, 2 cells), Audit (veryHidden, 4 cells).“veryHidden” sheets don’t appear in Excel’s Unhide list at all; the data is still in the file and in every export.
info3 defined name(s), 1 hidden._xlnm.Print_Area → Orders!$A$1:$J$9 · FloorRate → Audit!$B$2 · TaxRate → Lookup!$B$1
error1 cell(s) in hidden rows or columns.Hidden rows still print to CSV and still get pasted into emails.
error1 formula result(s) out of date.The cached <v> no longer matches the inputs. Excel recalculates on open, but CSV exports, previews, pandas and most converters read the cached value as-is. The workbook does not set fullCalcOnLoad.
errorLong numbers already lost digits: Orders!I2.Excel keeps 15 significant digits, so a 16-digit card or account number typed as a number ends in 0. Store identifiers as text.
infoLeading zeros are only formatting: Orders!D2, Orders!D4, Orders!D5.The cell holds e.g. 2134; the format “00000” draws 02134. Export the raw value and the zero is gone.
infoDates stored as text: Orders!B4.They sort alphabetically and can’t be added to. “03/10/2026” is 3 October or March 10 depending on who opens it.
infoDates before 1 March 1900: Orders!B6, Orders!A7.Excel counts the non-existent 29 Feb 1900, so other software reads these one day off (or as an invalid date).
check_circleDate system: 1900.Serials count from 1 Jan 1900 (with the Lotus leap-year bug).
info2 error value(s).Orders!G5 #DIV/0! · Orders!G9 #DIV/0!. Errors propagate: any SUM over them is an error too.
infoSheet “Orders” is protected with a legacy 16-bit hash (94DC).Only 32,768 possible values: the protection lab below finds a working password for it.
info1 merged range(s).Only the top-left cell holds a value; the rest export as blanks, which breaks sorting and CSV.
infoDocument properties.creator J. Smith · last modified by accounts-laptop · created 2026-09-28T08:14:00Z · modified 2026-10-03T16:40:00Z · company Example Trading Ltd · app FileFormer sample writer.
check_circle28 shared strings.Each text cell stores an index; repeated text is stored once (count 28 uses).
formula recalculation check
cellformulacached in filerecomputed here
Orders!G4=E4+F49096
Orders!F2=E2*TaxRate5050
Orders!G2=E2+F2300300
Orders!F3=E3*TaxRate246.9246.9
Orders!G3=E3+F31481.41481.4
Orders!F4=E4*TaxRate1616
Orders!F5=E5*TaxRate00
Orders!G5=F5/E5#DIV/0!#DIV/0!
11 formulas; 11 recomputed here from the values they reference (SUM, AVERAGE, MIN, MAX, COUNT, ROUND, ABS and arithmetic), 0 skipped.parts in the package
_rels/.relsstored587 B
[Content_Types].xmlstored1.3 KB
docProps/app.xmlstored252 B
docProps/core.xmlstored569 B
xl/_rels/workbook.xml.relsstored847 B
xl/sharedStrings.xmlstored989 B
xl/styles.xmlstored1.6 KB
xl/workbook.xmlstored743 B
xl/worksheets/sheet1.xmlstored2.7 KB
xl/worksheets/sheet2.xmlstored346 B
xl/worksheets/sheet3.xmlstored422 B
date serial lab

One number, four different dates

Excel stores a date as days since an epoch. In the 1900 system, day 1 is 1 January 1900, and day 60 is 29 February 1900, a date that never existed. Lotus 1-2-3 had the bug and Excel kept it for compatibility. The 1904 system, the old Mac default, starts four years and one day later. Most other software (LibreOffice, pandas, the usual JavaScript snippet) counts from 30 December 1899 instead, which matches Excel from 1 March 1900 on and is a day off before that.

059606146298.752958465
Excel, 1900 system1900-02-29 (never existed)Lotus 1-2-3 bug kept on purpose: this day does not exist.
Excel, 1904 system1904-03-011,462 days later than the 1900 reading. Old Mac default; still set in some files.
LibreOffice / pandas1900-02-28Epoch 30 Dec 1899, no phantom day. Disagrees with Excel 1900.
new Date((s − 25569) × 864e5)1900-02-28The common JavaScript snippet: Unix epoch is serial 25569. Same result as the column left, in UTC.
serialExcel 1900Excel 1904epoch 1899-12-30why it matters
01900-01-00 (day zero)1904-01-011899-12-30Excel shows “0 January 1900”
11900-01-011904-01-021899-12-31day 1 of the 1900 system
591900-02-281904-02-291900-02-27epoch tools say 1900-02-27: one day off
601900-02-29 (never existed)1904-03-011900-02-28the phantom 29 February 1900
611900-03-011904-03-021900-03-01from here on, 1900 system and 1899-12-30 epoch agree
1,4621904-01-011908-01-021904-01-01gap between the two Excel systems
25,5691970-01-011974-01-021970-01-011 Jan 1970: the Unix epoch
46,2982026-10-032030-10-042026-10-03today (3 Oct 2026)
2,958,4659999-12-3110004-01-019999-12-31last day Excel accepts: 31 Dec 9999
protection lab

“Protect sheet” is a lock with the key taped to it

Sheet protection stops casual edits in Excel’s own interface. The cells are still plain XML in the ZIP. Older files store the password as a 16-bit hash, so there are only 32,768 possible values and many short strings unlock the same sheet. Newer files store salted SHA-512 run 100,000 times, which slows guessing, but any tool can simply delete the <sheetProtection> element. Only “Encrypt with password” (a password to open) actually protects the contents.

Time one SHA-512 × 100,000 checkDownload with protection removed
legacy hash0x94DC (one of 32,768 values)
also unlocks it“AABBABAABBAR” → 0x94DC, found by trying A/B strings
in this filesheet “Orders” hash 94DC → “AABBABAABBAR” unlocks it in Excel · your password matches
SHA-512 × 100,000press the button to measure one check
either waydeleting <sheetProtection …/> from the sheet XML removes the lock: the download below does exactly that, nothing else changed

Reference

t=cell typewhere the value lives
nnumberthe <v> text, parsed as a double; dates are numbers too
sshared string<v> holds an index into sharedStrings.xml
inlineStrinline stringtext in <is><t>, used by many non-Excel writers
strformula stringtext result of a formula, cached in <v>
bboolean<v>1</v> or <v>0</v>
eerror#DIV/0!, #N/A, #REF!, #VALUE!, #NAME?, #NUM!, #NULL!
dISO 8601 dateallowed by the standard, not written by Excel
built-in numFmtId (blue = dates and times, the only signal that a number is a date)
0General
10
20.00
3#,##0
4#,##0.00
90%
100.00%
110.00E+00
12# ?/?
13# ??/??
14mm-dd-yy
15d-mmm-yy
16d-mmm
17mmm-yy
18h:mm AM/PM
19h:mm:ss AM/PM
20h:mm
21h:mm:ss
22m/d/yy h:mm
37#,##0 ;(#,##0)
38#,##0 ;[Red](#,##0)
39#,##0.00;(#,##0.00)
40#,##0.00;[Red](#,##0.00)
45mm:ss
46[h]:mm:ss
47mmss.0
48##0.0E+0
49@
MIMEapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet; .xlsm application/vnd.ms-excel.sheet.macroEnabled.12
Magic bytes50 4B 03 04 (ZIP) with [Content_Types].xml and xl/workbook.xml inside
Grid1,048,576 rows × 16,384 columns (A1:XFD1048576)
Precision15 significant digits; values are IEEE 754 doubles
Text32,767 characters per cell; sheet names up to 31 characters
Dates1900 system: serial 1 = 1 Jan 1900 to 2,958,465 = 31 Dec 9999; 1904 system from 1 Jan 1904
Formulasup to 8,192 characters, 64 nested function levels
Variants.xlsx (no macros), .xlsm (macros), .xltx/.xltm templates, .xlsb (binary records in the same ZIP layout)
Encryptedpassword-to-open files are not ZIPs: an OLE container holding EncryptionInfo + EncryptedPackage (MS-OFFCRYPTO)
StandardsECMA-376 (2006), ISO/IEC 29500 (2008), Transitional vs Strict; Microsoft extensions in MS-XLSX
1979VisiCalcThe first spreadsheet on a personal computer.
1983Lotus 1-2-3Treats 1900 as a leap year; Excel later copies the bug to stay compatible.
1985Excel for MacUses the 1904 date system, avoiding the bug.
1997Excel 97 · BIFF8The binary .xls format most legacy files still use.
2006ECMA-376Office Open XML is standardised.
2007Excel 2007.xlsx becomes the default and the grid grows to 1,048,576 × 16,384.
2013Excel 2013Sheet passwords move from the 16-bit hash to salted SHA-512 with 100,000 rounds.

Moving spreadsheet data around