[{"data":1,"prerenderedAt":2630},["ShallowReactive",2],{"doc:\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Flocalise-an-excel-report-for-other-languages-and-locales":3,"surround:\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Flocalise-an-excel-report-for-other-languages-and-locales":2596,"ancestors:\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Flocalise-an-excel-report-for-other-languages-and-locales":2605,"children:\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Flocalise-an-excel-report-for-other-languages-and-locales":2610,"related:\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Flocalise-an-excel-report-for-other-languages-and-locales":2611},{"id":4,"title":5,"body":6,"dateModified":2563,"datePublished":2563,"description":2564,"extension":2565,"faq":2566,"keyword":2575,"kind":2576,"meta":2577,"navigation":137,"path":2585,"seo":2586,"slug":2589,"stem":2590,"topics":2591,"type":2594,"__hash__":2595},"docs\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Flocalise-an-excel-report-for-other-languages-and-locales\u002Findex.md","Localise an Excel Report for Other Languages and Locales",{"type":7,"value":8,"toc":2550},"minimark",[9,24,29,57,68,72,95,407,556,587,735,739,742,930,949,953,968,1257,1315,1330,1334,1337,1521,1578,1586,1590,1593,2075,2197,2204,2281,2284,2288,2326,2410,2414,2456,2460,2469,2473,2479,2496,2502,2508,2512,2546],[10,11,12,13,17,18,23],"p",{},"A report that works for readers in London often goes wrong in Berlin or Paris, and the usual mistake is made with good intentions: formatting numbers and dates as strings in Python, in the reader's style, before writing them. The cell then shows ",[14,15,16],"code",{},"1.234.567,89"," as text, cannot be summed, and looks wrong to anyone with different settings. Excel already localises a great deal by itself if the file is written the right way. This page shows what Excel adapts automatically, what you must pin explicitly, and how to check the result under several locales without owning several computers. It is part of ",[19,20,22],"a",{"href":21},"\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002F","Applying Number and Date Formats in Excel",".",[25,26,28],"h2",{"id":27},"prerequisites","Prerequisites",[30,31,36],"pre",{"className":32,"code":33,"language":34,"meta":35,"style":35},"language-bash shiki shiki-themes github-light github-dark-high-contrast","pip install openpyxl pandas\n","bash","",[14,37,38],{"__ignoreMap":35},[39,40,43,47,51,54],"span",{"class":41,"line":42},"line",1,[39,44,46],{"class":45},"sMTad","pip",[39,48,50],{"class":49},"srMev"," install",[39,52,53],{"class":49}," openpyxl",[39,55,56],{"class":49}," pandas\n",[10,58,59,60,63,64,67],{},"The checks render the workbook with LibreOffice under different locale settings, using the ",[14,61,62],{},"LC_ALL"," environment variable, and read the result with ",[14,65,66],{},"pdftotext",". Excel applies the same rules from the reader's Windows or macOS regional settings.",[25,69,71],{"id":70},"step-1-what-adapts-by-itself","Step 1 — What adapts by itself",[10,73,74,75,78,79,82,83,87,88,90,91,94],{},"A number format code in an ",[14,76,77],{},".xlsx"," file is locale-neutral: in ",[14,80,81],{},"#,##0.00",", the comma ",[84,85,86],"em",{},"means"," \"thousands separator\" and the dot ",[84,89,86],{}," \"decimal separator\". The reader's application substitutes its own characters. The same goes for the built-in short date, which openpyxl calls ",[14,92,93],{},"mm-dd-yy"," (format number 14): it is not a fixed pattern but \"the reader's short date\". Write a small sheet and render it under three locales:",[30,96,100],{"className":97,"code":98,"language":99,"meta":35,"style":35},"language-python shiki shiki-themes github-light github-dark-high-contrast","import datetime as dt\nfrom openpyxl import Workbook\n\nwb = Workbook()\nws = wb.active\nws.append([\"Label\", \"Value\", \"Format\"])\nrows = [\n    (\"Revenue\", 1234567.891, \"#,##0.00\"),\n    (\"Short date\", dt.date(2026, 10, 5), \"mm-dd-yy\"),\n    (\"Month\", dt.date(2026, 10, 5), \"mmmm yyyy\"),\n    (\"Fixed pattern\", dt.date(2026, 10, 5), \"dd\u002Fmm\u002Fyyyy\"),\n]\nfor label, value, fmt in rows:\n    ws.append([label, value, fmt])\n    ws.cell(row=ws.max_row, column=2).number_format = fmt\nws.column_dimensions[\"A\"].width = 16\nws.column_dimensions[\"B\"].width = 22\nwb.save(\"neutral.xlsx\")\n","python",[14,101,102,118,132,139,151,162,185,196,219,251,278,305,311,326,332,363,380,395],{"__ignoreMap":35},[39,103,104,108,112,115],{"class":41,"line":42},[39,105,107],{"class":106},"s-kum","import",[39,109,111],{"class":110},"skGVy"," datetime ",[39,113,114],{"class":106},"as",[39,116,117],{"class":110}," dt\n",[39,119,121,124,127,129],{"class":41,"line":120},2,[39,122,123],{"class":106},"from",[39,125,126],{"class":110}," openpyxl ",[39,128,107],{"class":106},[39,130,131],{"class":110}," Workbook\n",[39,133,135],{"class":41,"line":134},3,[39,136,138],{"emptyLinePlaceholder":137},true,"\n",[39,140,142,145,148],{"class":41,"line":141},4,[39,143,144],{"class":110},"wb ",[39,146,147],{"class":106},"=",[39,149,150],{"class":110}," Workbook()\n",[39,152,154,157,159],{"class":41,"line":153},5,[39,155,156],{"class":110},"ws ",[39,158,147],{"class":106},[39,160,161],{"class":110}," wb.active\n",[39,163,165,168,171,174,177,179,182],{"class":41,"line":164},6,[39,166,167],{"class":110},"ws.append([",[39,169,170],{"class":49},"\"Label\"",[39,172,173],{"class":110},", ",[39,175,176],{"class":49},"\"Value\"",[39,178,173],{"class":110},[39,180,181],{"class":49},"\"Format\"",[39,183,184],{"class":110},"])\n",[39,186,188,191,193],{"class":41,"line":187},7,[39,189,190],{"class":110},"rows ",[39,192,147],{"class":106},[39,194,195],{"class":110}," [\n",[39,197,199,202,205,207,211,213,216],{"class":41,"line":198},8,[39,200,201],{"class":110},"    (",[39,203,204],{"class":49},"\"Revenue\"",[39,206,173],{"class":110},[39,208,210],{"class":209},"sP0c6","1234567.891",[39,212,173],{"class":110},[39,214,215],{"class":49},"\"#,##0.00\"",[39,217,218],{"class":110},"),\n",[39,220,222,224,227,230,233,235,238,240,243,246,249],{"class":41,"line":221},9,[39,223,201],{"class":110},[39,225,226],{"class":49},"\"Short date\"",[39,228,229],{"class":110},", dt.date(",[39,231,232],{"class":209},"2026",[39,234,173],{"class":110},[39,236,237],{"class":209},"10",[39,239,173],{"class":110},[39,241,242],{"class":209},"5",[39,244,245],{"class":110},"), ",[39,247,248],{"class":49},"\"mm-dd-yy\"",[39,250,218],{"class":110},[39,252,254,256,259,261,263,265,267,269,271,273,276],{"class":41,"line":253},10,[39,255,201],{"class":110},[39,257,258],{"class":49},"\"Month\"",[39,260,229],{"class":110},[39,262,232],{"class":209},[39,264,173],{"class":110},[39,266,237],{"class":209},[39,268,173],{"class":110},[39,270,242],{"class":209},[39,272,245],{"class":110},[39,274,275],{"class":49},"\"mmmm yyyy\"",[39,277,218],{"class":110},[39,279,281,283,286,288,290,292,294,296,298,300,303],{"class":41,"line":280},11,[39,282,201],{"class":110},[39,284,285],{"class":49},"\"Fixed pattern\"",[39,287,229],{"class":110},[39,289,232],{"class":209},[39,291,173],{"class":110},[39,293,237],{"class":209},[39,295,173],{"class":110},[39,297,242],{"class":209},[39,299,245],{"class":110},[39,301,302],{"class":49},"\"dd\u002Fmm\u002Fyyyy\"",[39,304,218],{"class":110},[39,306,308],{"class":41,"line":307},12,[39,309,310],{"class":110},"]\n",[39,312,314,317,320,323],{"class":41,"line":313},13,[39,315,316],{"class":106},"for",[39,318,319],{"class":110}," label, value, fmt ",[39,321,322],{"class":106},"in",[39,324,325],{"class":110}," rows:\n",[39,327,329],{"class":41,"line":328},14,[39,330,331],{"class":110},"    ws.append([label, value, fmt])\n",[39,333,335,338,342,344,347,350,352,355,358,360],{"class":41,"line":334},15,[39,336,337],{"class":110},"    ws.cell(",[39,339,341],{"class":340},"sa561","row",[39,343,147],{"class":106},[39,345,346],{"class":110},"ws.max_row, ",[39,348,349],{"class":340},"column",[39,351,147],{"class":106},[39,353,354],{"class":209},"2",[39,356,357],{"class":110},").number_format ",[39,359,147],{"class":106},[39,361,362],{"class":110}," fmt\n",[39,364,366,369,372,375,377],{"class":41,"line":365},16,[39,367,368],{"class":110},"ws.column_dimensions[",[39,370,371],{"class":49},"\"A\"",[39,373,374],{"class":110},"].width ",[39,376,147],{"class":106},[39,378,379],{"class":209}," 16\n",[39,381,383,385,388,390,392],{"class":41,"line":382},17,[39,384,368],{"class":110},[39,386,387],{"class":49},"\"B\"",[39,389,374],{"class":110},[39,391,147],{"class":106},[39,393,394],{"class":209}," 22\n",[39,396,398,401,404],{"class":41,"line":397},18,[39,399,400],{"class":110},"wb.save(",[39,402,403],{"class":49},"\"neutral.xlsx\"",[39,405,406],{"class":110},")\n",[30,408,410],{"className":32,"code":409,"language":34,"meta":35,"style":35},"for loc in en_US de_DE fr_FR; do\n  mkdir -p \"$loc\"\n  LC_ALL=$loc.UTF-8 soffice -env:UserInstallation=file:\u002F\u002F$PWD\u002Flo_$loc --headless --convert-to pdf --outdir \"$loc\" neutral.xlsx > \u002Fdev\u002Fnull 2>&1\n  echo \"== $loc\"; pdftotext -layout \"$loc\u002Fneutral.pdf\" - | sed -n '2,5p'\ndone\n",[14,411,412,436,453,510,551],{"__ignoreMap":35},[39,413,414,416,419,421,424,427,430,433],{"class":41,"line":42},[39,415,316],{"class":106},[39,417,418],{"class":110}," loc ",[39,420,322],{"class":106},[39,422,423],{"class":49}," en_US",[39,425,426],{"class":49}," de_DE",[39,428,429],{"class":49}," fr_FR",[39,431,432],{"class":110},"; ",[39,434,435],{"class":106},"do\n",[39,437,438,441,444,447,450],{"class":41,"line":120},[39,439,440],{"class":45},"  mkdir",[39,442,443],{"class":209}," -p",[39,445,446],{"class":49}," \"",[39,448,449],{"class":110},"$loc",[39,451,452],{"class":49},"\"\n",[39,454,455,458,460,462,465,468,471,474,477,479,482,485,488,491,493,495,498,501,504,507],{"class":41,"line":134},[39,456,457],{"class":110},"  LC_ALL",[39,459,147],{"class":106},[39,461,449],{"class":110},[39,463,464],{"class":49},".UTF-8",[39,466,467],{"class":45}," soffice",[39,469,470],{"class":209}," -env:UserInstallation=file:\u002F\u002F",[39,472,473],{"class":110},"$PWD",[39,475,476],{"class":209},"\u002Flo_",[39,478,449],{"class":110},[39,480,481],{"class":209}," --headless",[39,483,484],{"class":209}," --convert-to",[39,486,487],{"class":49}," pdf",[39,489,490],{"class":209}," --outdir",[39,492,446],{"class":49},[39,494,449],{"class":110},[39,496,497],{"class":49},"\"",[39,499,500],{"class":49}," neutral.xlsx",[39,502,503],{"class":106}," >",[39,505,506],{"class":49}," \u002Fdev\u002Fnull",[39,508,509],{"class":106}," 2>&1\n",[39,511,512,515,518,520,522,524,526,529,531,533,536,539,542,545,548],{"class":41,"line":141},[39,513,514],{"class":209},"  echo",[39,516,517],{"class":49}," \"== ",[39,519,449],{"class":110},[39,521,497],{"class":49},[39,523,432],{"class":110},[39,525,66],{"class":45},[39,527,528],{"class":209}," -layout",[39,530,446],{"class":49},[39,532,449],{"class":110},[39,534,535],{"class":49},"\u002Fneutral.pdf\"",[39,537,538],{"class":49}," -",[39,540,541],{"class":106}," |",[39,543,544],{"class":45}," sed",[39,546,547],{"class":209}," -n",[39,549,550],{"class":49}," '2,5p'\n",[39,552,553],{"class":41,"line":153},[39,554,555],{"class":106},"done\n",[10,557,558,559,173,562,564,565,568,569,173,572,564,575,578,579,582,583,586],{},"From one file: ",[14,560,561],{},"1,234,567.89",[14,563,16],{}," and ",[14,566,567],{},"1 234 567,89","; the short date as ",[14,570,571],{},"10\u002F5\u002F2026",[14,573,574],{},"05.10.2026",[14,576,577],{},"05\u002F10\u002F2026","; the month as October, Oktober, octobre. Even ",[14,580,581],{},"dd\u002Fmm\u002Fyyyy"," changed in German, because ",[14,584,585],{},"\u002F"," in a date format stands for \"the date separator\". Nothing in the file had to change.",[588,589,597,598,597,602,597,606,597,614,597,623,597,630,597,634,597,638,597,642,597,646,597,650,597,654,597,659,597,664,597,666,597,668,597,670,597,672,597,674,597,676,597,679,597,683,597,685,597,687,597,689,597,691,597,693,597,695,597,698,597,702,597,704,597,707,597,709,597,712,597,714,597,717,597,720,597,723,597,725,597,727,597,729,597,731,597,733],"svg",{"viewBox":590,"role":591,"ariaLabelledBy":592,"xmlns":595,"style":596},"163 0 434 172","img",[593,594],"lc-render-t","lc-render-d","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","width:100%;max-width:434px;height:auto;display:block;margin:1.5rem auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif","\n  ",[599,600,601],"title",{"id":593},"One file, three locales",[603,604,605],"desc",{"id":594},"A table of the same four cells rendered under English US, German and French settings. The revenue uses each locale's separators, the short date follows each locale's order and separator, the month name is translated, and even the fixed dd\u002Fmm\u002Fyyyy pattern uses the German dot separator.",[607,608],"rect",{"x":609,"y":610,"width":611,"height":612,"fill":613},"163","0","434","172","#ffffff",[607,615],{"x":616,"y":617,"width":618,"height":619,"rx":610,"fill":620,"stroke":621,"style":622},"179.1","16.0","96.4","28.0","#f0f4ff","var(--brand,#5b5cf0)","stroke-width:1.5px",[624,625,629],"text",{"x":626,"y":627,"style":628},"227.3","35.0","font-size:11px;font-weight:700;fill:var(--brand-strong,#4338ca);text-anchor:middle","Cell",[607,631],{"x":632,"y":617,"width":633,"height":619,"rx":610,"fill":620,"stroke":621,"style":622},"275.5","102.4",[624,635,637],{"x":636,"y":627,"style":628},"326.7","en-US",[607,639],{"x":640,"y":617,"width":641,"height":619,"rx":610,"fill":620,"stroke":621,"style":622},"377.9","102.3",[624,643,645],{"x":644,"y":627,"style":628},"429.1","de-DE",[607,647],{"x":648,"y":617,"width":649,"height":619,"rx":610,"fill":620,"stroke":621,"style":622},"480.3","100.6",[624,651,653],{"x":652,"y":627,"style":628},"530.6","fr-FR",[607,655],{"x":616,"y":656,"width":618,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},"44.0","var(--line,#cdd5e6)","stroke-width:1px",[624,660,663],{"x":626,"y":661,"style":662},"63.0","font-size:11px;font-weight:400;fill:var(--text,#172033);text-anchor:middle","Revenue",[607,665],{"x":632,"y":656,"width":633,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,667,561],{"x":636,"y":661,"style":662},[607,669],{"x":640,"y":656,"width":641,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,671,16],{"x":644,"y":661,"style":662},[607,673],{"x":648,"y":656,"width":649,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,675,567],{"x":652,"y":661,"style":662},[607,677],{"x":616,"y":678,"width":618,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},"72.0",[624,680,682],{"x":626,"y":681,"style":662},"91.0","Short date",[607,684],{"x":632,"y":678,"width":633,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,686,571],{"x":636,"y":681,"style":662},[607,688],{"x":640,"y":678,"width":641,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,690,574],{"x":644,"y":681,"style":662},[607,692],{"x":648,"y":678,"width":649,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,694,577],{"x":652,"y":681,"style":662},[607,696],{"x":616,"y":697,"width":618,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},"100.0",[624,699,701],{"x":626,"y":700,"style":662},"119.0","Month",[607,703],{"x":632,"y":697,"width":633,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,705,706],{"x":636,"y":700,"style":662},"October 2026",[607,708],{"x":640,"y":697,"width":641,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,710,711],{"x":644,"y":700,"style":662},"Oktober 2026",[607,713],{"x":648,"y":697,"width":649,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,715,716],{"x":652,"y":700,"style":662},"octobre 2026",[607,718],{"x":616,"y":719,"width":618,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},"128.0",[624,721,581],{"x":626,"y":722,"style":662},"147.0",[607,724],{"x":632,"y":719,"width":633,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,726,577],{"x":636,"y":722,"style":662},[607,728],{"x":640,"y":719,"width":641,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,730,574],{"x":644,"y":722,"style":662},[607,732],{"x":648,"y":719,"width":649,"height":619,"rx":610,"fill":613,"stroke":657,"style":658},[624,734,577],{"x":652,"y":722,"style":662},[25,736,738],{"id":737},"step-2-never-pre-format-numbers-and-dates-as-text","Step 2 — Never pre-format numbers and dates as text",[10,740,741],{},"The consequence of Step 1 is the most important rule: write numbers and dates as values with format codes, never as formatted strings. A string formatted for Germany is wrong for everyone else and useless for calculation:",[30,743,745],{"className":97,"code":744,"language":99,"meta":35,"style":35},"from openpyxl import load_workbook\n\nwb = Workbook()\nws = wb.active\nws[\"A1\"] = f\"{1234567.891:,.2f}\".replace(\",\", \"X\").replace(\".\", \",\").replace(\"X\", \".\")   # the tempting mistake\nws[\"A2\"] = 1234567.891\nws[\"A2\"].number_format = \"#,##0.00\"\nws[\"A3\"] = \"=SUM(A1:A2)\"\nwb.save(\"strings_vs_values.xlsx\")\nprint({c: (repr(ws[c].value), ws[c].data_type) for c in (\"A1\", \"A2\")})\n",[14,746,747,758,762,770,778,846,860,874,888,897],{"__ignoreMap":35},[39,748,749,751,753,755],{"class":41,"line":42},[39,750,123],{"class":106},[39,752,126],{"class":110},[39,754,107],{"class":106},[39,756,757],{"class":110}," load_workbook\n",[39,759,760],{"class":41,"line":120},[39,761,138],{"emptyLinePlaceholder":137},[39,763,764,766,768],{"class":41,"line":134},[39,765,144],{"class":110},[39,767,147],{"class":106},[39,769,150],{"class":110},[39,771,772,774,776],{"class":41,"line":141},[39,773,156],{"class":110},[39,775,147],{"class":106},[39,777,161],{"class":110},[39,779,780,783,786,789,791,794,796,800,802,805,808,810,813,816,818,821,824,827,829,831,833,835,837,839,842],{"class":41,"line":153},[39,781,782],{"class":110},"ws[",[39,784,785],{"class":49},"\"A1\"",[39,787,788],{"class":110},"] ",[39,790,147],{"class":106},[39,792,793],{"class":106}," f",[39,795,497],{"class":49},[39,797,799],{"class":798},"sSjpA","{",[39,801,210],{"class":209},[39,803,804],{"class":106},":,.2f",[39,806,807],{"class":798},"}",[39,809,497],{"class":49},[39,811,812],{"class":110},".replace(",[39,814,815],{"class":49},"\",\"",[39,817,173],{"class":110},[39,819,820],{"class":49},"\"X\"",[39,822,823],{"class":110},").replace(",[39,825,826],{"class":49},"\".\"",[39,828,173],{"class":110},[39,830,815],{"class":49},[39,832,823],{"class":110},[39,834,820],{"class":49},[39,836,173],{"class":110},[39,838,826],{"class":49},[39,840,841],{"class":110},")   ",[39,843,845],{"class":844},"s-wDw","# the tempting mistake\n",[39,847,848,850,853,855,857],{"class":41,"line":164},[39,849,782],{"class":110},[39,851,852],{"class":49},"\"A2\"",[39,854,788],{"class":110},[39,856,147],{"class":106},[39,858,859],{"class":209}," 1234567.891\n",[39,861,862,864,866,869,871],{"class":41,"line":187},[39,863,782],{"class":110},[39,865,852],{"class":49},[39,867,868],{"class":110},"].number_format ",[39,870,147],{"class":106},[39,872,873],{"class":49}," \"#,##0.00\"\n",[39,875,876,878,881,883,885],{"class":41,"line":198},[39,877,782],{"class":110},[39,879,880],{"class":49},"\"A3\"",[39,882,788],{"class":110},[39,884,147],{"class":106},[39,886,887],{"class":49}," \"=SUM(A1:A2)\"\n",[39,889,890,892,895],{"class":41,"line":221},[39,891,400],{"class":110},[39,893,894],{"class":49},"\"strings_vs_values.xlsx\"",[39,896,406],{"class":110},[39,898,899,902,905,908,911,913,916,918,921,923,925,927],{"class":41,"line":253},[39,900,901],{"class":209},"print",[39,903,904],{"class":110},"({c: (",[39,906,907],{"class":209},"repr",[39,909,910],{"class":110},"(ws[c].value), ws[c].data_type) ",[39,912,316],{"class":106},[39,914,915],{"class":110}," c ",[39,917,322],{"class":106},[39,919,920],{"class":110}," (",[39,922,785],{"class":49},[39,924,173],{"class":110},[39,926,852],{"class":49},[39,928,929],{"class":110},")})\n",[10,931,932,935,936,939,940,943,944,948],{},[14,933,934],{},"A1"," is text and ",[14,937,938],{},"SUM"," ignores it; ",[14,941,942],{},"A2"," is a number that every reader sees in their own format. ",[19,945,947],{"href":946},"\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-number-stored-as-text-warnings-in-excel-output\u002F","Fix \"Number Stored as Text\" Warnings in Excel Output"," covers cleaning up files where this has already happened.",[25,950,952],{"id":951},"step-3-pin-the-language-when-it-must-not-follow-the-reader","Step 3 — Pin the language when it must not follow the reader",[10,954,955,956,959,960,963,964,967],{},"Sometimes the report's language is fixed: a German-language report should say \"Oktober\" even when opened on an English computer. Prefix the format with a locale tag, ",[14,957,958],{},"[$-407]"," for German, ",[14,961,962],{},"[$-40C]"," for French, ",[14,965,966],{},"[$-415]"," for Polish; the number is the Windows locale ID in hexadecimal:",[30,969,971],{"className":97,"code":970,"language":99,"meta":35,"style":35},"LOCALES = {\"de\": \"407\", \"fr\": \"40C\", \"pl\": \"415\"}\n\nwb = Workbook()\nws = wb.active\nfor row, (lang, lcid) in enumerate(LOCALES.items(), start=1):\n    ws.cell(row=row, column=1, value=lang)\n    cell = ws.cell(row=row, column=2, value=dt.date(2026, 10, 5))\n    cell.number_format = f\"[$-{lcid}]dddd d mmmm yyyy\"\nws.cell(row=4, column=1, value=\"de-DE tag\")\nws.cell(row=4, column=2, value=dt.date(2026, 10, 5)).number_format = \"[$-de-DE]dddd d mmmm yyyy\"\nws.column_dimensions[\"B\"].width = 34\nwb.save(\"pinned.xlsx\")\n",[14,972,973,1016,1020,1028,1036,1067,1094,1138,1160,1191,1235,1248],{"__ignoreMap":35},[39,974,975,978,981,984,987,990,993,995,998,1000,1003,1005,1008,1010,1013],{"class":41,"line":42},[39,976,977],{"class":209},"LOCALES",[39,979,980],{"class":106}," =",[39,982,983],{"class":110}," {",[39,985,986],{"class":49},"\"de\"",[39,988,989],{"class":110},": ",[39,991,992],{"class":49},"\"407\"",[39,994,173],{"class":110},[39,996,997],{"class":49},"\"fr\"",[39,999,989],{"class":110},[39,1001,1002],{"class":49},"\"40C\"",[39,1004,173],{"class":110},[39,1006,1007],{"class":49},"\"pl\"",[39,1009,989],{"class":110},[39,1011,1012],{"class":49},"\"415\"",[39,1014,1015],{"class":110},"}\n",[39,1017,1018],{"class":41,"line":120},[39,1019,138],{"emptyLinePlaceholder":137},[39,1021,1022,1024,1026],{"class":41,"line":134},[39,1023,144],{"class":110},[39,1025,147],{"class":106},[39,1027,150],{"class":110},[39,1029,1030,1032,1034],{"class":41,"line":141},[39,1031,156],{"class":110},[39,1033,147],{"class":106},[39,1035,161],{"class":110},[39,1037,1038,1040,1043,1045,1048,1051,1053,1056,1059,1061,1064],{"class":41,"line":153},[39,1039,316],{"class":106},[39,1041,1042],{"class":110}," row, (lang, lcid) ",[39,1044,322],{"class":106},[39,1046,1047],{"class":209}," enumerate",[39,1049,1050],{"class":110},"(",[39,1052,977],{"class":209},[39,1054,1055],{"class":110},".items(), ",[39,1057,1058],{"class":340},"start",[39,1060,147],{"class":106},[39,1062,1063],{"class":209},"1",[39,1065,1066],{"class":110},"):\n",[39,1068,1069,1071,1073,1075,1078,1080,1082,1084,1086,1089,1091],{"class":41,"line":164},[39,1070,337],{"class":110},[39,1072,341],{"class":340},[39,1074,147],{"class":106},[39,1076,1077],{"class":110},"row, ",[39,1079,349],{"class":340},[39,1081,147],{"class":106},[39,1083,1063],{"class":209},[39,1085,173],{"class":110},[39,1087,1088],{"class":340},"value",[39,1090,147],{"class":106},[39,1092,1093],{"class":110},"lang)\n",[39,1095,1096,1099,1101,1104,1106,1108,1110,1112,1114,1116,1118,1120,1122,1125,1127,1129,1131,1133,1135],{"class":41,"line":187},[39,1097,1098],{"class":110},"    cell ",[39,1100,147],{"class":106},[39,1102,1103],{"class":110}," ws.cell(",[39,1105,341],{"class":340},[39,1107,147],{"class":106},[39,1109,1077],{"class":110},[39,1111,349],{"class":340},[39,1113,147],{"class":106},[39,1115,354],{"class":209},[39,1117,173],{"class":110},[39,1119,1088],{"class":340},[39,1121,147],{"class":106},[39,1123,1124],{"class":110},"dt.date(",[39,1126,232],{"class":209},[39,1128,173],{"class":110},[39,1130,237],{"class":209},[39,1132,173],{"class":110},[39,1134,242],{"class":209},[39,1136,1137],{"class":110},"))\n",[39,1139,1140,1143,1145,1147,1150,1152,1155,1157],{"class":41,"line":198},[39,1141,1142],{"class":110},"    cell.number_format ",[39,1144,147],{"class":106},[39,1146,793],{"class":106},[39,1148,1149],{"class":49},"\"[$-",[39,1151,799],{"class":798},[39,1153,1154],{"class":110},"lcid",[39,1156,807],{"class":798},[39,1158,1159],{"class":49},"]dddd d mmmm yyyy\"\n",[39,1161,1162,1165,1167,1169,1172,1174,1176,1178,1180,1182,1184,1186,1189],{"class":41,"line":221},[39,1163,1164],{"class":110},"ws.cell(",[39,1166,341],{"class":340},[39,1168,147],{"class":106},[39,1170,1171],{"class":209},"4",[39,1173,173],{"class":110},[39,1175,349],{"class":340},[39,1177,147],{"class":106},[39,1179,1063],{"class":209},[39,1181,173],{"class":110},[39,1183,1088],{"class":340},[39,1185,147],{"class":106},[39,1187,1188],{"class":49},"\"de-DE tag\"",[39,1190,406],{"class":110},[39,1192,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1230,1232],{"class":41,"line":253},[39,1194,1164],{"class":110},[39,1196,341],{"class":340},[39,1198,147],{"class":106},[39,1200,1171],{"class":209},[39,1202,173],{"class":110},[39,1204,349],{"class":340},[39,1206,147],{"class":106},[39,1208,354],{"class":209},[39,1210,173],{"class":110},[39,1212,1088],{"class":340},[39,1214,147],{"class":106},[39,1216,1124],{"class":110},[39,1218,232],{"class":209},[39,1220,173],{"class":110},[39,1222,237],{"class":209},[39,1224,173],{"class":110},[39,1226,242],{"class":209},[39,1228,1229],{"class":110},")).number_format ",[39,1231,147],{"class":106},[39,1233,1234],{"class":49}," \"[$-de-DE]dddd d mmmm yyyy\"\n",[39,1236,1237,1239,1241,1243,1245],{"class":41,"line":280},[39,1238,368],{"class":110},[39,1240,387],{"class":49},[39,1242,374],{"class":110},[39,1244,147],{"class":106},[39,1246,1247],{"class":209}," 34\n",[39,1249,1250,1252,1255],{"class":41,"line":307},[39,1251,400],{"class":110},[39,1253,1254],{"class":49},"\"pinned.xlsx\"",[39,1256,406],{"class":110},[30,1258,1260],{"className":32,"code":1259,"language":34,"meta":35,"style":35},"LC_ALL=en_US.UTF-8 soffice -env:UserInstallation=file:\u002F\u002F$PWD\u002Flo_en_US --headless --convert-to pdf pinned.xlsx > \u002Fdev\u002Fnull 2>&1\npdftotext -layout pinned.pdf - | sed -n '1,4p'\n",[14,1261,1262,1295],{"__ignoreMap":35},[39,1263,1264,1266,1268,1271,1273,1275,1277,1280,1282,1284,1286,1289,1291,1293],{"class":41,"line":42},[39,1265,62],{"class":110},[39,1267,147],{"class":106},[39,1269,1270],{"class":49},"en_US.UTF-8",[39,1272,467],{"class":45},[39,1274,470],{"class":209},[39,1276,473],{"class":110},[39,1278,1279],{"class":209},"\u002Flo_en_US",[39,1281,481],{"class":209},[39,1283,484],{"class":209},[39,1285,487],{"class":49},[39,1287,1288],{"class":49}," pinned.xlsx",[39,1290,503],{"class":106},[39,1292,506],{"class":49},[39,1294,509],{"class":106},[39,1296,1297,1299,1301,1304,1306,1308,1310,1312],{"class":41,"line":120},[39,1298,66],{"class":45},[39,1300,528],{"class":209},[39,1302,1303],{"class":49}," pinned.pdf",[39,1305,538],{"class":49},[39,1307,541],{"class":106},[39,1309,544],{"class":45},[39,1311,547],{"class":209},[39,1313,1314],{"class":49}," '1,4p'\n",[10,1316,1317,1318,1321,1322,1325,1326,1329],{},"Rendered on an English system, the month and day names are German, French and Polish, and the tag handles grammar too: Polish uses the genitive ",[84,1319,1320],{},"października"," after a day number, not the nominative ",[84,1323,1324],{},"październik"," of a month on its own. That is one more reason to let the format do the work instead of building date strings from a list of month names in Python. Use the hexadecimal form: the fourth row uses a tag written as a language name, ",[14,1327,1328],{},"[$-de-DE]",", and LibreOffice did not understand it, showing the raw date serial number instead of a date.",[25,1331,1333],{"id":1332},"step-4-currency-symbols","Step 4 — Currency symbols",[10,1335,1336],{},"Currency formats put the symbol in a bracketed block with its own locale ID, which also decides whether it goes before or after the number in the format code you write:",[30,1338,1340],{"className":97,"code":1339,"language":99,"meta":35,"style":35},"wb = Workbook()\nws = wb.active\nformats = {\"EUR, German style\": '#,##0.00 [$€-407]', \"EUR, French style\": '#,##0.00 [$€-40C]',\n           \"PLN\": '#,##0.00 [$zł-415]', \"GBP\": '[$£-809]#,##0.00'}\nfor row, (label, fmt) in enumerate(formats.items(), start=1):\n    ws.cell(row=row, column=1, value=label)\n    ws.cell(row=row, column=2, value=1234567.891).number_format = fmt\nws.column_dimensions[\"A\"].width = 20\nws.column_dimensions[\"B\"].width = 20\nwb.save(\"currency.xlsx\")\n",[14,1341,1342,1350,1358,1388,1410,1432,1457,1487,1500,1512],{"__ignoreMap":35},[39,1343,1344,1346,1348],{"class":41,"line":42},[39,1345,144],{"class":110},[39,1347,147],{"class":106},[39,1349,150],{"class":110},[39,1351,1352,1354,1356],{"class":41,"line":120},[39,1353,156],{"class":110},[39,1355,147],{"class":106},[39,1357,161],{"class":110},[39,1359,1360,1363,1365,1367,1370,1372,1375,1377,1380,1382,1385],{"class":41,"line":134},[39,1361,1362],{"class":110},"formats ",[39,1364,147],{"class":106},[39,1366,983],{"class":110},[39,1368,1369],{"class":49},"\"EUR, German style\"",[39,1371,989],{"class":110},[39,1373,1374],{"class":49},"'#,##0.00 [$€-407]'",[39,1376,173],{"class":110},[39,1378,1379],{"class":49},"\"EUR, French style\"",[39,1381,989],{"class":110},[39,1383,1384],{"class":49},"'#,##0.00 [$€-40C]'",[39,1386,1387],{"class":110},",\n",[39,1389,1390,1393,1395,1398,1400,1403,1405,1408],{"class":41,"line":141},[39,1391,1392],{"class":49},"           \"PLN\"",[39,1394,989],{"class":110},[39,1396,1397],{"class":49},"'#,##0.00 [$zł-415]'",[39,1399,173],{"class":110},[39,1401,1402],{"class":49},"\"GBP\"",[39,1404,989],{"class":110},[39,1406,1407],{"class":49},"'[$£-809]#,##0.00'",[39,1409,1015],{"class":110},[39,1411,1412,1414,1417,1419,1421,1424,1426,1428,1430],{"class":41,"line":153},[39,1413,316],{"class":106},[39,1415,1416],{"class":110}," row, (label, fmt) ",[39,1418,322],{"class":106},[39,1420,1047],{"class":209},[39,1422,1423],{"class":110},"(formats.items(), ",[39,1425,1058],{"class":340},[39,1427,147],{"class":106},[39,1429,1063],{"class":209},[39,1431,1066],{"class":110},[39,1433,1434,1436,1438,1440,1442,1444,1446,1448,1450,1452,1454],{"class":41,"line":164},[39,1435,337],{"class":110},[39,1437,341],{"class":340},[39,1439,147],{"class":106},[39,1441,1077],{"class":110},[39,1443,349],{"class":340},[39,1445,147],{"class":106},[39,1447,1063],{"class":209},[39,1449,173],{"class":110},[39,1451,1088],{"class":340},[39,1453,147],{"class":106},[39,1455,1456],{"class":110},"label)\n",[39,1458,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485],{"class":41,"line":187},[39,1460,337],{"class":110},[39,1462,341],{"class":340},[39,1464,147],{"class":106},[39,1466,1077],{"class":110},[39,1468,349],{"class":340},[39,1470,147],{"class":106},[39,1472,354],{"class":209},[39,1474,173],{"class":110},[39,1476,1088],{"class":340},[39,1478,147],{"class":106},[39,1480,210],{"class":209},[39,1482,357],{"class":110},[39,1484,147],{"class":106},[39,1486,362],{"class":110},[39,1488,1489,1491,1493,1495,1497],{"class":41,"line":198},[39,1490,368],{"class":110},[39,1492,371],{"class":49},[39,1494,374],{"class":110},[39,1496,147],{"class":106},[39,1498,1499],{"class":209}," 20\n",[39,1501,1502,1504,1506,1508,1510],{"class":41,"line":221},[39,1503,368],{"class":110},[39,1505,387],{"class":49},[39,1507,374],{"class":110},[39,1509,147],{"class":106},[39,1511,1499],{"class":209},[39,1513,1514,1516,1519],{"class":41,"line":253},[39,1515,400],{"class":110},[39,1517,1518],{"class":49},"\"currency.xlsx\"",[39,1520,406],{"class":110},[30,1522,1524],{"className":32,"code":1523,"language":34,"meta":35,"style":35},"LC_ALL=de_DE.UTF-8 soffice -env:UserInstallation=file:\u002F\u002F$PWD\u002Flo_de_DE --headless --convert-to pdf currency.xlsx > \u002Fdev\u002Fnull 2>&1\npdftotext -layout currency.pdf - | sed -n '1,4p'\n",[14,1525,1526,1559],{"__ignoreMap":35},[39,1527,1528,1530,1532,1535,1537,1539,1541,1544,1546,1548,1550,1553,1555,1557],{"class":41,"line":42},[39,1529,62],{"class":110},[39,1531,147],{"class":106},[39,1533,1534],{"class":49},"de_DE.UTF-8",[39,1536,467],{"class":45},[39,1538,470],{"class":209},[39,1540,473],{"class":110},[39,1542,1543],{"class":209},"\u002Flo_de_DE",[39,1545,481],{"class":209},[39,1547,484],{"class":209},[39,1549,487],{"class":49},[39,1551,1552],{"class":49}," currency.xlsx",[39,1554,503],{"class":106},[39,1556,506],{"class":49},[39,1558,509],{"class":106},[39,1560,1561,1563,1565,1568,1570,1572,1574,1576],{"class":41,"line":120},[39,1562,66],{"class":45},[39,1564,528],{"class":209},[39,1566,1567],{"class":49}," currency.pdf",[39,1569,538],{"class":49},[39,1571,541],{"class":106},[39,1573,544],{"class":45},[39,1575,547],{"class":209},[39,1577,1314],{"class":49},[10,1579,1580,1581,1585],{},"The separators still follow the reader (German here); the symbol and its position are fixed by the format. ",[19,1582,1584],{"href":1583},"\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Fformat-excel-cells-as-currency-with-python\u002F","Format Excel Cells as Currency with Python"," goes through negative amounts and accounting alignment.",[25,1587,1589],{"id":1588},"step-5-translate-the-labels-from-one-table","Step 5 — Translate the labels from one table",[10,1591,1592],{},"Headers, sheet names and notes are text, and nothing translates them for you. Keep every label in one table keyed by an internal name, and build each language's report from the same data:",[30,1594,1596],{"className":97,"code":1595,"language":99,"meta":35,"style":35},"import pandas as pd\n\nLABELS = {\n    \"sheet\":   {\"en\": \"Sales\", \"de\": \"Umsatz\", \"fr\": \"Ventes\"},\n    \"region\":  {\"en\": \"Region\", \"de\": \"Region\", \"fr\": \"Région\"},\n    \"revenue\": {\"en\": \"Revenue\", \"de\": \"Umsatz\", \"fr\": \"Chiffre d'affaires\"},\n    \"month\":   {\"en\": \"Month\", \"de\": \"Monat\", \"fr\": \"Mois\"},\n}\ndata = pd.DataFrame({\"region\": [\"North\", \"South\"], \"month\": pd.to_datetime([\"2026-10-01\", \"2026-10-01\"]),\n                     \"revenue\": [48250.5, 39120.0]})\n\nfor lang in (\"en\", \"de\", \"fr\"):\n    frame = data.rename(columns={k: LABELS[k][lang] for k in data.columns})\n    with pd.ExcelWriter(f\"sales_{lang}.xlsx\", engine=\"xlsxwriter\", datetime_format=\"mmmm yyyy\") as writer:\n        frame.to_excel(writer, index=False, sheet_name=LABELS[\"sheet\"][lang])\n        ws = writer.sheets[LABELS[\"sheet\"][lang]]\n        ws.set_column(1, 1, 16)\n        ws.set_column(2, 2, 18, writer.book.add_format({\"num_format\": \"#,##0.00\"}))\n    with pd.ExcelFile(f\"sales_{lang}.xlsx\") as book:\n        print(lang, book.sheet_names, list(frame.columns))\n",[14,1597,1598,1610,1614,1624,1661,1695,1728,1761,1765,1808,1826,1830,1853,1886,1937,1968,1987,2005,2033,2060],{"__ignoreMap":35},[39,1599,1600,1602,1605,1607],{"class":41,"line":42},[39,1601,107],{"class":106},[39,1603,1604],{"class":110}," pandas ",[39,1606,114],{"class":106},[39,1608,1609],{"class":110}," pd\n",[39,1611,1612],{"class":41,"line":120},[39,1613,138],{"emptyLinePlaceholder":137},[39,1615,1616,1619,1621],{"class":41,"line":134},[39,1617,1618],{"class":209},"LABELS",[39,1620,980],{"class":106},[39,1622,1623],{"class":110}," {\n",[39,1625,1626,1629,1632,1635,1637,1640,1642,1644,1646,1649,1651,1653,1655,1658],{"class":41,"line":141},[39,1627,1628],{"class":49},"    \"sheet\"",[39,1630,1631],{"class":110},":   {",[39,1633,1634],{"class":49},"\"en\"",[39,1636,989],{"class":110},[39,1638,1639],{"class":49},"\"Sales\"",[39,1641,173],{"class":110},[39,1643,986],{"class":49},[39,1645,989],{"class":110},[39,1647,1648],{"class":49},"\"Umsatz\"",[39,1650,173],{"class":110},[39,1652,997],{"class":49},[39,1654,989],{"class":110},[39,1656,1657],{"class":49},"\"Ventes\"",[39,1659,1660],{"class":110},"},\n",[39,1662,1663,1666,1669,1671,1673,1676,1678,1680,1682,1684,1686,1688,1690,1693],{"class":41,"line":153},[39,1664,1665],{"class":49},"    \"region\"",[39,1667,1668],{"class":110},":  {",[39,1670,1634],{"class":49},[39,1672,989],{"class":110},[39,1674,1675],{"class":49},"\"Region\"",[39,1677,173],{"class":110},[39,1679,986],{"class":49},[39,1681,989],{"class":110},[39,1683,1675],{"class":49},[39,1685,173],{"class":110},[39,1687,997],{"class":49},[39,1689,989],{"class":110},[39,1691,1692],{"class":49},"\"Région\"",[39,1694,1660],{"class":110},[39,1696,1697,1700,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721,1723,1726],{"class":41,"line":164},[39,1698,1699],{"class":49},"    \"revenue\"",[39,1701,1702],{"class":110},": {",[39,1704,1634],{"class":49},[39,1706,989],{"class":110},[39,1708,204],{"class":49},[39,1710,173],{"class":110},[39,1712,986],{"class":49},[39,1714,989],{"class":110},[39,1716,1648],{"class":49},[39,1718,173],{"class":110},[39,1720,997],{"class":49},[39,1722,989],{"class":110},[39,1724,1725],{"class":49},"\"Chiffre d'affaires\"",[39,1727,1660],{"class":110},[39,1729,1730,1733,1735,1737,1739,1741,1743,1745,1747,1750,1752,1754,1756,1759],{"class":41,"line":187},[39,1731,1732],{"class":49},"    \"month\"",[39,1734,1631],{"class":110},[39,1736,1634],{"class":49},[39,1738,989],{"class":110},[39,1740,258],{"class":49},[39,1742,173],{"class":110},[39,1744,986],{"class":49},[39,1746,989],{"class":110},[39,1748,1749],{"class":49},"\"Monat\"",[39,1751,173],{"class":110},[39,1753,997],{"class":49},[39,1755,989],{"class":110},[39,1757,1758],{"class":49},"\"Mois\"",[39,1760,1660],{"class":110},[39,1762,1763],{"class":41,"line":198},[39,1764,1015],{"class":110},[39,1766,1767,1770,1772,1775,1778,1781,1784,1786,1789,1792,1795,1798,1801,1803,1805],{"class":41,"line":221},[39,1768,1769],{"class":110},"data ",[39,1771,147],{"class":106},[39,1773,1774],{"class":110}," pd.DataFrame({",[39,1776,1777],{"class":49},"\"region\"",[39,1779,1780],{"class":110},": [",[39,1782,1783],{"class":49},"\"North\"",[39,1785,173],{"class":110},[39,1787,1788],{"class":49},"\"South\"",[39,1790,1791],{"class":110},"], ",[39,1793,1794],{"class":49},"\"month\"",[39,1796,1797],{"class":110},": pd.to_datetime([",[39,1799,1800],{"class":49},"\"2026-10-01\"",[39,1802,173],{"class":110},[39,1804,1800],{"class":49},[39,1806,1807],{"class":110},"]),\n",[39,1809,1810,1813,1815,1818,1820,1823],{"class":41,"line":253},[39,1811,1812],{"class":49},"                     \"revenue\"",[39,1814,1780],{"class":110},[39,1816,1817],{"class":209},"48250.5",[39,1819,173],{"class":110},[39,1821,1822],{"class":209},"39120.0",[39,1824,1825],{"class":110},"]})\n",[39,1827,1828],{"class":41,"line":280},[39,1829,138],{"emptyLinePlaceholder":137},[39,1831,1832,1834,1837,1839,1841,1843,1845,1847,1849,1851],{"class":41,"line":307},[39,1833,316],{"class":106},[39,1835,1836],{"class":110}," lang ",[39,1838,322],{"class":106},[39,1840,920],{"class":110},[39,1842,1634],{"class":49},[39,1844,173],{"class":110},[39,1846,986],{"class":49},[39,1848,173],{"class":110},[39,1850,997],{"class":49},[39,1852,1066],{"class":110},[39,1854,1855,1858,1860,1863,1866,1868,1871,1873,1876,1878,1881,1883],{"class":41,"line":313},[39,1856,1857],{"class":110},"    frame ",[39,1859,147],{"class":106},[39,1861,1862],{"class":110}," data.rename(",[39,1864,1865],{"class":340},"columns",[39,1867,147],{"class":106},[39,1869,1870],{"class":110},"{k: ",[39,1872,1618],{"class":209},[39,1874,1875],{"class":110},"[k][lang] ",[39,1877,316],{"class":106},[39,1879,1880],{"class":110}," k ",[39,1882,322],{"class":106},[39,1884,1885],{"class":110}," data.columns})\n",[39,1887,1888,1891,1894,1897,1900,1902,1905,1907,1910,1912,1915,1917,1920,1922,1925,1927,1929,1932,1934],{"class":41,"line":328},[39,1889,1890],{"class":106},"    with",[39,1892,1893],{"class":110}," pd.ExcelWriter(",[39,1895,1896],{"class":106},"f",[39,1898,1899],{"class":49},"\"sales_",[39,1901,799],{"class":798},[39,1903,1904],{"class":110},"lang",[39,1906,807],{"class":798},[39,1908,1909],{"class":49},".xlsx\"",[39,1911,173],{"class":110},[39,1913,1914],{"class":340},"engine",[39,1916,147],{"class":106},[39,1918,1919],{"class":49},"\"xlsxwriter\"",[39,1921,173],{"class":110},[39,1923,1924],{"class":340},"datetime_format",[39,1926,147],{"class":106},[39,1928,275],{"class":49},[39,1930,1931],{"class":110},") ",[39,1933,114],{"class":106},[39,1935,1936],{"class":110}," writer:\n",[39,1938,1939,1942,1945,1947,1950,1952,1955,1957,1959,1962,1965],{"class":41,"line":334},[39,1940,1941],{"class":110},"        frame.to_excel(writer, ",[39,1943,1944],{"class":340},"index",[39,1946,147],{"class":106},[39,1948,1949],{"class":209},"False",[39,1951,173],{"class":110},[39,1953,1954],{"class":340},"sheet_name",[39,1956,147],{"class":106},[39,1958,1618],{"class":209},[39,1960,1961],{"class":110},"[",[39,1963,1964],{"class":49},"\"sheet\"",[39,1966,1967],{"class":110},"][lang])\n",[39,1969,1970,1973,1975,1978,1980,1982,1984],{"class":41,"line":365},[39,1971,1972],{"class":110},"        ws ",[39,1974,147],{"class":106},[39,1976,1977],{"class":110}," writer.sheets[",[39,1979,1618],{"class":209},[39,1981,1961],{"class":110},[39,1983,1964],{"class":49},[39,1985,1986],{"class":110},"][lang]]\n",[39,1988,1989,1992,1994,1996,1998,2000,2003],{"class":41,"line":382},[39,1990,1991],{"class":110},"        ws.set_column(",[39,1993,1063],{"class":209},[39,1995,173],{"class":110},[39,1997,1063],{"class":209},[39,1999,173],{"class":110},[39,2001,2002],{"class":209},"16",[39,2004,406],{"class":110},[39,2006,2007,2009,2011,2013,2015,2017,2020,2023,2026,2028,2030],{"class":41,"line":397},[39,2008,1991],{"class":110},[39,2010,354],{"class":209},[39,2012,173],{"class":110},[39,2014,354],{"class":209},[39,2016,173],{"class":110},[39,2018,2019],{"class":209},"18",[39,2021,2022],{"class":110},", writer.book.add_format({",[39,2024,2025],{"class":49},"\"num_format\"",[39,2027,989],{"class":110},[39,2029,215],{"class":49},[39,2031,2032],{"class":110},"}))\n",[39,2034,2036,2038,2041,2043,2045,2047,2049,2051,2053,2055,2057],{"class":41,"line":2035},19,[39,2037,1890],{"class":106},[39,2039,2040],{"class":110}," pd.ExcelFile(",[39,2042,1896],{"class":106},[39,2044,1899],{"class":49},[39,2046,799],{"class":798},[39,2048,1904],{"class":110},[39,2050,807],{"class":798},[39,2052,1909],{"class":49},[39,2054,1931],{"class":110},[39,2056,114],{"class":106},[39,2058,2059],{"class":110}," book:\n",[39,2061,2063,2066,2069,2072],{"class":41,"line":2062},20,[39,2064,2065],{"class":209},"        print",[39,2067,2068],{"class":110},"(lang, book.sheet_names, ",[39,2070,2071],{"class":209},"list",[39,2073,2074],{"class":110},"(frame.columns))\n",[588,2076,597,2082,597,2085,597,2088,597,2092,597,2100,597,2111,597,2117,597,2122,597,2129,597,2136,597,2142,597,2146,597,2149,597,2154,597,2157,597,2162,597,2165,597,2169,597,2172,597,2175,597,2178,597,2183,597,2187,597,2191,597,2194],{"viewBox":2077,"role":591,"ariaLabelledBy":2078,"xmlns":595,"style":2081},"4 0 752 332",[2079,2080],"lc-build-t","lc-build-d","width:100%;max-width:752px;height:auto;display:block;margin:1.5rem auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif",[599,2083,2084],{"id":2079},"One dataset, one workbook per language",[603,2086,2087],{"id":2080},"A single DataFrame and a label table feed three builds, one each for English, German and French, each with translated headers and sheet names but the same values and format codes.",[607,2089],{"x":1171,"y":610,"width":2090,"height":2091,"fill":613},"752","332",[607,2093],{"x":2094,"y":2095,"width":2096,"height":2097,"rx":2098,"fill":620,"stroke":621,"style":2099},"20.0","119.5","220.0","93.0","12","stroke-width:2px",[2101,2102,2104],"g",{"transform":2103},"translate(118.0,132.5) scale(1.000)",[2105,2106],"path",{"d":2107,"fill":2108,"stroke":2109,"style":2110},"M3 5h18v14H3z M3 10h18 M3 15h18 M9 5v14","none","var(--brand-strong,#4338ca)","stroke-width:1.80px;stroke-linecap:round;stroke-linejoin:round",[624,2112,2116],{"x":2113,"y":2114,"style":2115},"130.0","179.0","font-size:13.5px;font-weight:700;fill:var(--brand-strong,#4338ca);text-anchor:middle","Data + label table",[624,2118,2121],{"x":2113,"y":2119,"style":2120},"198.5","font-size:11.5px;font-weight:400;fill:var(--text,#172033);text-anchor:middle","one source of truth",[607,2123],{"x":2124,"y":617,"width":2125,"height":2126,"rx":2098,"fill":2127,"stroke":2128,"style":2099},"490.0","250.0","92.0","#d9f4f1","var(--teal,#0f9488)",[2101,2130,2132],{"transform":2131},"translate(603.0,29.0) scale(1.000)",[2105,2133],{"d":2134,"fill":2108,"stroke":2135,"style":2110},"M6 3h9l4 4v14H6z M15 3v4h4 M9.5 11.5l4.5 6 M14 11.5l-4.5 6","var(--teal-ink,#0b6157)",[624,2137,2141],{"x":2138,"y":2139,"style":2140},"615.0","75.0","font-size:13px;font-weight:700;fill:var(--teal-ink,#0b6157);text-anchor:middle","sales_en.xlsx",[624,2143,2145],{"x":2138,"y":2144,"style":662},"94.0","Sales · Revenue",[2105,2147],{"d":2148,"fill":2108,"stroke":621,"style":2099},"M244.0,166.0 C364.0,166.0 364.0,62.0 480.0,62.0",[2150,2151],"polygon",{"points":2152,"fill":2153},"484.0,62.0 475.0,67.0 475.0,57.0","#5b5cf0",[607,2155],{"x":2124,"y":2156,"width":2125,"height":2126,"rx":2098,"fill":2127,"stroke":2128,"style":2099},"120.0",[2101,2158,2160],{"transform":2159},"translate(603.0,133.0) scale(1.000)",[2105,2161],{"d":2134,"fill":2108,"stroke":2135,"style":2110},[624,2163,2164],{"x":2138,"y":2114,"style":2140},"sales_de.xlsx",[624,2166,2168],{"x":2138,"y":2167,"style":662},"198.0","Umsatz · Monat",[2105,2170],{"d":2171,"fill":2108,"stroke":621,"style":2099},"M244.0,166.0 C364.0,166.0 364.0,166.0 480.0,166.0",[2150,2173],{"points":2174,"fill":2153},"484.0,166.0 475.0,171.0 475.0,161.0",[607,2176],{"x":2124,"y":2177,"width":2125,"height":2126,"rx":2098,"fill":2127,"stroke":2128,"style":2099},"224.0",[2101,2179,2181],{"transform":2180},"translate(603.0,237.0) scale(1.000)",[2105,2182],{"d":2134,"fill":2108,"stroke":2135,"style":2110},[624,2184,2186],{"x":2138,"y":2185,"style":2140},"283.0","sales_fr.xlsx",[624,2188,2190],{"x":2138,"y":2189,"style":662},"302.0","Ventes · Mois",[2105,2192],{"d":2193,"fill":2108,"stroke":621,"style":2099},"M244.0,166.0 C364.0,166.0 364.0,270.0 480.0,270.0",[2150,2195],{"points":2196,"fill":2153},"484.0,270.0 475.0,275.0 475.0,265.0",[10,2198,2199,2200,2203],{},"Missing translations are the common failure: a new column is added to the data and the label table is not updated. A ",[14,2201,2202],{},"KeyError"," in the rename is the good outcome; to catch it before a release, check that every key has every language:",[30,2205,2207],{"className":97,"code":2206,"language":99,"meta":35,"style":35},"missing = [(key, lang) for key, names in LABELS.items() for lang in (\"en\", \"de\", \"fr\") if not names.get(lang)]\nprint(\"missing translations:\", missing or \"none\")\n",[14,2208,2209,2261],{"__ignoreMap":35},[39,2210,2211,2214,2216,2219,2221,2224,2226,2229,2232,2234,2236,2238,2240,2242,2244,2246,2248,2250,2252,2255,2258],{"class":41,"line":42},[39,2212,2213],{"class":110},"missing ",[39,2215,147],{"class":106},[39,2217,2218],{"class":110}," [(key, lang) ",[39,2220,316],{"class":106},[39,2222,2223],{"class":110}," key, names ",[39,2225,322],{"class":106},[39,2227,2228],{"class":209}," LABELS",[39,2230,2231],{"class":110},".items() ",[39,2233,316],{"class":106},[39,2235,1836],{"class":110},[39,2237,322],{"class":106},[39,2239,920],{"class":110},[39,2241,1634],{"class":49},[39,2243,173],{"class":110},[39,2245,986],{"class":49},[39,2247,173],{"class":110},[39,2249,997],{"class":49},[39,2251,1931],{"class":110},[39,2253,2254],{"class":106},"if",[39,2256,2257],{"class":106}," not",[39,2259,2260],{"class":110}," names.get(lang)]\n",[39,2262,2263,2265,2267,2270,2273,2276,2279],{"class":41,"line":120},[39,2264,901],{"class":209},[39,2266,1050],{"class":110},[39,2268,2269],{"class":49},"\"missing translations:\"",[39,2271,2272],{"class":110},", missing ",[39,2274,2275],{"class":106},"or",[39,2277,2278],{"class":49}," \"none\"",[39,2280,406],{"class":110},[10,2282,2283],{},"Data values such as region names are translated the same way if the audience needs it; keep the untranslated key in a hidden column if the report is ever read back by a program.",[25,2285,2287],{"id":2286},"things-that-do-not-change-with-the-locale","Things that do not change with the locale",[2289,2290,2291,2307,2317],"ul",{},[2292,2293,2294,2298,2299,2302,2303,23],"li",{},[2295,2296,2297],"strong",{},"Formulas."," Files always store English function names with commas as argument separators; Excel shows them translated. Write ",[14,2300,2301],{},"=SUMME(A1;A2)"," and the file is broken. See ",[19,2304,2306],{"href":2305},"\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-name-error-for-new-excel-functions-written-by-python\u002F","Fix #NAME? in Formulas Written from Python (XLOOKUP, TEXTJOIN, IFS)",[2292,2308,2309,2312,2313,2316],{},[2295,2310,2311],{},"Right-to-left languages."," For Arabic or Hebrew reports, set ",[14,2314,2315],{},"ws.sheet_view.rightToLeft = True"," so column A is on the right.",[2292,2318,2319,2322,2323,23],{},[2295,2320,2321],{},"Literal separators."," To force a slash whatever the locale, escape it: ",[14,2324,2325],{},"dd\\\u002Fmm\\\u002Fyyyy",[588,2327,597,2332,597,2335,597,2338,597,2341,597,2346,597,2353,597,2359,597,2363,597,2368,597,2372,597,2376,597,2380,597,2383,597,2389,597,2394,597,2398,597,2401,597,2404,597,2407],{"viewBox":2328,"role":591,"ariaLabelledBy":2329,"xmlns":595,"style":2081},"4 0 752 233",[2330,2331],"lc-rules-t","lc-rules-d",[599,2333,2334],{"id":2330},"Follows the reader, or fixed by you",[603,2336,2337],{"id":2331},"Two panels. Separators in number formats, the short date format and untagged month names follow the reader's settings. Month and day names with an LCID tag, currency symbols, translated labels, sheet direction and English formulas in the file are fixed when the report is written.",[607,2339],{"x":1171,"y":610,"width":2090,"height":2340,"fill":613},"233",[607,2342],{"x":2094,"y":617,"width":2343,"height":2344,"rx":2345,"fill":2127,"stroke":2128,"style":2099},"351.0","201.0","14",[2101,2347,2349],{"transform":2348},"translate(182.5,29.0) scale(1.083)",[2105,2350],{"d":2351,"fill":2108,"stroke":2135,"style":2352},"M9 11a3.5 3.5 0 1 0 0-7 3.5 3.5 0 0 0 0 7z M2.5 20c0-3.6 2.9-6 6.5-6s6.5 2.4 6.5 6 M16 4.5a3.3 3.3 0 0 1 0 6.3 M18 14.3c2.2.7 3.5 2.8 3.5 5.7","stroke-width:1.66px;stroke-linecap:round;stroke-linejoin:round",[624,2354,2358],{"x":2355,"y":2356,"style":2357},"195.5","78.0","font-size:14px;font-weight:700;fill:var(--teal-ink,#0b6157);text-anchor:middle","Follows the reader",[41,2360],{"x1":2361,"y1":681,"x2":2362,"y2":681,"stroke":2128,"style":658},"36.0","355.0",[624,2364,2367],{"x":2355,"y":2365,"style":2366},"111.0","font-size:12px;font-weight:400;fill:var(--text,#172033);text-anchor:middle","thousands and decimal separators",[624,2369,2371],{"x":2355,"y":2370,"style":2366},"137.0","short date (format 14)",[624,2373,2375],{"x":2355,"y":2374,"style":2366},"163.0","untagged month names",[624,2377,2379],{"x":2355,"y":2378,"style":2366},"189.0","date separator \u002F",[607,2381],{"x":2382,"y":617,"width":2343,"height":2344,"rx":2345,"fill":620,"stroke":621,"style":2099},"389.0",[2101,2384,2386],{"transform":2385},"translate(551.5,29.0) scale(1.083)",[2105,2387],{"d":2388,"fill":2108,"stroke":2109,"style":2352},"M6 11h12v9H6z M8.5 11V8a3.5 3.5 0 0 1 7 0v3",[624,2390,2393],{"x":2391,"y":2356,"style":2392},"564.5","font-size:14px;font-weight:700;fill:var(--brand-strong,#4338ca);text-anchor:middle","Fixed in the file",[41,2395],{"x1":2396,"y1":681,"x2":2397,"y2":681,"stroke":621,"style":658},"405.0","724.0",[624,2399,2400],{"x":2391,"y":2365,"style":2366},"[$-407] month and day names",[624,2402,2403],{"x":2391,"y":2370,"style":2366},"currency symbol and position",[624,2405,2406],{"x":2391,"y":2374,"style":2366},"labels and sheet names",[624,2408,2409],{"x":2391,"y":2378,"style":2366},"right-to-left, formulas",[25,2411,2413],{"id":2412},"common-pitfalls","Common pitfalls",[2289,2415,2416,2426,2435,2444,2450],{},[2292,2417,2418,2421,2422,2425],{},[2295,2419,2420],{},"Formatting in Python."," Strings like ",[14,2423,2424],{},"1.234,56"," cannot be summed and look wrong elsewhere; write values with format codes.",[2292,2427,2428,2431,2432,2434],{},[2295,2429,2430],{},"Fixed date patterns for international readers."," ",[14,2433,581],{}," confuses American readers; the short date follows each reader.",[2292,2436,2437,2440,2441,2443],{},[2295,2438,2439],{},"Language-name tags."," Use hexadecimal LCIDs such as ",[14,2442,958],{},", which were understood in testing.",[2292,2445,2446,2449],{},[2295,2447,2448],{},"Translated formulas."," Formulas in the file are always English.",[2292,2451,2452,2455],{},[2295,2453,2454],{},"Testing in one locale."," Render under the target locales, as above, before sending.",[25,2457,2459],{"id":2458},"conclusion","Conclusion",[10,2461,2462,2463,2465,2466,2468],{},"Write numbers and dates as values with format codes: separators, the built-in short date and untagged month names follow each reader automatically. Pin month and day names with LCID tags such as ",[14,2464,958],{}," when the report's language is fixed, put currency symbols in bracketed blocks, translate labels from one table, and remember that formulas in files are always English. Render the workbook under each target locale with LibreOffice and ",[14,2467,62],{}," to check it.",[25,2470,2472],{"id":2471},"frequently-asked-questions","Frequently asked questions",[10,2474,2475,2478],{},[2295,2476,2477],{},"How do I use a comma as decimal separator in Excel from Python?","\nYou don't need to. Write numbers as values with a format such as #,##0.00; Excel shows the reader's own decimal and thousands separators.",[10,2480,2481,2484,2485,2488,2489,2492,2493,23],{},[2295,2482,2483],{},"How do I show German month names regardless of the reader's settings?","\nPrefix the date format with the German locale ID: ",[39,2486,2487],{},"$-407","mmmm yyyy. French is ",[39,2490,2491],{},"$-40C",", Polish ",[39,2494,2495],{},"$-415",[10,2497,2498,2501],{},[2295,2499,2500],{},"Which date format adapts to the reader's locale?","\nThe built-in short date, format number 14, which openpyxl exposes as mm-dd-yy. It displays as 10\u002F5\u002F2026 in the US and 05.10.2026 in Germany.",[10,2503,2504,2507],{},[2295,2505,2506],{},"Do I need to translate formulas for other languages?","\nNo. Formulas are stored in English with comma separators in every file. Excel translates them for display.",[25,2509,2511],{"id":2510},"related","Related",[2289,2513,2514,2520,2527,2532,2539],{},[2292,2515,2516,2517,2519],{},"Up one level: ",[19,2518,22],{"href":21}," — the format codes in detail.",[2292,2521,2522,2526],{},[19,2523,2525],{"href":2524},"\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Fformat-dates-in-excel-cells-with-python\u002F","Format Dates in Excel Cells with Python"," — date codes beyond the short date.",[2292,2528,2529,2531],{},[19,2530,1584],{"href":1583}," — currency and accounting formats.",[2292,2533,2534,2538],{},[19,2535,2537],{"href":2536},"\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Fwrite-custom-number-format-codes-in-excel-with-python\u002F","Write Custom Number Format Codes in Excel with Python"," — the format code syntax.",[2292,2540,2541,2545],{},[19,2542,2544],{"href":2543},"\u002Fformatting-and-charting-excel-reports-with-python\u002Fprotecting-and-sharing-excel-workbooks\u002Fmake-an-excel-report-accessible\u002F","Make an Excel Report Accessible"," — another way of reaching more readers.",[2547,2548,2549],"style",{},"html pre.shiki code .sMTad, html code.shiki .sMTad{--shiki-default:#6F42C1;--shiki-dark:#FFB757}html pre.shiki code .srMev, html code.shiki .srMev{--shiki-default:#032F62;--shiki-dark:#ADDCFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s-kum, html code.shiki .s-kum{--shiki-default:#D73A49;--shiki-dark:#FF9492}html pre.shiki code .skGVy, html code.shiki .skGVy{--shiki-default:#24292E;--shiki-dark:#F0F3F6}html pre.shiki code .sP0c6, html code.shiki .sP0c6{--shiki-default:#005CC5;--shiki-dark:#91CBFF}html pre.shiki code .sa561, html code.shiki .sa561{--shiki-default:#E36209;--shiki-dark:#FFB757}html pre.shiki code .sSjpA, html code.shiki .sSjpA{--shiki-default:#005CC5;--shiki-dark:#FF9492}html pre.shiki code .s-wDw, html code.shiki .s-wDw{--shiki-default:#6A737D;--shiki-dark:#BDC4CC}",{"title":35,"searchDepth":120,"depth":120,"links":2551},[2552,2553,2554,2555,2556,2557,2558,2559,2560,2561,2562],{"id":27,"depth":120,"text":28},{"id":70,"depth":120,"text":71},{"id":737,"depth":120,"text":738},{"id":951,"depth":120,"text":952},{"id":1332,"depth":120,"text":1333},{"id":1588,"depth":120,"text":1589},{"id":2286,"depth":120,"text":2287},{"id":2412,"depth":120,"text":2413},{"id":2458,"depth":120,"text":2459},{"id":2471,"depth":120,"text":2472},{"id":2510,"depth":120,"text":2511},"2026-09-29","Produce one Excel report for readers in Germany, France and Poland without breaking it: let number formats follow each reader's separators, use the locale-aware short date, pin month names to a language with LCID tags, place currency symbols, translate labels from one table, set right-to-left sheets, and check the result under each locale.","md",[2567,2569,2571,2573],{"q":2477,"a":2568},"You don't need to. Write numbers as values with a format such as #,##0.00; Excel shows the reader's own decimal and thousands separators.",{"q":2483,"a":2570},"Prefix the date format with the German locale ID: [$-407]mmmm yyyy. French is [$-40C], Polish [$-415].",{"q":2500,"a":2572},"The built-in short date, format number 14, which openpyxl exposes as mm-dd-yy. It displays as 10\u002F5\u002F2026 in the US and 05.10.2026 in Germany.",{"q":2506,"a":2574},"No. Formulas are stored in English with comma separators in every file. Excel translates them for display.","localise an excel report for other languages and locales",null,{"breadcrumb":2578},[2579,2581,2584],{"name":2580,"item":585},"Home",{"name":2582,"item":2583},"Formatting and Charting Excel Reports with Python","\u002Fformatting-and-charting-excel-reports-with-python\u002F",{"name":22,"item":21},"\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Flocalise-an-excel-report-for-other-languages-and-locales",{"title":2587,"description":2588},"Localise an Excel Report for Other Locales with Python","Localise Excel reports from Python: locale-neutral number format codes, the short date format that follows the reader, [$-407] LCID tags for month names, currency symbols, translated labels, right-to-left sheets, verified with LibreOffice.","localise-an-excel-report-for-other-languages-and-locales","formatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Flocalise-an-excel-report-for-other-languages-and-locales\u002Findex",[2592,2593],"number-formats","report-layouts","how-to","eOg3x5isSxggf5pM1pR0MC2KwvHYpj4OIW9GOE83gSI",[2597,2601],{"title":2598,"path":2599,"stem":2600,"children":-1},"Format ZIP Codes and IDs with Leading Zeros in Excel","\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Fformat-zip-codes-and-ids-with-leading-zeros","formatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Fformat-zip-codes-and-ids-with-leading-zeros\u002Findex",{"title":2602,"path":2603,"stem":2604,"children":-1},"Read Cell Values as Displayed in Excel with Python","\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Fread-cell-values-as-displayed-in-excel","formatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel\u002Fread-cell-values-as-displayed-in-excel\u002Findex",[2606,2608],{"path":2607,"title":22},"\u002Fformatting-and-charting-excel-reports-with-python\u002Fapplying-number-and-date-formats-in-excel",{"path":2609,"title":2582},"\u002Fformatting-and-charting-excel-reports-with-python",[],[2612,2615,2618,2621,2624,2627],{"path":2613,"title":2614,"kind":2594},"\u002Fadvanced-data-transformation-and-cleaning\u002Fcleaning-excel-data-with-pandas\u002Fconvert-currency-strings-to-numbers-with-pandas","Convert Currency Strings Like \"$1,234.56\" and \"(500)\" to Numbers with pandas",{"path":2616,"title":2617,"kind":2594},"\u002Fadvanced-data-transformation-and-cleaning\u002Fcleaning-excel-data-with-pandas\u002Fconvert-percentage-strings-to-numbers-with-pandas","Convert Percentage Strings Like \"12.5%\" to Numbers with pandas",{"path":2619,"title":2620,"kind":2594},"\u002Fadvanced-data-transformation-and-cleaning\u002Fexcel-formula-equivalents-in-pandas\u002Fexcel-text-function-equivalent-in-pandas","Excel TEXT Function Equivalent in pandas",{"path":2622,"title":2623,"kind":2594},"\u002Fadvanced-data-transformation-and-cleaning\u002Fexcel-formula-equivalents-in-pandas\u002Fmatch-excel-rounding-in-pandas","Match Excel Rounding in pandas",{"path":2625,"title":2626,"kind":2594},"\u002Fadvanced-data-transformation-and-cleaning\u002Fworking-with-dates-and-times-in-excel-data\u002Fconvert-excel-time-values-and-durations","Convert Excel Time Values and Durations in Python",{"path":2628,"title":2629,"kind":2594},"\u002Fautomating-reporting-workflows\u002Fbuilding-multi-sheet-excel-dashboards\u002Fadd-variance-arrows-and-trend-indicators-to-a-dashboard","Add Variance Arrows and Trend Indicators to a Dashboard",1790972107157]