Files for "How to Translate an Excel Spreadsheet Without Breaking Formulas or Dropdowns" https://www.booktranslator.app/blog/translate-excel-spreadsheet check_xlsx_text.py Lists where an .xlsx keeps its text: plain text cells, text inside formulas, cells with mixed formatting, link cells, codes with letters and digits, dropdown lists, notes and comments, headers and footers, sheet names, charts, text boxes, pivot tables, and a macro project. Needs Python 3 only. Reads the files; never writes to them. python3 check_xlsx_text.py workbook.xlsx python3 check_xlsx_text.py --compare source.xlsx translated.xlsx The compare mode checks that formulas, numbers and dates are unchanged, that codes came back exactly as they were, and that every dropdown value is in its list. Use it on a translated workbook, not a bilingual one: a bilingual workbook shifts columns, so almost every cell would differ. sample-workbook.xlsx Two sheets. "Products" has a header row, prices with a currency format, quantities, a date, an IF formula with "In stock"/"Low stock" inside it, a total formula, codes (00123, A-77, B-09), one cell with a bold word, a hyperlink cell, a note, a dropdown that allows "Stationery,Office,Art", and a merged cell. "Summary" has two formulas that read the Products sheet. The workbook defines one named range (PriceRange). build_fixture.mjs Rebuilds sample-workbook.xlsx with exceljs 4.4.0: npm install exceljs@4.4.0 node build_fixture.mjs sample-workbook.xlsx ZIP timestamps differ between builds, so a rebuilt file will not match the hash below byte for byte; its XML content will. add_chart_and_vba.py Makes a copy of a workbook with a bar chart and a placeholder VBA project added, using the part names and relative paths Excel writes. We used it to test whether charts and macros survive. Python 3 only. python3 add_chart_and_vba.py sample-workbook.xlsx with-chart-and-vba.xlsx SHA-256 (as published, 2026-11-01) sample-workbook.xlsx 75d8868c12dc2b55ea0e4de866a0ff7af96441f1523f84e96b17c61f581fd626 build_fixture.mjs 8a026b8049fc757c02cc90ba5da38f05dd7ceee4951f28ec5db1c9de255cc821 add_chart_and_vba.py faef98883ca5b633d9875517dcaea407daa19855936df25a3742c0932ba74646 How the article's results were produced We ran sample-workbook.xlsx, and the copy made by add_chart_and_vba.py, through the cell reading and file writing used by BookTranslator's XLSX handler as of 2026-11-01, reproduced locally with exceljs 4.4.0. The "translation" was a placeholder that adds "[DE] " in front of each cell's text, so no language model was involved and the results show only what the file handling sends, keeps, moves, or drops. The CSV results come from the same reproduction of the CSV handler (papaparse 5.5.3) on a small semicolon-separated file. Real translations will also change text length, and a real model may or may not change codes.