[{"data":1,"prerenderedAt":2429},["ShallowReactive",2],{"doc:\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-data-validation-extension-is-not-supported-warning":3,"surround:\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-data-validation-extension-is-not-supported-warning":2394,"ancestors:\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-data-validation-extension-is-not-supported-warning":2403,"children:\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-data-validation-extension-is-not-supported-warning":2408,"related:\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-data-validation-extension-is-not-supported-warning":2409},{"id":4,"title":5,"body":6,"dateModified":2359,"datePublished":2359,"description":2360,"extension":2361,"faq":2362,"keyword":2371,"kind":2372,"meta":2373,"navigation":256,"path":2382,"seo":2383,"slug":2386,"stem":2387,"topics":2388,"type":2392,"__hash__":2393},"docs\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-data-validation-extension-is-not-supported-warning\u002Findex.md","Fix the \"Data Validation extension is not supported\" Warning in openpyxl",{"type":7,"value":8,"toc":2347},"minimark",[9,18,28,37,190,195,223,234,576,580,583,708,719,746,750,753,875,887,890,934,1067,1071,1078,1636,1654,1827,1831,1841,2207,2222,2226,2233,2237,2272,2276,2282,2286,2292,2298,2304,2310,2314,2343],[10,11,12,13,17],"p",{},"Loading a workbook with openpyxl, or reading it with ",[14,15,16],"code",{},"pd.read_excel",", sometimes prints:",[19,20,26],"pre",{"className":21,"code":23,"language":24,"meta":25},[22],"language-text","UserWarning: Data Validation extension is not supported and will be removed\n","text","",[14,27,23],{"__ignoreMap":25},[10,29,30,31,36],{},"The file still loads and every value is read correctly. The warning is about something else: a dropdown or validation rule stored in a part of the file openpyxl does not understand. Whether that matters depends entirely on what you do next — for reading data it is noise; for saving the workbook back it means the dropdowns are about to disappear. This guide, part of ",[32,33,35],"a",{"href":34},"\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002F","Troubleshooting Common Python Excel Errors",", explains the cause and gives a fix for each case.",[38,39,47,48,47,52,47,56,47,64,47,74,47,85,47,91,47,95,47,100,47,107,47,112,47,117,47,124,47,130,47,134,47,138,47,141,47,146,47,153,47,158,47,161,47,165,47,168,47,171,47,177,47,181,47,184],"svg",{"viewBox":40,"role":41,"ariaLabelledBy":42,"xmlns":45,"style":46},"4 0 752 168","img",[43,44],"dvx-cause-t","dvx-cause-d","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","width:100%;max-width:752px;height:auto;display:block;margin:1.5rem auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif","\n  ",[49,50,51],"title",{"id":43},"Why openpyxl warns and what it drops",[53,54,55],"desc",{"id":44},"Excel stores a dropdown whose options come from another sheet in an x14 extension block of the worksheet XML. openpyxl reads the ordinary validation rules but not the extension, warns that it is not supported, and leaves those rules out of the loaded workbook, so saving writes the file without them.",[57,58],"rect",{"x":59,"y":60,"width":61,"height":62,"fill":63},"4","0","752","168","#ffffff",[57,65],{"x":66,"y":67,"width":68,"height":69,"rx":70,"fill":71,"stroke":72,"style":73},"20.0","16.0","153.0","110.5","12","#e7ebef","var(--line,#cdd5e6)","stroke-width:2px",[75,76,78],"g",{"transform":77},"translate(84.5,29.0) scale(1.000)",[79,80],"path",{"d":81,"fill":82,"stroke":83,"style":84},"M6 3h9l4 4v14H6z M15 3v4h4 M9.5 11.5l4.5 6 M14 11.5l-4.5 6","none","var(--text,#172033)","stroke-width:1.80px;stroke-linecap:round;stroke-linejoin:round",[24,86,90],{"x":87,"y":88,"style":89},"96.5","75.5","font-size:13.5px;font-weight:700;fill:var(--text,#172033);text-anchor:middle","Excel saves",[24,92,94],{"x":87,"y":93,"style":89},"93.0","dropdown",[24,96,99],{"x":87,"y":97,"style":98},"112.5","font-size:11.5px;font-weight:400;fill:var(--text,#172033);text-anchor:middle","list from =Lists!A1:A3",[101,102],"line",{"x1":103,"y1":104,"x2":105,"y2":104,"stroke":106,"style":73},"178.0","71.2","200.0","var(--brand,#5b5cf0)",[108,109],"polygon",{"points":110,"fill":111},"204.0,71.2 195.0,76.2 195.0,66.2","#5b5cf0",[57,113],{"x":114,"y":67,"width":68,"height":69,"rx":70,"fill":115,"stroke":116,"style":73},"209.0","#fdefd8","var(--gold,#b4740a)",[75,118,120],{"transform":119},"translate(273.5,37.8) scale(1.000)",[79,121],{"d":122,"fill":82,"stroke":123,"style":84},"M9 8l-4 4 4 4 M15 8l4 4-4 4","var(--gold-ink,#7a4e06)",[24,125,129],{"x":126,"y":127,"style":128},"285.5","84.2","font-size:13.5px;font-weight:700;fill:var(--gold-ink,#7a4e06);text-anchor:middle","x14 extension",[24,131,133],{"x":126,"y":132,"style":98},"103.8","in the sheet XML",[101,135],{"x1":136,"y1":104,"x2":137,"y2":104,"stroke":106,"style":73},"367.0","389.0",[108,139],{"points":140,"fill":111},"393.0,71.2 384.0,76.2 384.0,66.2",[57,142],{"x":143,"y":67,"width":68,"height":69,"rx":70,"fill":144,"stroke":145,"style":73},"398.0","#fee8f2","var(--accent,#f43f8f)",[75,147,149],{"transform":148},"translate(462.5,37.8) scale(1.000)",[79,150],{"d":151,"fill":82,"stroke":152,"style":84},"M12 3.5l9.5 17h-19z M12 10v5 M12 17.8v.4","var(--accent-ink,#be185d)",[24,154,157],{"x":155,"y":127,"style":156},"474.5","font-size:13.5px;font-weight:700;fill:var(--accent-ink,#be185d);text-anchor:middle","openpyxl loads",[24,159,160],{"x":155,"y":132,"style":98},"warns and skips it",[101,162],{"x1":163,"y1":104,"x2":164,"y2":104,"stroke":106,"style":73},"556.0","578.0",[108,166],{"points":167,"fill":111},"582.0,71.2 573.0,76.2 573.0,66.2",[57,169],{"x":170,"y":67,"width":68,"height":69,"rx":70,"fill":144,"stroke":145,"style":73},"587.0",[75,172,174],{"transform":173},"translate(651.5,37.8) scale(1.000)",[79,175],{"d":176,"fill":82,"stroke":152,"style":84},"M6 6l12 12 M18 6L6 18",[24,178,180],{"x":179,"y":127,"style":156},"663.5","save()",[24,182,183],{"x":179,"y":132,"style":98},"dropdown gone",[24,185,189],{"x":186,"y":187,"style":188},"380.0","148.5","font-size:12.5px;font-weight:400;fill:var(--muted,#5b6780);text-anchor:middle","reading values is unaffected — only a later save loses the rule",[191,192,194],"h2",{"id":193},"prerequisites","Prerequisites",[19,196,200],{"className":197,"code":198,"language":199,"meta":25,"style":25},"language-bash shiki shiki-themes github-light github-dark-high-contrast","pip install openpyxl pandas python-calamine\n","bash",[14,201,202],{"__ignoreMap":25},[203,204,206,210,214,217,220],"span",{"class":101,"line":205},1,[203,207,209],{"class":208},"sMTad","pip",[203,211,213],{"class":212},"srMev"," install",[203,215,216],{"class":212}," openpyxl",[203,218,219],{"class":212}," pandas",[203,221,222],{"class":212}," python-calamine\n",[10,224,225,226,229,230,233],{},"To reproduce the warning without Excel, build a workbook and add a validation extension to it the way Excel writes one — a dropdown on the ",[14,227,228],{},"Entry"," sheet whose options come from the ",[14,231,232],{},"Lists"," sheet:",[19,235,239],{"className":236,"code":237,"language":238,"meta":25,"style":25},"language-python shiki shiki-themes github-light github-dark-high-contrast","import zipfile\n\nfrom openpyxl import Workbook\n\nwb = Workbook()\nentry = wb.active\nentry.title = \"Entry\"\nentry[\"A1\"] = \"Region\"\nlists = wb.create_sheet(\"Lists\")\nfor region in [\"North\", \"South\", \"East\"]:\n    lists.append([region])\nwb.save(\"base.xlsx\")\n\nEXT = ('\u003CextLst>\u003Cext uri=\"{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}\" '\n       'xmlns:x14=\"http:\u002F\u002Fschemas.microsoft.com\u002Foffice\u002Fspreadsheetml\u002F2009\u002F9\u002Fmain\">'\n       '\u003Cx14:dataValidations count=\"1\" xmlns:xm=\"http:\u002F\u002Fschemas.microsoft.com\u002Foffice\u002Fexcel\u002F2006\u002Fmain\">'\n       '\u003Cx14:dataValidation type=\"list\" allowBlank=\"1\" showErrorMessage=\"1\">'\n       '\u003Cx14:formula1>\u003Cxm:f>Lists!$A$1:$A$3\u003C\u002Fxm:f>\u003C\u002Fx14:formula1>\u003Cxm:sqref>A2:A100\u003C\u002Fxm:sqref>'\n       '\u003C\u002Fx14:dataValidation>\u003C\u002Fx14:dataValidations>\u003C\u002Fext>\u003C\u002FextLst>')\n\nwith zipfile.ZipFile(\"base.xlsx\") as src, zipfile.ZipFile(\"entry_form.xlsx\", \"w\", zipfile.ZIP_DEFLATED) as dst:\n    for item in src.infolist():\n        data = src.read(item.filename)\n        if item.filename == \"xl\u002Fworksheets\u002Fsheet1.xml\":\n            data = data.replace(b\"\u003C\u002Fworksheet>\", EXT.encode() + b\"\u003C\u002Fworksheet>\")\n        dst.writestr(item, data)\n","python",[14,240,241,251,258,272,277,289,300,311,328,345,377,383,394,399,415,421,427,433,439,447,452,493,507,518,536,570],{"__ignoreMap":25},[203,242,243,247],{"class":101,"line":205},[203,244,246],{"class":245},"s-kum","import",[203,248,250],{"class":249},"skGVy"," zipfile\n",[203,252,254],{"class":101,"line":253},2,[203,255,257],{"emptyLinePlaceholder":256},true,"\n",[203,259,261,264,267,269],{"class":101,"line":260},3,[203,262,263],{"class":245},"from",[203,265,266],{"class":249}," openpyxl ",[203,268,246],{"class":245},[203,270,271],{"class":249}," Workbook\n",[203,273,275],{"class":101,"line":274},4,[203,276,257],{"emptyLinePlaceholder":256},[203,278,280,283,286],{"class":101,"line":279},5,[203,281,282],{"class":249},"wb ",[203,284,285],{"class":245},"=",[203,287,288],{"class":249}," Workbook()\n",[203,290,292,295,297],{"class":101,"line":291},6,[203,293,294],{"class":249},"entry ",[203,296,285],{"class":245},[203,298,299],{"class":249}," wb.active\n",[203,301,303,306,308],{"class":101,"line":302},7,[203,304,305],{"class":249},"entry.title ",[203,307,285],{"class":245},[203,309,310],{"class":212}," \"Entry\"\n",[203,312,314,317,320,323,325],{"class":101,"line":313},8,[203,315,316],{"class":249},"entry[",[203,318,319],{"class":212},"\"A1\"",[203,321,322],{"class":249},"] ",[203,324,285],{"class":245},[203,326,327],{"class":212}," \"Region\"\n",[203,329,331,334,336,339,342],{"class":101,"line":330},9,[203,332,333],{"class":249},"lists ",[203,335,285],{"class":245},[203,337,338],{"class":249}," wb.create_sheet(",[203,340,341],{"class":212},"\"Lists\"",[203,343,344],{"class":249},")\n",[203,346,348,351,354,357,360,363,366,369,371,374],{"class":101,"line":347},10,[203,349,350],{"class":245},"for",[203,352,353],{"class":249}," region ",[203,355,356],{"class":245},"in",[203,358,359],{"class":249}," [",[203,361,362],{"class":212},"\"North\"",[203,364,365],{"class":249},", ",[203,367,368],{"class":212},"\"South\"",[203,370,365],{"class":249},[203,372,373],{"class":212},"\"East\"",[203,375,376],{"class":249},"]:\n",[203,378,380],{"class":101,"line":379},11,[203,381,382],{"class":249},"    lists.append([region])\n",[203,384,386,389,392],{"class":101,"line":385},12,[203,387,388],{"class":249},"wb.save(",[203,390,391],{"class":212},"\"base.xlsx\"",[203,393,344],{"class":249},[203,395,397],{"class":101,"line":396},13,[203,398,257],{"emptyLinePlaceholder":256},[203,400,402,406,409,412],{"class":101,"line":401},14,[203,403,405],{"class":404},"sP0c6","EXT",[203,407,408],{"class":245}," =",[203,410,411],{"class":249}," (",[203,413,414],{"class":212},"'\u003CextLst>\u003Cext uri=\"{CCE6A557-97BC-4b89-ADB6-D9C93CAAB3DF}\" '\n",[203,416,418],{"class":101,"line":417},15,[203,419,420],{"class":212},"       'xmlns:x14=\"http:\u002F\u002Fschemas.microsoft.com\u002Foffice\u002Fspreadsheetml\u002F2009\u002F9\u002Fmain\">'\n",[203,422,424],{"class":101,"line":423},16,[203,425,426],{"class":212},"       '\u003Cx14:dataValidations count=\"1\" xmlns:xm=\"http:\u002F\u002Fschemas.microsoft.com\u002Foffice\u002Fexcel\u002F2006\u002Fmain\">'\n",[203,428,430],{"class":101,"line":429},17,[203,431,432],{"class":212},"       '\u003Cx14:dataValidation type=\"list\" allowBlank=\"1\" showErrorMessage=\"1\">'\n",[203,434,436],{"class":101,"line":435},18,[203,437,438],{"class":212},"       '\u003Cx14:formula1>\u003Cxm:f>Lists!$A$1:$A$3\u003C\u002Fxm:f>\u003C\u002Fx14:formula1>\u003Cxm:sqref>A2:A100\u003C\u002Fxm:sqref>'\n",[203,440,442,445],{"class":101,"line":441},19,[203,443,444],{"class":212},"       '\u003C\u002Fx14:dataValidation>\u003C\u002Fx14:dataValidations>\u003C\u002Fext>\u003C\u002FextLst>'",[203,446,344],{"class":249},[203,448,450],{"class":101,"line":449},20,[203,451,257],{"emptyLinePlaceholder":256},[203,453,455,458,461,463,466,469,472,475,477,480,483,486,488,490],{"class":101,"line":454},21,[203,456,457],{"class":245},"with",[203,459,460],{"class":249}," zipfile.ZipFile(",[203,462,391],{"class":212},[203,464,465],{"class":249},") ",[203,467,468],{"class":245},"as",[203,470,471],{"class":249}," src, zipfile.ZipFile(",[203,473,474],{"class":212},"\"entry_form.xlsx\"",[203,476,365],{"class":249},[203,478,479],{"class":212},"\"w\"",[203,481,482],{"class":249},", zipfile.",[203,484,485],{"class":404},"ZIP_DEFLATED",[203,487,465],{"class":249},[203,489,468],{"class":245},[203,491,492],{"class":249}," dst:\n",[203,494,496,499,502,504],{"class":101,"line":495},22,[203,497,498],{"class":245},"    for",[203,500,501],{"class":249}," item ",[203,503,356],{"class":245},[203,505,506],{"class":249}," src.infolist():\n",[203,508,510,513,515],{"class":101,"line":509},23,[203,511,512],{"class":249},"        data ",[203,514,285],{"class":245},[203,516,517],{"class":249}," src.read(item.filename)\n",[203,519,521,524,527,530,533],{"class":101,"line":520},24,[203,522,523],{"class":245},"        if",[203,525,526],{"class":249}," item.filename ",[203,528,529],{"class":245},"==",[203,531,532],{"class":212}," \"xl\u002Fworksheets\u002Fsheet1.xml\"",[203,534,535],{"class":249},":\n",[203,537,539,542,544,547,550,553,555,557,560,563,566,568],{"class":101,"line":538},25,[203,540,541],{"class":249},"            data ",[203,543,285],{"class":245},[203,545,546],{"class":249}," data.replace(",[203,548,549],{"class":245},"b",[203,551,552],{"class":212},"\"\u003C\u002Fworksheet>\"",[203,554,365],{"class":249},[203,556,405],{"class":404},[203,558,559],{"class":249},".encode() ",[203,561,562],{"class":245},"+",[203,564,565],{"class":245}," b",[203,567,552],{"class":212},[203,569,344],{"class":249},[203,571,573],{"class":101,"line":572},26,[203,574,575],{"class":249},"        dst.writestr(item, data)\n",[191,577,579],{"id":578},"step-1-confirm-what-the-warning-refers-to","Step 1 — Confirm what the warning refers to",[10,581,582],{},"Load the file with warnings captured, and count the validation rules openpyxl kept:",[19,584,586],{"className":236,"code":585,"language":238,"meta":25,"style":25},"import warnings\n\nfrom openpyxl import load_workbook\n\nwith warnings.catch_warnings(record=True) as caught:\n    warnings.simplefilter(\"always\")\n    wb = load_workbook(\"entry_form.xlsx\")\nprint([str(w.message) for w in caught])\nprint(len(wb[\"Entry\"].data_validations.dataValidation))   # 0 — the dropdown was dropped\n",[14,587,588,595,599,610,614,637,647,661,685],{"__ignoreMap":25},[203,589,590,592],{"class":101,"line":205},[203,591,246],{"class":245},[203,593,594],{"class":249}," warnings\n",[203,596,597],{"class":101,"line":253},[203,598,257],{"emptyLinePlaceholder":256},[203,600,601,603,605,607],{"class":101,"line":260},[203,602,263],{"class":245},[203,604,266],{"class":249},[203,606,246],{"class":245},[203,608,609],{"class":249}," load_workbook\n",[203,611,612],{"class":101,"line":274},[203,613,257],{"emptyLinePlaceholder":256},[203,615,616,618,621,625,627,630,632,634],{"class":101,"line":279},[203,617,457],{"class":245},[203,619,620],{"class":249}," warnings.catch_warnings(",[203,622,624],{"class":623},"sa561","record",[203,626,285],{"class":245},[203,628,629],{"class":404},"True",[203,631,465],{"class":249},[203,633,468],{"class":245},[203,635,636],{"class":249}," caught:\n",[203,638,639,642,645],{"class":101,"line":291},[203,640,641],{"class":249},"    warnings.simplefilter(",[203,643,644],{"class":212},"\"always\"",[203,646,344],{"class":249},[203,648,649,652,654,657,659],{"class":101,"line":302},[203,650,651],{"class":249},"    wb ",[203,653,285],{"class":245},[203,655,656],{"class":249}," load_workbook(",[203,658,474],{"class":212},[203,660,344],{"class":249},[203,662,663,666,669,672,675,677,680,682],{"class":101,"line":313},[203,664,665],{"class":404},"print",[203,667,668],{"class":249},"([",[203,670,671],{"class":404},"str",[203,673,674],{"class":249},"(w.message) ",[203,676,350],{"class":245},[203,678,679],{"class":249}," w ",[203,681,356],{"class":245},[203,683,684],{"class":249}," caught])\n",[203,686,687,689,692,695,698,701,704],{"class":101,"line":330},[203,688,665],{"class":404},[203,690,691],{"class":249},"(",[203,693,694],{"class":404},"len",[203,696,697],{"class":249},"(wb[",[203,699,700],{"class":212},"\"Entry\"",[203,702,703],{"class":249},"].data_validations.dataValidation))   ",[203,705,707],{"class":706},"s-wDw","# 0 — the dropdown was dropped\n",[10,709,710,711,715,716,718],{},"Zero rules survived. Excel writes list validations whose options live on ",[712,713,714],"em",{},"another"," worksheet into this extension block, for compatibility with older Excel versions — which is why the warning shows up on data-entry templates with a hidden ",[14,717,232],{}," sheet more than anywhere else. Validation rules stored the ordinary way are read and kept.",[10,720,721,722,725,726,729,730,733,734,737,738,741,742,745],{},"To see the extension for yourself in any workbook, remember that an ",[14,723,724],{},".xlsx"," file is a zip archive. Rename a copy to ",[14,727,728],{},".zip",", open ",[14,731,732],{},"xl\u002Fworksheets\u002Fsheet1.xml"," in a text editor, and search for ",[14,735,736],{},"x14:dataValidation",". Each block holds the rule type, the source formula such as ",[14,739,740],{},"Lists!$A$1:$A$3",", and the target cells in ",[14,743,744],{},"xm:sqref",". That is all the information needed to rebuild the rule, and it is exactly what the code in Step 3 extracts.",[191,747,749],{"id":748},"step-2-only-reading-the-warning-is-harmless","Step 2 — Only reading? The warning is harmless",[10,751,752],{},"When the job only reads the data, nothing is lost that you need: values, formulas and formats all load. Silence this one warning — precisely, by its message and module — so it does not bury warnings that matter:",[19,754,756],{"className":236,"code":755,"language":238,"meta":25,"style":25},"import pandas as pd\n\nwarnings.filterwarnings(\n    \"ignore\",\n    message=\"Data Validation extension is not supported\",\n    category=UserWarning,\n    module=\"openpyxl\",\n)\ndf = pd.read_excel(\"entry_form.xlsx\", sheet_name=\"Lists\", header=None)\nprint(df[0].tolist())   # ['North', 'South', 'East']\n",[14,757,758,770,774,779,787,799,811,823,827,860],{"__ignoreMap":25},[203,759,760,762,765,767],{"class":101,"line":205},[203,761,246],{"class":245},[203,763,764],{"class":249}," pandas ",[203,766,468],{"class":245},[203,768,769],{"class":249}," pd\n",[203,771,772],{"class":101,"line":253},[203,773,257],{"emptyLinePlaceholder":256},[203,775,776],{"class":101,"line":260},[203,777,778],{"class":249},"warnings.filterwarnings(\n",[203,780,781,784],{"class":101,"line":274},[203,782,783],{"class":212},"    \"ignore\"",[203,785,786],{"class":249},",\n",[203,788,789,792,794,797],{"class":101,"line":279},[203,790,791],{"class":623},"    message",[203,793,285],{"class":245},[203,795,796],{"class":212},"\"Data Validation extension is not supported\"",[203,798,786],{"class":249},[203,800,801,804,806,809],{"class":101,"line":291},[203,802,803],{"class":623},"    category",[203,805,285],{"class":245},[203,807,808],{"class":404},"UserWarning",[203,810,786],{"class":249},[203,812,813,816,818,821],{"class":101,"line":302},[203,814,815],{"class":623},"    module",[203,817,285],{"class":245},[203,819,820],{"class":212},"\"openpyxl\"",[203,822,786],{"class":249},[203,824,825],{"class":101,"line":313},[203,826,344],{"class":249},[203,828,829,832,834,837,839,841,844,846,848,850,853,855,858],{"class":101,"line":330},[203,830,831],{"class":249},"df ",[203,833,285],{"class":245},[203,835,836],{"class":249}," pd.read_excel(",[203,838,474],{"class":212},[203,840,365],{"class":249},[203,842,843],{"class":623},"sheet_name",[203,845,285],{"class":245},[203,847,341],{"class":212},[203,849,365],{"class":249},[203,851,852],{"class":623},"header",[203,854,285],{"class":245},[203,856,857],{"class":404},"None",[203,859,344],{"class":249},[203,861,862,864,867,869,872],{"class":101,"line":347},[203,863,665],{"class":404},[203,865,866],{"class":249},"(df[",[203,868,60],{"class":404},[203,870,871],{"class":249},"].tolist())   ",[203,873,874],{"class":706},"# ['North', 'South', 'East']\n",[10,876,877,878,881,882,886],{},"Avoid the tempting ",[14,879,880],{},"warnings.filterwarnings(\"ignore\")",". It also hides warnings about sparklines and conditional formats being dropped, which do matter if the same script later saves a workbook — see ",[32,883,885],{"href":884},"\u002Fgetting-started-with-python-excel-automation\u002Fusing-openpyxl-for-excel-file-manipulation\u002Fwhat-openpyxl-loses-when-saving-an-existing-workbook\u002F","What openpyxl Loses When You Save an Existing Workbook",".",[10,888,889],{},"An alternative for read-only jobs is the calamine engine, which reads cell values without parsing validation at all, so the warning never appears — and reads faster:",[19,891,893],{"className":236,"code":892,"language":238,"meta":25,"style":25},"values = pd.read_excel(\"entry_form.xlsx\", sheet_name=\"Lists\", header=None, engine=\"calamine\")\n",[14,894,895],{"__ignoreMap":25},[203,896,897,900,902,904,906,908,910,912,914,916,918,920,922,924,927,929,932],{"class":101,"line":205},[203,898,899],{"class":249},"values ",[203,901,285],{"class":245},[203,903,836],{"class":249},[203,905,474],{"class":212},[203,907,365],{"class":249},[203,909,843],{"class":623},[203,911,285],{"class":245},[203,913,341],{"class":212},[203,915,365],{"class":249},[203,917,852],{"class":623},[203,919,285],{"class":245},[203,921,857],{"class":404},[203,923,365],{"class":249},[203,925,926],{"class":623},"engine",[203,928,285],{"class":245},[203,930,931],{"class":212},"\"calamine\"",[203,933,344],{"class":249},[38,935,47,940,47,943,47,946,47,949,47,954,47,960,47,964,47,968,47,972,47,975,47,978,47,986,47,991,47,997,47,1004,47,1009,47,1013,47,1015,47,1018,47,1022,47,1025,47,1028,47,1034,47,1037,47,1040,47,1042,47,1045,47,1049,47,1052,47,1055,47,1061,47,1064],{"viewBox":936,"role":41,"ariaLabelledBy":937,"xmlns":45,"style":46},"4 0 752 272",[938,939],"dvx-choose-t","dvx-choose-d",[49,941,942],{"id":938},"What to do about the warning",[53,944,945],{"id":939},"If the job only reads data, silence the specific warning or read with the calamine engine. If the job saves the workbook and the dropdowns matter, rebuild them as ordinary validation before saving. If the workbook is a designed template people fill in, avoid saving it with openpyxl and write data elsewhere.",[57,947],{"x":59,"y":60,"width":61,"height":948,"fill":63},"272",[57,950],{"x":951,"y":67,"width":952,"height":88,"rx":70,"fill":953,"stroke":106,"style":73},"224.4","311.1","#f0f4ff",[75,955,957],{"transform":956},"translate(368.0,29.0) scale(1.000)",[79,958],{"d":81,"fill":82,"stroke":959,"style":84},"var(--brand-strong,#4338ca)",[24,961,963],{"x":186,"y":88,"style":962},"font-size:13.5px;font-weight:700;fill:var(--brand-strong,#4338ca);text-anchor:middle","Does your code save the workbook?",[101,965],{"x1":186,"y1":966,"x2":186,"y2":967,"stroke":106,"style":73},"91.5","111.5",[101,969],{"x1":970,"y1":967,"x2":971,"y2":967,"stroke":106,"style":73},"134.7","625.3",[101,973],{"x1":970,"y1":967,"x2":970,"y2":974,"stroke":106,"style":73},"157.5",[108,976],{"points":977,"fill":111},"134.7,161.5 129.7,152.5 139.7,152.5",[57,979],{"x":980,"y":981,"width":982,"height":983,"rx":984,"fill":63,"stroke":72,"style":985},"83.8","121.5","101.6","21.0","10","stroke-width:1.2px",[24,987,990],{"x":970,"y":988,"style":989},"136.0","font-size:11.5px;font-weight:700;fill:var(--muted,#5b6780);text-anchor:middle","no, reads only",[57,992],{"x":66,"y":993,"width":994,"height":93,"rx":70,"fill":995,"stroke":996,"style":73},"163.5","229.3","#d9f4f1","var(--teal,#0f9488)",[75,998,1000],{"transform":999},"translate(122.7,176.5) scale(1.000)",[79,1001],{"d":1002,"fill":82,"stroke":1003,"style":84},"M5 12.5l4.5 4.5L19 7","var(--teal-ink,#0b6157)",[24,1005,1008],{"x":970,"y":1006,"style":1007},"223.0","font-size:13.5px;font-weight:700;fill:var(--teal-ink,#0b6157);text-anchor:middle","Silence or use calamine",[24,1010,1012],{"x":970,"y":1011,"style":98},"242.5","nothing is lost",[101,1014],{"x1":186,"y1":967,"x2":186,"y2":974,"stroke":106,"style":73},[108,1016],{"points":1017,"fill":111},"380.0,161.5 375.0,152.5 385.0,152.5",[57,1019],{"x":1020,"y":981,"width":1021,"height":983,"rx":984,"fill":63,"stroke":72,"style":985},"302.5","155.1",[24,1023,1024],{"x":186,"y":988,"style":989},"yes, dropdowns matter",[57,1026],{"x":1027,"y":993,"width":994,"height":93,"rx":70,"fill":953,"stroke":106,"style":73},"265.3",[75,1029,1031],{"transform":1030},"translate(368.0,176.5) scale(1.000)",[79,1032],{"d":1033,"fill":82,"stroke":959,"style":84},"M20 11a8 8 0 1 0-2.3 5.7 M20 4v7h-7",[24,1035,1036],{"x":186,"y":1006,"style":962},"Rebuild the rules",[24,1038,1039],{"x":186,"y":1011,"style":98},"before save()",[101,1041],{"x1":971,"y1":967,"x2":971,"y2":974,"stroke":106,"style":73},[108,1043],{"points":1044,"fill":111},"625.3,161.5 620.3,152.5 630.3,152.5",[57,1046],{"x":1047,"y":981,"width":1048,"height":983,"rx":984,"fill":63,"stroke":72,"style":985},"559.5","131.6",[24,1050,1051],{"x":971,"y":988,"style":989},"yes, it is a template",[57,1053],{"x":1054,"y":993,"width":994,"height":93,"rx":70,"fill":115,"stroke":116,"style":73},"510.7",[75,1056,1058],{"transform":1057},"translate(613.3,176.5) scale(1.000)",[79,1059],{"d":1060,"fill":82,"stroke":123,"style":84},"M6 3h9l4 4v14H6z M15 3v4h4",[24,1062,1063],{"x":971,"y":1006,"style":128},"Leave it alone",[24,1065,1066],{"x":971,"y":1011,"style":98},"write data to another file",[191,1068,1070],{"id":1069},"step-3-saving-rebuild-the-dropdowns-first","Step 3 — Saving? Rebuild the dropdowns first",[10,1072,1073,1074,1077],{},"If the job saves the workbook — filling in a template, adding a sheet — the dropdowns must be put back, or users open a form whose Region cell accepts anything. The rules are still in the original file, so read them from the extension XML and re-create them as ordinary ",[14,1075,1076],{},"DataValidation"," objects. Current Excel versions accept references to other sheets in ordinary list validation, so the rebuilt rule behaves the same:",[19,1079,1081],{"className":236,"code":1080,"language":238,"meta":25,"style":25},"import re\n\nfrom openpyxl.worksheet.datavalidation import DataValidation\n\ndef extension_validations(path: str) -> dict[str, list[dict]]:\n    \"\"\"Map sheet XML part -> list of {type, formula, sqref} from x14 extensions.\"\"\"\n    found = {}\n    with zipfile.ZipFile(path) as z:\n        for name in z.namelist():\n            if not re.match(r\"xl\u002Fworksheets\u002Fsheet\\d+\\.xml$\", name):\n                continue\n            xml = z.read(name).decode()\n            rules = []\n            for block in re.findall(r\"\u003Cx14:dataValidation\\b(.*?)\u003C\u002Fx14:dataValidation>\", xml, re.S):\n                rules.append({\n                    \"type\": re.search(r'type=\"(\\w+)\"', block)[1],\n                    \"formula\": re.search(r\"\u003Cxm:f>(.*?)\u003C\u002Fxm:f>\", block, re.S)[1],\n                    \"sqref\": re.search(r\"\u003Cxm:sqref>(.*?)\u003C\u002Fxm:sqref>\", block, re.S)[1],\n                })\n            if rules:\n                found[name] = rules\n    return found\n\nrules = extension_validations(\"entry_form.xlsx\")\nprint(rules)\n\nwb = load_workbook(\"entry_form.xlsx\")\nsheet = wb.worksheets[0]                       # xl\u002Fworksheets\u002Fsheet1.xml\nfor rule in rules.get(\"xl\u002Fworksheets\u002Fsheet1.xml\", []):\n    dv = DataValidation(type=rule[\"type\"], formula1=f\"={rule['formula']}\", allow_blank=True)\n    dv.error = \"Choose a value from the list.\"\n    sheet.add_data_validation(dv)\n    dv.add(rule[\"sqref\"])\nwb.save(\"entry_form_filled.xlsx\")\n\ncheck = load_workbook(\"entry_form_filled.xlsx\")[\"Entry\"].data_validations.dataValidation\nprint(len(check), check[0].formula1, str(check[0].sqref))   # 1 =Lists!$A$1:$A$3 A2:A100\n",[14,1082,1083,1090,1094,1106,1110,1138,1143,1153,1166,1179,1217,1222,1232,1242,1275,1280,1312,1341,1368,1373,1380,1390,1398,1402,1416,1423,1427,1440,1459,1478,1542,1553,1559,1571,1581,1586,1606],{"__ignoreMap":25},[203,1084,1085,1087],{"class":101,"line":205},[203,1086,246],{"class":245},[203,1088,1089],{"class":249}," re\n",[203,1091,1092],{"class":101,"line":253},[203,1093,257],{"emptyLinePlaceholder":256},[203,1095,1096,1098,1101,1103],{"class":101,"line":260},[203,1097,263],{"class":245},[203,1099,1100],{"class":249}," openpyxl.worksheet.datavalidation ",[203,1102,246],{"class":245},[203,1104,1105],{"class":249}," DataValidation\n",[203,1107,1108],{"class":101,"line":274},[203,1109,257],{"emptyLinePlaceholder":256},[203,1111,1112,1115,1119,1122,1124,1127,1129,1132,1135],{"class":101,"line":279},[203,1113,1114],{"class":245},"def",[203,1116,1118],{"class":1117},"s_Opv"," extension_validations",[203,1120,1121],{"class":249},"(path: ",[203,1123,671],{"class":404},[203,1125,1126],{"class":249},") -> dict[",[203,1128,671],{"class":404},[203,1130,1131],{"class":249},", list[",[203,1133,1134],{"class":404},"dict",[203,1136,1137],{"class":249},"]]:\n",[203,1139,1140],{"class":101,"line":291},[203,1141,1142],{"class":212},"    \"\"\"Map sheet XML part -> list of {type, formula, sqref} from x14 extensions.\"\"\"\n",[203,1144,1145,1148,1150],{"class":101,"line":302},[203,1146,1147],{"class":249},"    found ",[203,1149,285],{"class":245},[203,1151,1152],{"class":249}," {}\n",[203,1154,1155,1158,1161,1163],{"class":101,"line":313},[203,1156,1157],{"class":245},"    with",[203,1159,1160],{"class":249}," zipfile.ZipFile(path) ",[203,1162,468],{"class":245},[203,1164,1165],{"class":249}," z:\n",[203,1167,1168,1171,1174,1176],{"class":101,"line":330},[203,1169,1170],{"class":245},"        for",[203,1172,1173],{"class":249}," name ",[203,1175,356],{"class":245},[203,1177,1178],{"class":249}," z.namelist():\n",[203,1180,1181,1184,1187,1190,1193,1196,1199,1201,1205,1208,1211,1214],{"class":101,"line":347},[203,1182,1183],{"class":245},"            if",[203,1185,1186],{"class":245}," not",[203,1188,1189],{"class":249}," re.match(",[203,1191,1192],{"class":245},"r",[203,1194,1195],{"class":212},"\"xl\u002Fworksheets\u002Fsheet",[203,1197,1198],{"class":404},"\\d",[203,1200,562],{"class":245},[203,1202,1204],{"class":1203},"s_b0D","\\.",[203,1206,1207],{"class":212},"xml",[203,1209,1210],{"class":404},"$",[203,1212,1213],{"class":212},"\"",[203,1215,1216],{"class":249},", name):\n",[203,1218,1219],{"class":101,"line":379},[203,1220,1221],{"class":245},"                continue\n",[203,1223,1224,1227,1229],{"class":101,"line":385},[203,1225,1226],{"class":249},"            xml ",[203,1228,285],{"class":245},[203,1230,1231],{"class":249}," z.read(name).decode()\n",[203,1233,1234,1237,1239],{"class":101,"line":396},[203,1235,1236],{"class":249},"            rules ",[203,1238,285],{"class":245},[203,1240,1241],{"class":249}," []\n",[203,1243,1244,1247,1250,1252,1255,1257,1260,1263,1266,1269,1272],{"class":101,"line":401},[203,1245,1246],{"class":245},"            for",[203,1248,1249],{"class":249}," block ",[203,1251,356],{"class":245},[203,1253,1254],{"class":249}," re.findall(",[203,1256,1192],{"class":245},[203,1258,1259],{"class":212},"\"\u003Cx14:dataValidation",[203,1261,1262],{"class":404},"\\b(.",[203,1264,1265],{"class":245},"*?",[203,1267,1268],{"class":404},")",[203,1270,1271],{"class":212},"\u003C\u002Fx14:dataValidation>\"",[203,1273,1274],{"class":249},", xml, re.S):\n",[203,1276,1277],{"class":101,"line":417},[203,1278,1279],{"class":249},"                rules.append({\n",[203,1281,1282,1285,1288,1290,1293,1296,1298,1300,1303,1306,1309],{"class":101,"line":423},[203,1283,1284],{"class":212},"                    \"type\"",[203,1286,1287],{"class":249},": re.search(",[203,1289,1192],{"class":245},[203,1291,1292],{"class":212},"'type=\"",[203,1294,1295],{"class":404},"(\\w",[203,1297,562],{"class":245},[203,1299,1268],{"class":404},[203,1301,1302],{"class":212},"\"'",[203,1304,1305],{"class":249},", block)[",[203,1307,1308],{"class":404},"1",[203,1310,1311],{"class":249},"],\n",[203,1313,1314,1317,1319,1321,1324,1327,1329,1331,1334,1337,1339],{"class":101,"line":429},[203,1315,1316],{"class":212},"                    \"formula\"",[203,1318,1287],{"class":249},[203,1320,1192],{"class":245},[203,1322,1323],{"class":212},"\"\u003Cxm:f>",[203,1325,1326],{"class":404},"(.",[203,1328,1265],{"class":245},[203,1330,1268],{"class":404},[203,1332,1333],{"class":212},"\u003C\u002Fxm:f>\"",[203,1335,1336],{"class":249},", block, re.S)[",[203,1338,1308],{"class":404},[203,1340,1311],{"class":249},[203,1342,1343,1346,1348,1350,1353,1355,1357,1359,1362,1364,1366],{"class":101,"line":435},[203,1344,1345],{"class":212},"                    \"sqref\"",[203,1347,1287],{"class":249},[203,1349,1192],{"class":245},[203,1351,1352],{"class":212},"\"\u003Cxm:sqref>",[203,1354,1326],{"class":404},[203,1356,1265],{"class":245},[203,1358,1268],{"class":404},[203,1360,1361],{"class":212},"\u003C\u002Fxm:sqref>\"",[203,1363,1336],{"class":249},[203,1365,1308],{"class":404},[203,1367,1311],{"class":249},[203,1369,1370],{"class":101,"line":441},[203,1371,1372],{"class":249},"                })\n",[203,1374,1375,1377],{"class":101,"line":449},[203,1376,1183],{"class":245},[203,1378,1379],{"class":249}," rules:\n",[203,1381,1382,1385,1387],{"class":101,"line":454},[203,1383,1384],{"class":249},"                found[name] ",[203,1386,285],{"class":245},[203,1388,1389],{"class":249}," rules\n",[203,1391,1392,1395],{"class":101,"line":495},[203,1393,1394],{"class":245},"    return",[203,1396,1397],{"class":249}," found\n",[203,1399,1400],{"class":101,"line":509},[203,1401,257],{"emptyLinePlaceholder":256},[203,1403,1404,1407,1409,1412,1414],{"class":101,"line":520},[203,1405,1406],{"class":249},"rules ",[203,1408,285],{"class":245},[203,1410,1411],{"class":249}," extension_validations(",[203,1413,474],{"class":212},[203,1415,344],{"class":249},[203,1417,1418,1420],{"class":101,"line":538},[203,1419,665],{"class":404},[203,1421,1422],{"class":249},"(rules)\n",[203,1424,1425],{"class":101,"line":572},[203,1426,257],{"emptyLinePlaceholder":256},[203,1428,1430,1432,1434,1436,1438],{"class":101,"line":1429},27,[203,1431,282],{"class":249},[203,1433,285],{"class":245},[203,1435,656],{"class":249},[203,1437,474],{"class":212},[203,1439,344],{"class":249},[203,1441,1443,1446,1448,1451,1453,1456],{"class":101,"line":1442},28,[203,1444,1445],{"class":249},"sheet ",[203,1447,285],{"class":245},[203,1449,1450],{"class":249}," wb.worksheets[",[203,1452,60],{"class":404},[203,1454,1455],{"class":249},"]                       ",[203,1457,1458],{"class":706},"# xl\u002Fworksheets\u002Fsheet1.xml\n",[203,1460,1462,1464,1467,1469,1472,1475],{"class":101,"line":1461},29,[203,1463,350],{"class":245},[203,1465,1466],{"class":249}," rule ",[203,1468,356],{"class":245},[203,1470,1471],{"class":249}," rules.get(",[203,1473,1474],{"class":212},"\"xl\u002Fworksheets\u002Fsheet1.xml\"",[203,1476,1477],{"class":249},", []):\n",[203,1479,1481,1484,1486,1489,1492,1494,1497,1500,1503,1506,1508,1511,1514,1518,1520,1523,1526,1529,1531,1533,1536,1538,1540],{"class":101,"line":1480},30,[203,1482,1483],{"class":249},"    dv ",[203,1485,285],{"class":245},[203,1487,1488],{"class":249}," DataValidation(",[203,1490,1491],{"class":623},"type",[203,1493,285],{"class":245},[203,1495,1496],{"class":249},"rule[",[203,1498,1499],{"class":212},"\"type\"",[203,1501,1502],{"class":249},"], ",[203,1504,1505],{"class":623},"formula1",[203,1507,285],{"class":245},[203,1509,1510],{"class":245},"f",[203,1512,1513],{"class":212},"\"=",[203,1515,1517],{"class":1516},"sSjpA","{",[203,1519,1496],{"class":249},[203,1521,1522],{"class":212},"'formula'",[203,1524,1525],{"class":249},"]",[203,1527,1528],{"class":1516},"}",[203,1530,1213],{"class":212},[203,1532,365],{"class":249},[203,1534,1535],{"class":623},"allow_blank",[203,1537,285],{"class":245},[203,1539,629],{"class":404},[203,1541,344],{"class":249},[203,1543,1545,1548,1550],{"class":101,"line":1544},31,[203,1546,1547],{"class":249},"    dv.error ",[203,1549,285],{"class":245},[203,1551,1552],{"class":212}," \"Choose a value from the list.\"\n",[203,1554,1556],{"class":101,"line":1555},32,[203,1557,1558],{"class":249},"    sheet.add_data_validation(dv)\n",[203,1560,1562,1565,1568],{"class":101,"line":1561},33,[203,1563,1564],{"class":249},"    dv.add(rule[",[203,1566,1567],{"class":212},"\"sqref\"",[203,1569,1570],{"class":249},"])\n",[203,1572,1574,1576,1579],{"class":101,"line":1573},34,[203,1575,388],{"class":249},[203,1577,1578],{"class":212},"\"entry_form_filled.xlsx\"",[203,1580,344],{"class":249},[203,1582,1584],{"class":101,"line":1583},35,[203,1585,257],{"emptyLinePlaceholder":256},[203,1587,1589,1592,1594,1596,1598,1601,1603],{"class":101,"line":1588},36,[203,1590,1591],{"class":249},"check ",[203,1593,285],{"class":245},[203,1595,656],{"class":249},[203,1597,1578],{"class":212},[203,1599,1600],{"class":249},")[",[203,1602,700],{"class":212},[203,1604,1605],{"class":249},"].data_validations.dataValidation\n",[203,1607,1609,1611,1613,1615,1618,1620,1623,1625,1628,1630,1633],{"class":101,"line":1608},37,[203,1610,665],{"class":404},[203,1612,691],{"class":249},[203,1614,694],{"class":404},[203,1616,1617],{"class":249},"(check), check[",[203,1619,60],{"class":404},[203,1621,1622],{"class":249},"].formula1, ",[203,1624,671],{"class":404},[203,1626,1627],{"class":249},"(check[",[203,1629,60],{"class":404},[203,1631,1632],{"class":249},"].sqref))   ",[203,1634,1635],{"class":706},"# 1 =Lists!$A$1:$A$3 A2:A100\n",[10,1637,1638,1639,365,1642,1645,1646,1649,1650,886],{},"The sheet part numbers (",[14,1640,1641],{},"sheet1.xml",[14,1643,1644],{},"sheet2.xml",") follow the workbook's sheet order in files written by Excel; for a robust mapping, read ",[14,1647,1648],{},"xl\u002Fworkbook.xml"," and its relationships to pair part names with sheet titles. More on building dropdowns from scratch in ",[32,1651,1653],{"href":1652},"\u002Fadvanced-data-transformation-and-cleaning\u002Fvalidating-excel-data-with-python\u002Fadd-dropdown-data-validation-to-excel-with-openpyxl\u002F","Add Dropdown Data Validation to Excel with openpyxl",[38,1655,47,1661,47,1664,47,1667,47,1672,47,1679,47,1684,47,1690,47,1696,47,1702,47,1705,47,1711,47,1715,47,1719,47,1723,47,1727,47,1729,47,1733,47,1735,47,1738,47,1742,47,1744,47,1748,47,1750,47,1753,47,1757,47,1759,47,1761,47,1764,47,1767,47,1769,47,1771,47,1776,47,1782,47,1787,47,1791,47,1795,47,1800,47,1803,47,1808,47,1814,47,1819,47,1823],{"viewBox":1656,"role":41,"ariaLabelledBy":1657,"xmlns":45,"style":1660},"162 0 435 222",[1658,1659],"dvx-result-t","dvx-result-d","width:100%;max-width:435px;height:auto;display:block;margin:1.5rem auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif",[49,1662,1663],{"id":1658},"The Entry sheet with its rebuilt dropdown",[53,1665,1666],{"id":1659},"After rebuilding, cells A2 to A100 on the Entry sheet again offer a dropdown whose options North, South and East come from the Lists sheet, now stored as an ordinary data validation rule that openpyxl reads and writes.",[57,1668],{"x":1669,"y":60,"width":1670,"height":1671,"fill":63},"162","435","222",[57,1673],{"x":1674,"y":67,"width":1675,"height":1676,"rx":1677,"fill":71,"stroke":72,"style":1678},"179.0","182.1","30.0","8","stroke-width:1.5px",[57,1680],{"x":1674,"y":1681,"width":1675,"height":1682,"rx":60,"fill":71,"stroke":72,"style":1683},"38.0","8.0","stroke-width:0px",[75,1685,1687],{"transform":1686},"translate(189.0,23.0) scale(0.667)",[79,1688],{"d":81,"fill":82,"stroke":1003,"style":1689},"stroke-width:2.70px;stroke-linecap:round;stroke-linejoin:round",[24,1691,1695],{"x":1692,"y":1693,"style":1694},"211.0","36.0","font-size:12px;font-weight:700;fill:var(--text,#172033);text-anchor:start","entry_form_filled.xlsx",[57,1697],{"x":1674,"y":1698,"width":1699,"height":1700,"rx":60,"fill":71,"stroke":72,"style":1701},"46.0","32.0","24.0","stroke-width:1px",[57,1703],{"x":1692,"y":1698,"width":1704,"height":1700,"rx":60,"fill":71,"stroke":72,"style":1701},"69.5",[24,1706,1710],{"x":1707,"y":1708,"style":1709},"245.7","63.0","font-size:11px;font-weight:600;fill:var(--muted,#5b6780);text-anchor:middle","A",[57,1712],{"x":1713,"y":1698,"width":1714,"height":1700,"rx":60,"fill":71,"stroke":72,"style":1701},"280.4","80.6",[24,1716,1718],{"x":1717,"y":1708,"style":1709},"320.7","B",[57,1720],{"x":1674,"y":1721,"width":1699,"height":1722,"rx":60,"fill":71,"stroke":72,"style":1701},"70.0","28.0",[24,1724,1308],{"x":1725,"y":1726,"style":1709},"195.0","89.0",[57,1728],{"x":1692,"y":1721,"width":1704,"height":1722,"rx":60,"fill":953,"stroke":106,"style":1678},[24,1730,1732],{"x":1707,"y":1726,"style":1731},"font-size:12px;font-weight:700;fill:var(--brand-strong,#4338ca);text-anchor:middle","Region",[57,1734],{"x":1713,"y":1721,"width":1714,"height":1722,"rx":60,"fill":63,"stroke":72,"style":1701},[57,1736],{"x":1674,"y":1737,"width":1699,"height":1722,"rx":60,"fill":71,"stroke":72,"style":1701},"98.0",[24,1739,1741],{"x":1725,"y":1740,"style":1709},"117.0","2",[57,1743],{"x":1692,"y":1737,"width":1704,"height":1722,"rx":60,"fill":995,"stroke":996,"style":1678},[24,1745,1747],{"x":1707,"y":1740,"style":1746},"font-size:12px;font-weight:700;fill:var(--teal-ink,#0b6157);text-anchor:middle","North ▾",[57,1749],{"x":1713,"y":1737,"width":1714,"height":1722,"rx":60,"fill":63,"stroke":72,"style":1701},[57,1751],{"x":1674,"y":1752,"width":1699,"height":1722,"rx":60,"fill":71,"stroke":72,"style":1701},"126.0",[24,1754,1756],{"x":1725,"y":1755,"style":1709},"145.0","3",[57,1758],{"x":1692,"y":1752,"width":1704,"height":1722,"rx":60,"fill":63,"stroke":72,"style":1701},[57,1760],{"x":1713,"y":1752,"width":1714,"height":1722,"rx":60,"fill":63,"stroke":72,"style":1701},[57,1762],{"x":1674,"y":1763,"width":1699,"height":1722,"rx":60,"fill":71,"stroke":72,"style":1701},"154.0",[24,1765,59],{"x":1725,"y":1766,"style":1709},"173.0",[57,1768],{"x":1692,"y":1763,"width":1704,"height":1722,"rx":60,"fill":63,"stroke":72,"style":1701},[57,1770],{"x":1713,"y":1763,"width":1714,"height":1722,"rx":60,"fill":63,"stroke":72,"style":1701},[57,1772],{"x":1773,"y":1774,"width":1775,"height":1700,"rx":60,"fill":63,"stroke":72,"style":1701},"187.0","182.0","55.5",[101,1777],{"x1":1778,"y1":1779,"x2":1780,"y2":1779,"stroke":996,"style":1781},"189.0","205.0","240.4","stroke-width:3px",[24,1783,228],{"x":1784,"y":1785,"style":1786},"214.7","198.5","font-size:11.5px;font-weight:700;fill:var(--teal-ink,#0b6157);text-anchor:middle",[57,1788],{"x":1789,"y":1774,"width":1790,"height":1700,"rx":60,"fill":71,"stroke":72,"style":1701},"244.4","50.4",[24,1792,232],{"x":1793,"y":1785,"style":1794},"269.7","font-size:11.5px;font-weight:400;fill:var(--muted,#5b6780);text-anchor:middle",[101,1796],{"x1":1797,"y1":1798,"x2":1799,"y2":1798,"stroke":106,"style":73},"369.0","111.0","401.0",[108,1801],{"points":1802,"fill":111},"405.0,111.0 396.0,116.0 396.0,106.0",[57,1804],{"x":1805,"y":1806,"width":1807,"height":69,"rx":70,"fill":995,"stroke":996,"style":73},"411.0","55.8","170.0",[75,1809,1811],{"transform":1810},"translate(484.0,68.8) scale(1.000)",[79,1812],{"d":1813,"fill":82,"stroke":1003,"style":84},"M3 5h18l-7 8v6l-4 2v-8z",[24,1815,1818],{"x":1816,"y":1817,"style":1007},"496.0","115.2","=Lists!$A$1:$A$3",[24,1820,1822],{"x":1816,"y":1821,"style":98},"134.8","ordinary validation",[24,1824,1826],{"x":1816,"y":1825,"style":98},"152.2","applies to A2:A100",[191,1828,1830],{"id":1829},"step-4-map-extension-rules-to-the-right-sheets","Step 4 — Map extension rules to the right sheets",[10,1832,1833,1834,1836,1837,1840],{},"Step 3 assumed the first sheet part belongs to the first sheet, which holds for workbooks Excel wrote but not for every file. The reliable mapping goes through the workbook's own index: ",[14,1835,1648],{}," lists each sheet's name with a relationship id, and ",[14,1838,1839],{},"xl\u002F_rels\u002Fworkbook.xml.rels"," maps that id to the part file:",[19,1842,1844],{"className":236,"code":1843,"language":238,"meta":25,"style":25},"def sheet_parts(path: str) -> dict[str, str]:\n    \"\"\"Map worksheet part name -> sheet title.\"\"\"\n    with zipfile.ZipFile(path) as z:\n        book = z.read(\"xl\u002Fworkbook.xml\").decode()\n        rels = z.read(\"xl\u002F_rels\u002Fworkbook.xml.rels\").decode()\n    targets = {}\n    for tag in re.findall(r\"\u003CRelationship\\b[^>]*>\", rels):      # attribute order varies by writer\n        targets[re.search(r'\\bId=\"([^\"]+)\"', tag)[1]] = re.search(r'\\bTarget=\"([^\"]+)\"', tag)[1]\n    mapping = {}\n    for name, rid in re.findall(r'\u003Csheet[^>]*name=\"([^\"]+)\"[^>]*r:id=\"([^\"]+)\"', book):\n        target = targets[rid].lstrip(\"\u002F\")\n        mapping[target if target.startswith(\"xl\u002F\") else f\"xl\u002F{target}\"] = name\n    return mapping\n\nparts = sheet_parts(\"entry_form.xlsx\")\nprint(parts)   # {'xl\u002Fworksheets\u002Fsheet1.xml': 'Entry', 'xl\u002Fworksheets\u002Fsheet2.xml': 'Lists'}\n",[14,1845,1846,1867,1872,1882,1898,1912,1921,1960,2033,2042,2116,2131,2172,2179,2183,2197],{"__ignoreMap":25},[203,1847,1848,1850,1853,1855,1857,1859,1861,1863,1865],{"class":101,"line":205},[203,1849,1114],{"class":245},[203,1851,1852],{"class":1117}," sheet_parts",[203,1854,1121],{"class":249},[203,1856,671],{"class":404},[203,1858,1126],{"class":249},[203,1860,671],{"class":404},[203,1862,365],{"class":249},[203,1864,671],{"class":404},[203,1866,376],{"class":249},[203,1868,1869],{"class":101,"line":253},[203,1870,1871],{"class":212},"    \"\"\"Map worksheet part name -> sheet title.\"\"\"\n",[203,1873,1874,1876,1878,1880],{"class":101,"line":260},[203,1875,1157],{"class":245},[203,1877,1160],{"class":249},[203,1879,468],{"class":245},[203,1881,1165],{"class":249},[203,1883,1884,1887,1889,1892,1895],{"class":101,"line":274},[203,1885,1886],{"class":249},"        book ",[203,1888,285],{"class":245},[203,1890,1891],{"class":249}," z.read(",[203,1893,1894],{"class":212},"\"xl\u002Fworkbook.xml\"",[203,1896,1897],{"class":249},").decode()\n",[203,1899,1900,1903,1905,1907,1910],{"class":101,"line":279},[203,1901,1902],{"class":249},"        rels ",[203,1904,285],{"class":245},[203,1906,1891],{"class":249},[203,1908,1909],{"class":212},"\"xl\u002F_rels\u002Fworkbook.xml.rels\"",[203,1911,1897],{"class":249},[203,1913,1914,1917,1919],{"class":101,"line":291},[203,1915,1916],{"class":249},"    targets ",[203,1918,285],{"class":245},[203,1920,1152],{"class":249},[203,1922,1923,1925,1928,1930,1932,1934,1937,1940,1943,1946,1948,1951,1954,1957],{"class":101,"line":302},[203,1924,498],{"class":245},[203,1926,1927],{"class":249}," tag ",[203,1929,356],{"class":245},[203,1931,1254],{"class":249},[203,1933,1192],{"class":245},[203,1935,1936],{"class":212},"\"\u003CRelationship",[203,1938,1939],{"class":404},"\\b[",[203,1941,1942],{"class":245},"^",[203,1944,1945],{"class":1516},">",[203,1947,1525],{"class":404},[203,1949,1950],{"class":245},"*",[203,1952,1953],{"class":212},">\"",[203,1955,1956],{"class":249},", rels):      ",[203,1958,1959],{"class":706},"# attribute order varies by writer\n",[203,1961,1962,1965,1967,1970,1973,1976,1978,1980,1982,1984,1986,1988,1990,1993,1995,1998,2000,2003,2005,2007,2009,2012,2014,2016,2018,2020,2022,2024,2026,2028,2030],{"class":101,"line":313},[203,1963,1964],{"class":249},"        targets[re.search(",[203,1966,1192],{"class":245},[203,1968,1969],{"class":212},"'",[203,1971,1972],{"class":404},"\\b",[203,1974,1975],{"class":212},"Id=\"",[203,1977,668],{"class":404},[203,1979,1942],{"class":245},[203,1981,1213],{"class":1516},[203,1983,1525],{"class":404},[203,1985,562],{"class":245},[203,1987,1268],{"class":404},[203,1989,1302],{"class":212},[203,1991,1992],{"class":249},", tag)[",[203,1994,1308],{"class":404},[203,1996,1997],{"class":249},"]] ",[203,1999,285],{"class":245},[203,2001,2002],{"class":249}," re.search(",[203,2004,1192],{"class":245},[203,2006,1969],{"class":212},[203,2008,1972],{"class":404},[203,2010,2011],{"class":212},"Target=\"",[203,2013,668],{"class":404},[203,2015,1942],{"class":245},[203,2017,1213],{"class":1516},[203,2019,1525],{"class":404},[203,2021,562],{"class":245},[203,2023,1268],{"class":404},[203,2025,1302],{"class":212},[203,2027,1992],{"class":249},[203,2029,1308],{"class":404},[203,2031,2032],{"class":249},"]\n",[203,2034,2035,2038,2040],{"class":101,"line":330},[203,2036,2037],{"class":249},"    mapping ",[203,2039,285],{"class":245},[203,2041,1152],{"class":249},[203,2043,2044,2046,2049,2051,2053,2055,2058,2061,2063,2065,2067,2069,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2099,2101,2103,2105,2107,2109,2111,2113],{"class":101,"line":347},[203,2045,498],{"class":245},[203,2047,2048],{"class":249}," name, rid ",[203,2050,356],{"class":245},[203,2052,1254],{"class":249},[203,2054,1192],{"class":245},[203,2056,2057],{"class":212},"'\u003Csheet",[203,2059,2060],{"class":404},"[",[203,2062,1942],{"class":245},[203,2064,1945],{"class":1516},[203,2066,1525],{"class":404},[203,2068,1950],{"class":245},[203,2070,2071],{"class":212},"name=\"",[203,2073,668],{"class":404},[203,2075,1942],{"class":245},[203,2077,1213],{"class":1516},[203,2079,1525],{"class":404},[203,2081,562],{"class":245},[203,2083,1268],{"class":404},[203,2085,1213],{"class":212},[203,2087,2060],{"class":404},[203,2089,1942],{"class":245},[203,2091,1945],{"class":1516},[203,2093,1525],{"class":404},[203,2095,1950],{"class":245},[203,2097,2098],{"class":212},"r:id=\"",[203,2100,668],{"class":404},[203,2102,1942],{"class":245},[203,2104,1213],{"class":1516},[203,2106,1525],{"class":404},[203,2108,562],{"class":245},[203,2110,1268],{"class":404},[203,2112,1302],{"class":212},[203,2114,2115],{"class":249},", book):\n",[203,2117,2118,2121,2123,2126,2129],{"class":101,"line":379},[203,2119,2120],{"class":249},"        target ",[203,2122,285],{"class":245},[203,2124,2125],{"class":249}," targets[rid].lstrip(",[203,2127,2128],{"class":212},"\"\u002F\"",[203,2130,344],{"class":249},[203,2132,2133,2136,2139,2142,2145,2147,2150,2153,2156,2158,2161,2163,2165,2167,2169],{"class":101,"line":385},[203,2134,2135],{"class":249},"        mapping[target ",[203,2137,2138],{"class":245},"if",[203,2140,2141],{"class":249}," target.startswith(",[203,2143,2144],{"class":212},"\"xl\u002F\"",[203,2146,465],{"class":249},[203,2148,2149],{"class":245},"else",[203,2151,2152],{"class":245}," f",[203,2154,2155],{"class":212},"\"xl\u002F",[203,2157,1517],{"class":1516},[203,2159,2160],{"class":249},"target",[203,2162,1528],{"class":1516},[203,2164,1213],{"class":212},[203,2166,322],{"class":249},[203,2168,285],{"class":245},[203,2170,2171],{"class":249}," name\n",[203,2173,2174,2176],{"class":101,"line":396},[203,2175,1394],{"class":245},[203,2177,2178],{"class":249}," mapping\n",[203,2180,2181],{"class":101,"line":401},[203,2182,257],{"emptyLinePlaceholder":256},[203,2184,2185,2188,2190,2193,2195],{"class":101,"line":417},[203,2186,2187],{"class":249},"parts ",[203,2189,285],{"class":245},[203,2191,2192],{"class":249}," sheet_parts(",[203,2194,474],{"class":212},[203,2196,344],{"class":249},[203,2198,2199,2201,2204],{"class":101,"line":423},[203,2200,665],{"class":404},[203,2202,2203],{"class":249},"(parts)   ",[203,2205,2206],{"class":706},"# {'xl\u002Fworksheets\u002Fsheet1.xml': 'Entry', 'xl\u002Fworksheets\u002Fsheet2.xml': 'Lists'}\n",[10,2208,2209,2210,2213,2214,2217,2218,2221],{},"With this mapping, the rebuild loop becomes ",[14,2211,2212],{},"wb[parts[part]]"," instead of ",[14,2215,2216],{},"wb.worksheets[0]",", and it works however the sheets were created or reordered. Regular expressions are adequate here because the files are machine-written, provided you match each attribute separately — different writers put them in different orders; for anything more elaborate, parse the XML with ",[14,2219,2220],{},"xml.etree.ElementTree"," and the proper namespaces.",[191,2223,2225],{"id":2224},"step-5-or-keep-openpyxl-away-from-the-template","Step 5 — Or keep openpyxl away from the template",[10,2227,2228,2229,886],{},"The cleanest design for data-entry templates is not to save them with a library at all. Let people fill in the template in Excel; have Python read their entries (harmless, Step 2) and write results to a separate output workbook it creates from scratch. The template's dropdowns, formatting and protection are never at risk, and there is no extension to rebuild. The same principle — design in Excel, data from Python — runs through ",[32,2230,2232],{"href":2231},"\u002Fautomating-reporting-workflows\u002Fgenerating-excel-reports-from-templates\u002F","Generating Excel Reports from Templates",[191,2234,2236],{"id":2235},"common-pitfalls","Common pitfalls",[2238,2239,2240,2248,2254,2260,2266],"ul",{},[2241,2242,2243,2247],"li",{},[2244,2245,2246],"strong",{},"Ignoring all UserWarnings."," It hides the warnings about other features openpyxl drops. Filter by message and module.",[2241,2249,2250,2253],{},[2244,2251,2252],{},"Assuming the file is broken."," The warning is not an error; values are read correctly, and the workbook opens normally in Excel as long as openpyxl has not saved over it.",[2241,2255,2256,2259],{},[2244,2257,2258],{},"Warning once per file in a loop."," Python shows a given warning only once per location by default, so a batch job may warn for the first file and stay silent for the rest. Capture warnings per file, as in Step 1, if you need to know which files carried extensions.",[2241,2261,2262,2265],{},[2244,2263,2264],{},"Rebuilding the rule on the wrong sheet."," Match extension rules to sheets by part name and workbook order, and check the result by reloading, as in Step 3.",[2241,2267,2268,2271],{},[2244,2269,2270],{},"Other extension warnings."," \"Conditional Formatting extension is not supported\" and \"Sparkline Group extension is not supported\" are the same situation for other features. Treat them the same way: harmless for reading, destructive for saving.",[191,2273,2275],{"id":2274},"conclusion","Conclusion",[10,2277,2278,2279,2281],{},"The warning means openpyxl skipped a dropdown stored in an Excel extension block — usually a list whose options live on another sheet. For read-only work, silence that specific warning or read with calamine. When you must save the workbook, read the rules from the extension XML and add them back as ordinary ",[14,2280,1076],{}," objects first, then verify by reloading — or better, keep designed templates out of openpyxl's save path altogether.",[191,2283,2285],{"id":2284},"frequently-asked-questions","Frequently asked questions",[10,2287,2288,2291],{},[2244,2289,2290],{},"Is the warning an error?","\nNo. It is a UserWarning. The file loads and all cell values are read correctly. What is lost is the dropdown or validation rule stored in the extension, and that only matters if you save the workbook again.",[10,2293,2294,2297],{},[2244,2295,2296],{},"Why does Excel store validation in an extension?","\nExcel writes list validations that take their options from another worksheet in an extension block, for compatibility with older Excel versions. openpyxl does not read that block, so it warns and discards it.",[10,2299,2300,2303],{},[2244,2301,2302],{},"How do I hide the warning without hiding other warnings?","\nFilter it by message and module — warnings.filterwarnings(\"ignore\", message=\"Data Validation extension is not supported\", module=\"openpyxl\") — rather than ignoring all UserWarnings.",[10,2305,2306,2309],{},[2244,2307,2308],{},"How do I keep the dropdowns when saving with openpyxl?","\nRead the extension rules from the file before loading, then add them back as ordinary DataValidation objects with the same formula and ranges. Current Excel versions accept cross-sheet references in ordinary validation.",[191,2311,2313],{"id":2312},"related","Related",[2238,2315,2316,2322,2329,2336],{},[2241,2317,2318,2319,2321],{},"Up one level: ",[32,2320,35],{"href":34}," — every common error explained.",[2241,2323,2324,2328],{},[32,2325,2327],{"href":2326},"\u002Fadvanced-data-transformation-and-cleaning\u002Fvalidating-excel-data-with-python\u002F","Validating Excel Data with Python"," — validation from the data side.",[2241,2330,2331,2335],{},[32,2332,2334],{"href":2333},"\u002Fautomating-reporting-workflows\u002Fgenerating-excel-reports-from-templates\u002Fpopulate-excel-template-without-losing-formatting\u002F","Populate an Excel Template Without Losing Formatting"," — template filling done safely.",[2241,2337,2338,2342],{},[32,2339,2341],{"href":2340},"\u002Fadvanced-data-transformation-and-cleaning\u002Freading-excel-with-polars-and-arrow\u002Fspeed-up-pandas-excel-reads-with-the-calamine-engine\u002F","Speed Up pandas Excel Reads with the calamine Engine"," — the warning-free reader.",[2344,2345,2346],"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 .s-wDw, html code.shiki .s-wDw{--shiki-default:#6A737D;--shiki-dark:#BDC4CC}html pre.shiki code .s_Opv, html code.shiki .s_Opv{--shiki-default:#6F42C1;--shiki-dark:#DBB7FF}html pre.shiki code .s_b0D, html code.shiki .s_b0D{--shiki-default:#22863A;--shiki-default-font-weight:bold;--shiki-dark:#72F088;--shiki-dark-font-weight:bold}html pre.shiki code .sSjpA, html code.shiki .sSjpA{--shiki-default:#005CC5;--shiki-dark:#FF9492}",{"title":25,"searchDepth":253,"depth":253,"links":2348},[2349,2350,2351,2352,2353,2354,2355,2356,2357,2358],{"id":193,"depth":253,"text":194},{"id":578,"depth":253,"text":579},{"id":748,"depth":253,"text":749},{"id":1069,"depth":253,"text":1070},{"id":1829,"depth":253,"text":1830},{"id":2224,"depth":253,"text":2225},{"id":2235,"depth":253,"text":2236},{"id":2274,"depth":253,"text":2275},{"id":2284,"depth":253,"text":2285},{"id":2312,"depth":253,"text":2313},"2026-09-23","What openpyxl's \"Data Validation extension is not supported and will be removed\" warning means, when it is harmless, how to silence it narrowly, and how to rebuild the dropdowns it drops before you save the workbook.","md",[2363,2365,2367,2369],{"q":2290,"a":2364},"No. It is a UserWarning. The file loads and all cell values are read correctly. What is lost is the dropdown or validation rule stored in the extension, and that only matters if you save the workbook again.",{"q":2296,"a":2366},"Excel writes list validations that take their options from another worksheet in an extension block, for compatibility with older Excel versions. openpyxl does not read that block, so it warns and discards it.",{"q":2302,"a":2368},"Filter it by message and module — warnings.filterwarnings(\"ignore\", message=\"Data Validation extension is not supported\", module=\"openpyxl\") — rather than ignoring all UserWarnings.",{"q":2308,"a":2370},"Read the extension rules from the file before loading, then add them back as ordinary DataValidation objects with the same formula and ranges. Current Excel versions accept cross-sheet references in ordinary validation.","fix the data validation extension is not supported warning in openpyxl",null,{"breadcrumb":2374},[2375,2378,2381],{"name":2376,"item":2377},"Home","\u002F",{"name":2379,"item":2380},"Getting Started with Python Excel Automation","\u002Fgetting-started-with-python-excel-automation\u002F",{"name":35,"item":34},"\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-data-validation-extension-is-not-supported-warning",{"title":2384,"description":2385},"openpyxl: Data Validation extension is not supported and will be removed — fix","Understand and fix the openpyxl UserWarning about data validation extensions — harmless for reading with pandas, destructive when saving. Silence it precisely, read with calamine, or rebuild the dropdowns as standard validation.","fix-data-validation-extension-is-not-supported-warning","getting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-data-validation-extension-is-not-supported-warning\u002Findex",[2389,2390,2391],"troubleshooting","reading-excel","openpyxl","how-to","_zo9Ep6aeHeoc6nNSo2j2K6p16CSKw1GtKN0Jcii7EI",[2395,2399],{"title":2396,"path":2397,"stem":2398,"children":-1},"Fix \"Could Not Convert String to Float\" in Excel Data","\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-could-not-convert-string-to-float-in-excel-data","getting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-could-not-convert-string-to-float-in-excel-data\u002Findex",{"title":2400,"path":2401,"stem":2402,"children":-1},"Fix Duplicate Column Names When Reading Excel with pandas","\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-duplicate-column-names-when-reading-excel","getting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors\u002Ffix-duplicate-column-names-when-reading-excel\u002Findex",[2404,2406],{"path":2405,"title":2379},"\u002Fgetting-started-with-python-excel-automation",{"path":2407,"title":35},"\u002Fgetting-started-with-python-excel-automation\u002Ftroubleshooting-common-python-excel-errors",[],[2410,2414,2416,2419,2422,2425],{"path":2411,"title":2412,"kind":2413},"\u002Fautomating-reporting-workflows\u002Ferror-handling-and-logging-in-excel-automation\u002Fhandle-permission-denied-when-writing-excel-in-python","Handle Permission Denied When Writing Excel in Python","fix",{"path":2415,"title":885,"kind":2392},"\u002Fgetting-started-with-python-excel-automation\u002Fusing-openpyxl-for-excel-file-manipulation\u002Fwhat-openpyxl-loses-when-saving-an-existing-workbook",{"path":2417,"title":2418,"kind":2413},"\u002Fadvanced-data-transformation-and-cleaning\u002Fworking-with-dates-and-times-in-excel-data\u002Ffix-excel-serial-numbers-showing-instead-of-dates","Fix Excel Serial Numbers Showing Instead of Dates",{"path":2420,"title":2421,"kind":2392},"\u002Fadvanced-data-transformation-and-cleaning\u002Fworking-with-dates-and-times-in-excel-data\u002Fhandle-daylight-saving-time-in-excel-timestamps","Handle Daylight Saving Time in Excel Timestamps",{"path":2423,"title":2424,"kind":2392},"\u002Fautomating-reporting-workflows\u002Fautomating-excel-online-with-microsoft-graph\u002Fhandle-microsoft-graph-throttling-for-excel","Handle Microsoft Graph Throttling in Excel Automation",{"path":2426,"title":2427,"kind":2428},"\u002Fautomating-reporting-workflows\u002Ferror-handling-and-logging-in-excel-automation","Error Handling and Logging in Excel Automation","guide",1790972065531]