BookTranslator
BookTranslator

Nxaniso lowu a wu kumeki hi ririmi ra wena sweswi, hikwalaho wu kombisiwa hi Xinghezi.

How to Translate an Excel Spreadsheet Without Breaking Formulas or Dropdowns

Find the text a cell-by-cell translator skips in an .xlsx (formula text, rich text, links, charts, macros), fix the dropdowns and codes it can break, and check the result with a free script and a test workbook.

BookTranslator

BookTranslator Team

15 wa timinete to hlaya

To translate a whole Excel workbook, upload the .xlsx file to a document translator instead of translating cells one at a time. Excel's own Review > Translate command works on the text you select (Microsoft Support), which is fine for a label and slow for a price list. A file translator reads every text cell, translates it, and writes it back to the same address, so formulas, numbers, and dates stay where they were.

What it does not tell you is which text it never read. Text typed inside a formula, a cell with one bold word, a link, a note, a chart title: in a cell-by-cell translation, all of these can come back in the original language. And two things can break: a dropdown whose allowed values were not translated, and a product code that was.

We built a two-sheet test workbook with text in each of those places, wrote a free checker that lists where the text lives, and ran the workbook through a local reproduction of the spreadsheet handling BookTranslator uses. This guide shows what came back, what to change before you upload, and how to check the translated file.

Quick Answer: What Gets Translated in a Workbook

Where the text isExample from our testTranslated by BookTranslator?What to do
Plain text cells, including header rows"Blue notebook", "Price"YesNothing
Numbers, dates, booleans4.5, 2026-10-30Left as they wereCheck number formats for the target market
Formulas=C2*D2Left as they wereNothing
Text inside a formula=IF(D2>5,"In stock","Low stock")NoMove the words into cells (see Step 2)
Cell with mixed formatting"Limited edition pen"No, the whole cell is skippedClear the formatting first, or translate it by hand
Hyperlink cells"Product page"NoEdit the link text after translation
Value inside a dropdown cell"Stationery"Yes, but the dropdown list is notFix the list, or the cell is no longer valid
Codes with letters"A-77", "B-09"Sent to the translatorCheck them after translation
Codes with only digits or symbols"00123"Left as they wereNothing
Notes and comments"Check supplier name before release"NoTranslate by hand, or delete them
Sheet names and named ranges"Products", PriceRangeNo, so cross-sheet formulas keep workingRename sheets by hand only if you must, after checking formulas
Charts and macrosA bar chart, a VBA projectRemoved from the translated file in our testKeep the original, rebuild after (see below)

Older .xls files are not accepted. Open them in Excel and save as .xlsx first. Macro-enabled .xlsm files are accepted, but read the macros section before you upload one: the translated file has no macros, and if the download still ends in .xlsm, rename it to .xlsx before opening it.

Step 1: Run the Checker on Your Workbook

Download check_xlsx_text.py and run it on your file:

python3 check_xlsx_text.py "Price list.xlsx"

It needs only Python 3 and reads the file without changing it. Here is the summary for our sample workbook:

Counts by location:
  cell         code, ID or address        2
  cell         link text                  1
  cell         mixed formatting           1
  cell         plain text                 15
  comments     comment or note text       1
  dropdown     list of allowed values     1
  formula text text inside a formula      6
  sheet        sheet name                 2
  workbook     defined name               1

Plain text cells (translated by a cell-by-cell translator): 15
Items that need a decision before you upload: 12

Below the counts, it lists each item with its sheet and cell, such as Products!E2 formula text 'In stock'. Use that list as your to-do list for Step 2. If your workbook has charts, text boxes, pivot tables, or a macro project, they show up in the counts too.

The README describes the sample workbook, lists file hashes, and links the scripts that build it, so you can repeat the test.

What Happened to Our Test Workbook

We ran the sample workbook through the code that BookTranslator's spreadsheet handler uses, reproduced locally on 2026-11-01 with the same library (ExcelJS 4.4.0). Instead of a real translation, we used a placeholder that adds "[DE]" in front of each cell's text. That keeps the language model out of the test, so the results show only what the file handling sends, keeps, and drops.

The handler reads each sheet cell by cell. It sends a cell for translation only if the cell holds a plain text value, and skips any text made only of digits, punctuation, and symbols. Everything else in the cell grid is copied unchanged. BookTranslator then returns two files: a translated workbook and a bilingual workbook.

The translated workbook

This is the file to use. All 6 formulas, 7 numbers and dates, the currency and date formats, the merged cells, the note, the dropdown rule, and the named range came back unchanged. The 9 header cells and the other plain text cells were translated in place. Three results need attention:

Text inside formulas stays in the source language. The Status column used =IF(D2>5,"In stock","Low stock"). A formula is not a text cell, so the handler never reads it, and "In stock" stays in English in every row. The same applies to text joined with & or CONCAT, and to text inside HYPERLINK.

A translated dropdown value no longer matches its list. Cell H2 had a dropdown that allowed "Stationery, Office, Art". The cell's value was translated, but the list is stored in the validation rule, not in a cell, so it was not. Our checker's compare mode reported it like this:

Problems: 3
  Products!A3: code changed: 'A-77' -> '[DE] A-77'
  Products!A4: code changed: 'B-09' -> '[DE] B-09'
  Products!H2: '[DE] Stationery' is not in its dropdown list ['Art', 'Office', 'Stationery']

Excel keeps a value that breaks its validation rule, but the next person to open the dropdown sees only the old choices, and Data > Circle Invalid Data will flag the cell.

Codes with letters are sent to the translator. "00123" was skipped because it holds only digits. "A-77" and "B-09" were sent, because they contain a letter. Whether a code comes back unchanged then depends on the model; nothing in the file handling protects it. A SKU that comes back as "A-77-Artikel" breaks every lookup that uses it.

The bilingual workbook

The bilingual file inserts a translation column to the right of every column that had at least one translated cell, with headers such as "Name (Translated)". It moves cell values to their new columns, but it does not move cell formats or update formulas. In our test:

  • the price format $#,##0.00 stayed in column C, which now holds product names, while the prices moved to column E without it;
  • the date format stayed in column G, which now holds the quantity, so a quantity of 10 displayed as a date;
  • =C2*D2 moved to column K but still pointed at C2 and D2, which now hold the product name and its translation, so it can no longer return 45;
  • on the Summary sheet, =SUM(Products!F2:F4) now added up an empty translation column.

So the bilingual workbook is for reading the source and the translation side by side, not for calculating. Do not edit it or copy formulas out of it.

Charts and macros

In a separate copy of the workbook, we added a chart and a macro project, stored the way Excel stores them. Neither one was in the translated or the bilingual file. ExcelJS reads and writes worksheets, styles, shared text, pictures, tables, and comments, and has no code for chart parts or the VBA project, so it leaves them out when it saves. The same code has nothing for pivot tables, so expect pivot tables to be dropped too, although we did not test one. The handler also saves its output as an .xlsx file, which cannot hold macros.

One more limit of the test: we built the sample workbook with ExcelJS itself, which is the friendliest case for keeping formats, merges, and validation rules. A workbook saved by Excel can contain features ExcelJS does not model, so run the compare step below on your own file rather than assuming the same clean result.

Step 2: Prepare the Workbook Before You Upload

Work on a copy. The checker tells you which cells to change.

  1. Move formula text into cells. Put the words in a small "Labels" sheet and point the formula at them: =IF(D2>5,Labels!$A$1,Labels!$A$2). The label cells are plain text, so they get translated, and every formula picks up the translation. This one change usually fixes most of the "formula text" count, because the same phrase tends to repeat down a whole column.
  2. Move dropdown lists into cells. In Data > Data Validation, change the Source from a typed list (Stationery,Office,Art) to a range on the Labels sheet (=Labels!$B$1:$B$3). The list values then get translated along with the cells that use them. Check a few cells afterward: the dropdown only accepts the translated value if the model translated "Stationery" the same way in both places.
  3. Clear mixed formatting. A cell with one bold or colored word is stored as formatted runs and skipped entirely. Select the cell and choose Home > Clear > Clear Formats, or retype it, then reapply the bold after translation. If you have many of these, note them down first.
  4. Decide what to do with notes and comments. They are not translated. Delete review notes you do not want sent to a translation service, and translate the rest by hand.
  5. Save macro workbooks as .xlsx. Keep your .xlsm as the master. Translate an .xlsx copy, then either copy the translated text columns back into the master (Paste Special > Values, text columns only, so you do not overwrite formulas) or export the VBA modules and import them into the translated file.
  6. Leave charts for later. A chart has little text: a title, axis titles, and a legend that usually comes from header cells. It is often quicker to rebuild the chart in the translated workbook from the same ranges, or to paste the translated text columns back into the original workbook so its charts and pivot tables update themselves.

Step 3: Translate the Whole File

Upload the .xlsx on the document translator page, choose the target language, and check the price shown before you pay. A whole-file upload translates every text cell on every sheet in one task, which makes it easier to keep a product name the same in row 3 and row 3,000. Our guide to building a translation glossary explains how to pin down terms that must not vary.

When the task finishes, the History page offers both downloads. Use the translated workbook. Open the bilingual workbook only to review wording with someone who reads both languages.

If you work in Google Sheets, there are two other routes. Google Translate's Documents tab accepts .xlsx files up to 10 MB (Google Translate Help); our Google Docs translation guide compares its options. And Sheets has a GOOGLETRANSLATE(text, source_language, target_language) function (Google Docs Editors Help) that you can fill down a new column next to the source. That is convenient for one column of short labels, but the results are formulas, so paste them as values before you share the sheet. DeepL also translates documents; see what its document limits mean in practice. Whatever you use, run the checker on the source first: text inside formulas, links, and charts sits in the same places no matter which tool reads the file.

Step 4: Check the Translated Workbook

  1. Run the compare mode. Put the source and the translated file side by side:

    python3 check_xlsx_text.py --compare "Price list.xlsx" "Price list (translated).xlsx"
    

    It checks that every formula, number, and date is unchanged, that codes with letters came back exactly as they were, and that every dropdown value is in its list. Use it on the translated workbook only. Because the bilingual file shifts columns, nearly every cell would be reported.

  2. Recalculate. If a formula still shows the old text after you fixed the labels, press F9 (or Formulas > Calculate Now).

  3. Translate the leftovers. Use the checker's list from Step 1: link text, notes, chart titles, and any cells you cleared of formatting.

  4. Look for cut-off text. Translations are often longer than the source, and short strings grow the most. The W3C cites IBM guidelines that put the average expansion from English into European languages at 200–300% for text up to 10 characters (W3C). Column headers are short, so widen columns or turn on Wrap Text where they get cut off.

  5. Check number and date display. The values were not touched, but "4.50" may need to show as "4,50" for a German reader. That is a cell format or a regional setting, not a translation.

  6. Do not "fix" function names. If a colleague's French Excel shows SOMME instead of SUM, that is Excel displaying its own localized function names; the formula is the same.

  7. Set right-to-left sheets. For Arabic, Hebrew, Persian, or Urdu, turn on Page Layout > Sheet Right-to-Left and check cell alignment.

  8. Have a fluent reader review it if it goes to customers, such as a price list or a product catalog. A machine translation is a good first draft, not a final one.

CSV and TSV Files

A .csv file has no formulas, formats, or dropdowns, so most of the problems above disappear. Three things are different:

  • The header row is not translated. The handler treats the first row as headers and translates data rows only. Translate the headers by hand, or copy them into a data row before uploading and move them back afterward.
  • A column is translated as a whole. If any cell in a column has a letter in it, every cell in that column that has a letter in it is sent, codes included. The compare mode reads only .xlsx, so check a CSV code column by hand: copy it from both files into one sheet and compare the two columns with =EXACT(A2,B2).
  • A CSV comes back comma-separated. Whatever delimiter the source used, the translated CSV uses commas; a .tsv file keeps its tabs. In our test, a semicolon-separated CSV came back separated by commas, with decimal commas such as "4,50" kept inside quotes. The file is UTF-8 without a byte order mark. Microsoft says Excel opens a UTF-8 CSV normally when it has that mark, and otherwise recommends importing it with Data > Get Data > From Text/CSV (Microsoft Support). If you double-click the file and see garbled accents, import it that way instead.

If your data lives in a workbook with formulas, translate the .xlsx. Exporting to CSV to translate it throws away every formula.

Common Problems

ProblemLikely causeWhat to do
A whole column still says "In stock"The words are inside an IF formulaMove them to label cells and point the formula at them
A dropdown rejects the translated valueThe allowed values are typed into the validation ruleChange the rule's Source to a cell range and translate the range
A product code changedIt contains letters, so it was sent to the translatorFix it from the source; run the compare mode on every delivery
One cell was not translated at allIt has mixed formatting, or it is a linkClear the formatting or edit the link text, then retranslate or fix by hand
The chart or the macros are goneThe library used to rewrite the file does not save themTranslate an .xlsx copy and move the translated text back into the original
Totals are wrong in the bilingual fileIts added columns shift values but not formulas or formatsUse the translated workbook for any calculation
Accents look garbled in a translated CSVExcel guessed the wrong encodingImport it with Data > Get Data > From Text/CSV
The upload is refusedThe file is .xls, or it needs a password to openSave it as a normal .xlsx without an open password (sheet protection alone is fine)

The same idea applies to slides: a PowerPoint deck also keeps text in places a translator skips, and the checker for that article works the same way as this one.

Matsalwa lama fambelanaka