[{"data":1,"prerenderedAt":1531},["ShallowReactive",2],{"doc:\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-office-scripts-for-excel-automation":3,"surround:\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-office-scripts-for-excel-automation":1497,"ancestors:\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-office-scripts-for-excel-automation":1505,"children:\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-office-scripts-for-excel-automation":1510,"related:\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-office-scripts-for-excel-automation":1511},{"id":4,"title":5,"body":6,"dateModified":1463,"datePublished":1463,"description":1464,"extension":1465,"faq":1466,"keyword":1475,"kind":1476,"meta":1477,"navigation":582,"path":1486,"seo":1487,"slug":1490,"stem":1491,"topics":1492,"type":1495,"__hash__":1496},"docs\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-office-scripts-for-excel-automation\u002Findex.md","Python vs Office Scripts for Excel Automation",{"type":7,"value":8,"toc":1451},"minimark",[9,28,33,49,68,178,182,185,542,545,878,889,893,1027,1045,1192,1196,1211,1214,1218,1221,1225,1232,1341,1345,1379,1383,1386,1390,1396,1402,1408,1414,1418,1447],[10,11,12,13,17,18,21,22,27],"p",{},"Microsoft's answer to \"VBA does not work in the browser\" is Office Scripts: small TypeScript programs that live in OneDrive or SharePoint, run against a workbook in Excel for the web or the desktop app, can be recorded with an action recorder, and can be triggered from Power Automate. For many teams on Microsoft 365, Office Scripts are the obvious tool for automating a workbook. Python is the other obvious tool — the language most data work already happens in. They overlap, but they are built for different jobs: Office Scripts manipulate ",[14,15,16],"em",{},"a workbook from inside Excel",", while Python processes ",[14,19,20],{},"data and files from outside it",". This page puts them side by side with the same task written in both, compares where they run, what they can reach, how they are scheduled, tested and shared, and suggests when to use each and when to combine them. It belongs to ",[23,24,26],"a",{"href":25},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002F","Choosing a Python Excel Library",".",[29,30,32],"h2",{"id":31},"the-two-tools-in-one-paragraph-each","The two tools in one paragraph each",[10,34,35,39,40,44,45,48],{},[36,37,38],"strong",{},"Office Scripts"," are TypeScript files (",[41,42,43],"code",{},".osts",") stored in the user's OneDrive or a SharePoint site. They run inside Excel — on the web, and in the Windows and Mac desktop apps for Microsoft 365 business and education accounts — and act on the workbook that is open, through an object model similar in spirit to VBA's. The ",[14,46,47],{},"Automate"," tab has a recorder that writes a script from your clicks. Scripts can be shared with everyone who can edit the workbook, added as buttons, and run from Power Automate flows on a schedule or trigger.",[10,50,51,54,55,58,59,62,63,67],{},[36,52,53],{},"Python"," runs wherever Python runs — a laptop, a server, a container, a scheduled job in the cloud — and works with Excel ",[14,56,57],{},"files",", usually without Excel at all: pandas and openpyxl read and write ",[41,60,61],{},".xlsx",", and the Microsoft Graph API edits workbooks stored in OneDrive or SharePoint. It brings the whole Python ecosystem: databases, APIs, statistics, machine learning, PDFs, email. (Python in Excel, which runs Python inside a cell in Microsoft's cloud, is a third option with its own trade-offs; see ",[23,64,66],{"href":65},"\u002Fgetting-started-with-python-excel-automation\u002Fusing-python-in-excel\u002F","Using Python in Excel",".)",[69,70,78,79,78,83,78,87,78,95,78,105,78,116,78,122,78,129,78,134,78,138,78,142,78,146,78,151,78,158,78,162,78,166,78,169,78,172,78,175],"svg",{"viewBox":71,"role":72,"ariaLabelledBy":73,"xmlns":76,"style":77},"4 0 752 233","img",[74,75],"os-where-t","os-where-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  ",[80,81,82],"title",{"id":74},"Where each runs and what it acts on",[84,85,86],"desc",{"id":75},"Office Scripts run inside Excel on the web or desktop against the open workbook and are stored in OneDrive or SharePoint. Python runs outside Excel on any machine and acts on files, databases and APIs, reaching cloud workbooks through Microsoft Graph.",[88,89],"rect",{"x":90,"y":91,"width":92,"height":93,"fill":94},"4","0","752","233","#ffffff",[88,96],{"x":97,"y":98,"width":99,"height":100,"rx":101,"fill":102,"stroke":103,"style":104},"20.0","16.0","351.0","201.0","14","#f0f4ff","var(--brand,#5b5cf0)","stroke-width:2px",[106,107,109],"g",{"transform":108},"translate(182.5,29.0) scale(1.083)",[110,111],"path",{"d":112,"fill":113,"stroke":114,"style":115},"M6 3h9l4 4v14H6z M15 3v4h4 M9.5 11.5l4.5 6 M14 11.5l-4.5 6","none","var(--brand-strong,#4338ca)","stroke-width:1.66px;stroke-linecap:round;stroke-linejoin:round",[117,118,38],"text",{"x":119,"y":120,"style":121},"195.5","78.0","font-size:14px;font-weight:700;fill:var(--brand-strong,#4338ca);text-anchor:middle",[123,124],"line",{"x1":125,"y1":126,"x2":127,"y2":126,"stroke":103,"style":128},"36.0","91.0","355.0","stroke-width:1px",[117,130,133],{"x":119,"y":131,"style":132},"111.0","font-size:12px;font-weight:400;fill:var(--text,#172033);text-anchor:middle","TypeScript inside Excel",[117,135,137],{"x":119,"y":136,"style":132},"137.0","acts on the open workbook",[117,139,141],{"x":119,"y":140,"style":132},"163.0","stored in OneDrive \u002F SharePoint",[117,143,145],{"x":119,"y":144,"style":132},"189.0","run by users or Power Automate",[88,147],{"x":148,"y":98,"width":99,"height":100,"rx":101,"fill":149,"stroke":150,"style":104},"389.0","#d9f4f1","var(--teal,#0f9488)",[106,152,154],{"transform":153},"translate(551.5,29.0) scale(1.083)",[110,155],{"d":156,"fill":113,"stroke":157,"style":115},"M12 3c-4 0-4 1.6-4 3v2h4.2v1H6c-2 0-3 1.4-3 4s1 4 3 4h2v-2.6c0-1.6 1.3-2.9 2.9-2.9h4.2c1.3 0 2.4-1.1 2.4-2.4V6c0-1.6-1.8-3-5.5-3z M10 5.5h.01 M12 21c4 0 4-1.6 4-3v-2h-4.2v-1H18c2 0 3-1.4 3-4s-1-4-3-4h-2v2.6c0 1.6-1.3 2.9-2.9 2.9H8.9c-1.3 0-2.4 1.1-2.4 2.4V18c0 1.6 1.8 3 5.5 3z M14 18.5h.01","var(--teal-ink,#0b6157)",[117,159,53],{"x":160,"y":120,"style":161},"564.5","font-size:14px;font-weight:700;fill:var(--teal-ink,#0b6157);text-anchor:middle",[123,163],{"x1":164,"y1":126,"x2":165,"y2":126,"stroke":150,"style":128},"405.0","724.0",[117,167,168],{"x":160,"y":131,"style":132},"runs on any machine or server",[117,170,171],{"x":160,"y":136,"style":132},"acts on files, databases, APIs",[117,173,174],{"x":160,"y":140,"style":132},"cloud workbooks via Graph",[117,176,177],{"x":160,"y":144,"style":132},"scheduled like any program",[29,179,181],{"id":180},"the-same-task-in-both","The same task in both",[10,183,184],{},"A typical small job: in the Invoices sheet, highlight every invoice over 1,000 and add a total below the amounts. As an Office Script:",[186,187,192],"pre",{"className":188,"code":189,"language":190,"meta":191,"style":191},"language-typescript shiki shiki-themes github-light github-dark-high-contrast","function main(workbook: ExcelScript.Workbook) {\n  const sheet = workbook.getWorksheet(\"Invoices\");\n  const used = sheet.getUsedRange();\n  const values = used.getValues();\n  for (let r = 1; r \u003C values.length; r++) {\n    if ((values[r][2] as number) > 1000) {\n      used.getCell(r, 0).getEntireRow().getIntersection(used).getFormat().getFill().setColor(\"#FFEB9C\");\n    }\n  }\n  const totalRow = values.length;\n  sheet.getCell(totalRow, 1).setValue(\"Total\");\n  sheet.getCell(totalRow, 2).setFormula(`=SUM(C2:C${totalRow})`);\n  sheet.getCell(totalRow, 1).getEntireRow().getFormat().getFont().setBold(true);\n}\n","typescript","",[41,193,194,229,257,276,294,335,367,416,422,428,445,471,500,536],{"__ignoreMap":191},[195,196,198,202,206,210,214,217,221,223,226],"span",{"class":123,"line":197},1,[195,199,201],{"class":200},"s-kum","function",[195,203,205],{"class":204},"s_Opv"," main",[195,207,209],{"class":208},"skGVy","(",[195,211,213],{"class":212},"sa561","workbook",[195,215,216],{"class":200},":",[195,218,220],{"class":219},"sMTad"," ExcelScript",[195,222,27],{"class":208},[195,224,225],{"class":219},"Workbook",[195,227,228],{"class":208},") {\n",[195,230,232,235,239,242,245,248,250,254],{"class":123,"line":231},2,[195,233,234],{"class":200},"  const",[195,236,238],{"class":237},"sP0c6"," sheet",[195,240,241],{"class":200}," =",[195,243,244],{"class":208}," workbook.",[195,246,247],{"class":204},"getWorksheet",[195,249,209],{"class":208},[195,251,253],{"class":252},"srMev","\"Invoices\"",[195,255,256],{"class":208},");\n",[195,258,260,262,265,267,270,273],{"class":123,"line":259},3,[195,261,234],{"class":200},[195,263,264],{"class":237}," used",[195,266,241],{"class":200},[195,268,269],{"class":208}," sheet.",[195,271,272],{"class":204},"getUsedRange",[195,274,275],{"class":208},"();\n",[195,277,279,281,284,286,289,292],{"class":123,"line":278},4,[195,280,234],{"class":200},[195,282,283],{"class":237}," values",[195,285,241],{"class":200},[195,287,288],{"class":208}," used.",[195,290,291],{"class":204},"getValues",[195,293,275],{"class":208},[195,295,297,300,303,306,309,312,315,318,321,324,327,330,333],{"class":123,"line":296},5,[195,298,299],{"class":200},"  for",[195,301,302],{"class":208}," (",[195,304,305],{"class":200},"let",[195,307,308],{"class":208}," r ",[195,310,311],{"class":200},"=",[195,313,314],{"class":237}," 1",[195,316,317],{"class":208},"; r ",[195,319,320],{"class":200},"\u003C",[195,322,323],{"class":208}," values.",[195,325,326],{"class":237},"length",[195,328,329],{"class":208},"; r",[195,331,332],{"class":200},"++",[195,334,228],{"class":208},[195,336,338,341,344,347,350,353,356,359,362,365],{"class":123,"line":337},6,[195,339,340],{"class":200},"    if",[195,342,343],{"class":208}," ((values[r][",[195,345,346],{"class":237},"2",[195,348,349],{"class":208},"] ",[195,351,352],{"class":200},"as",[195,354,355],{"class":237}," number",[195,357,358],{"class":208},") ",[195,360,361],{"class":200},">",[195,363,364],{"class":237}," 1000",[195,366,228],{"class":208},[195,368,370,373,376,379,381,384,387,390,393,396,399,401,404,406,409,411,414],{"class":123,"line":369},7,[195,371,372],{"class":208},"      used.",[195,374,375],{"class":204},"getCell",[195,377,378],{"class":208},"(r, ",[195,380,91],{"class":237},[195,382,383],{"class":208},").",[195,385,386],{"class":204},"getEntireRow",[195,388,389],{"class":208},"().",[195,391,392],{"class":204},"getIntersection",[195,394,395],{"class":208},"(used).",[195,397,398],{"class":204},"getFormat",[195,400,389],{"class":208},[195,402,403],{"class":204},"getFill",[195,405,389],{"class":208},[195,407,408],{"class":204},"setColor",[195,410,209],{"class":208},[195,412,413],{"class":252},"\"#FFEB9C\"",[195,415,256],{"class":208},[195,417,419],{"class":123,"line":418},8,[195,420,421],{"class":208},"    }\n",[195,423,425],{"class":123,"line":424},9,[195,426,427],{"class":208},"  }\n",[195,429,431,433,436,438,440,442],{"class":123,"line":430},10,[195,432,234],{"class":200},[195,434,435],{"class":237}," totalRow",[195,437,241],{"class":200},[195,439,323],{"class":208},[195,441,326],{"class":237},[195,443,444],{"class":208},";\n",[195,446,448,451,453,456,459,461,464,466,469],{"class":123,"line":447},11,[195,449,450],{"class":208},"  sheet.",[195,452,375],{"class":204},[195,454,455],{"class":208},"(totalRow, ",[195,457,458],{"class":237},"1",[195,460,383],{"class":208},[195,462,463],{"class":204},"setValue",[195,465,209],{"class":208},[195,467,468],{"class":252},"\"Total\"",[195,470,256],{"class":208},[195,472,474,476,478,480,482,484,487,489,492,495,498],{"class":123,"line":473},12,[195,475,450],{"class":208},[195,477,375],{"class":204},[195,479,455],{"class":208},[195,481,346],{"class":237},[195,483,383],{"class":208},[195,485,486],{"class":204},"setFormula",[195,488,209],{"class":208},[195,490,491],{"class":252},"`=SUM(C2:C${",[195,493,494],{"class":208},"totalRow",[195,496,497],{"class":252},"})`",[195,499,256],{"class":208},[195,501,503,505,507,509,511,513,515,517,519,521,524,526,529,531,534],{"class":123,"line":502},13,[195,504,450],{"class":208},[195,506,375],{"class":204},[195,508,455],{"class":208},[195,510,458],{"class":237},[195,512,383],{"class":208},[195,514,386],{"class":204},[195,516,389],{"class":208},[195,518,398],{"class":204},[195,520,389],{"class":208},[195,522,523],{"class":204},"getFont",[195,525,389],{"class":208},[195,527,528],{"class":204},"setBold",[195,530,209],{"class":208},[195,532,533],{"class":237},"true",[195,535,256],{"class":208},[195,537,539],{"class":123,"line":538},14,[195,540,541],{"class":208},"}\n",[10,543,544],{},"And the same with Python and openpyxl, operating on the file:",[186,546,550],{"className":547,"code":548,"language":549,"meta":191,"style":191},"language-python shiki shiki-themes github-light github-dark-high-contrast","from openpyxl import load_workbook\nfrom openpyxl.styles import Font, PatternFill\n\nwb = load_workbook(\"invoices.xlsx\")\nws = wb[\"Invoices\"]\nhighlight = PatternFill(\"solid\", fgColor=\"FFEB9C\")\nfor row in ws.iter_rows(min_row=2, max_row=ws.max_row):\n    if row[2].value > 1000:\n        for cell in row:\n            cell.fill = highlight\ntotal_row = ws.max_row + 1\nws.cell(total_row, 2, \"Total\").font = Font(bold=True)\nws.cell(total_row, 3, f\"=SUM(C2:C{total_row - 1})\").font = Font(bold=True)\nwb.save(\"invoices_marked.xlsx\")\nprint(\"highlighted:\", [r[0].value for r in ws.iter_rows(min_row=2, max_row=total_row - 1) if r[2].value > 1000])\n","python",[41,551,552,566,578,584,600,615,641,672,691,704,714,730,759,805,815],{"__ignoreMap":191},[195,553,554,557,560,563],{"class":123,"line":197},[195,555,556],{"class":200},"from",[195,558,559],{"class":208}," openpyxl ",[195,561,562],{"class":200},"import",[195,564,565],{"class":208}," load_workbook\n",[195,567,568,570,573,575],{"class":123,"line":231},[195,569,556],{"class":200},[195,571,572],{"class":208}," openpyxl.styles ",[195,574,562],{"class":200},[195,576,577],{"class":208}," Font, PatternFill\n",[195,579,580],{"class":123,"line":259},[195,581,583],{"emptyLinePlaceholder":582},true,"\n",[195,585,586,589,591,594,597],{"class":123,"line":278},[195,587,588],{"class":208},"wb ",[195,590,311],{"class":200},[195,592,593],{"class":208}," load_workbook(",[195,595,596],{"class":252},"\"invoices.xlsx\"",[195,598,599],{"class":208},")\n",[195,601,602,605,607,610,612],{"class":123,"line":296},[195,603,604],{"class":208},"ws ",[195,606,311],{"class":200},[195,608,609],{"class":208}," wb[",[195,611,253],{"class":252},[195,613,614],{"class":208},"]\n",[195,616,617,620,622,625,628,631,634,636,639],{"class":123,"line":337},[195,618,619],{"class":208},"highlight ",[195,621,311],{"class":200},[195,623,624],{"class":208}," PatternFill(",[195,626,627],{"class":252},"\"solid\"",[195,629,630],{"class":208},", ",[195,632,633],{"class":212},"fgColor",[195,635,311],{"class":200},[195,637,638],{"class":252},"\"FFEB9C\"",[195,640,599],{"class":208},[195,642,643,646,649,652,655,658,660,662,664,667,669],{"class":123,"line":369},[195,644,645],{"class":200},"for",[195,647,648],{"class":208}," row ",[195,650,651],{"class":200},"in",[195,653,654],{"class":208}," ws.iter_rows(",[195,656,657],{"class":212},"min_row",[195,659,311],{"class":200},[195,661,346],{"class":237},[195,663,630],{"class":208},[195,665,666],{"class":212},"max_row",[195,668,311],{"class":200},[195,670,671],{"class":208},"ws.max_row):\n",[195,673,674,676,679,681,684,686,688],{"class":123,"line":418},[195,675,340],{"class":200},[195,677,678],{"class":208}," row[",[195,680,346],{"class":237},[195,682,683],{"class":208},"].value ",[195,685,361],{"class":200},[195,687,364],{"class":237},[195,689,690],{"class":208},":\n",[195,692,693,696,699,701],{"class":123,"line":424},[195,694,695],{"class":200},"        for",[195,697,698],{"class":208}," cell ",[195,700,651],{"class":200},[195,702,703],{"class":208}," row:\n",[195,705,706,709,711],{"class":123,"line":430},[195,707,708],{"class":208},"            cell.fill ",[195,710,311],{"class":200},[195,712,713],{"class":208}," highlight\n",[195,715,716,719,721,724,727],{"class":123,"line":447},[195,717,718],{"class":208},"total_row ",[195,720,311],{"class":200},[195,722,723],{"class":208}," ws.max_row ",[195,725,726],{"class":200},"+",[195,728,729],{"class":237}," 1\n",[195,731,732,735,737,739,741,744,746,749,752,754,757],{"class":123,"line":473},[195,733,734],{"class":208},"ws.cell(total_row, ",[195,736,346],{"class":237},[195,738,630],{"class":208},[195,740,468],{"class":252},[195,742,743],{"class":208},").font ",[195,745,311],{"class":200},[195,747,748],{"class":208}," Font(",[195,750,751],{"class":212},"bold",[195,753,311],{"class":200},[195,755,756],{"class":237},"True",[195,758,599],{"class":208},[195,760,761,763,766,768,771,774,778,780,783,785,788,791,793,795,797,799,801,803],{"class":123,"line":502},[195,762,734],{"class":208},[195,764,765],{"class":237},"3",[195,767,630],{"class":208},[195,769,770],{"class":200},"f",[195,772,773],{"class":252},"\"=SUM(C2:C",[195,775,777],{"class":776},"sSjpA","{",[195,779,718],{"class":208},[195,781,782],{"class":200},"-",[195,784,314],{"class":237},[195,786,787],{"class":776},"}",[195,789,790],{"class":252},")\"",[195,792,743],{"class":208},[195,794,311],{"class":200},[195,796,748],{"class":208},[195,798,751],{"class":212},[195,800,311],{"class":200},[195,802,756],{"class":237},[195,804,599],{"class":208},[195,806,807,810,813],{"class":123,"line":538},[195,808,809],{"class":208},"wb.save(",[195,811,812],{"class":252},"\"invoices_marked.xlsx\"",[195,814,599],{"class":208},[195,816,818,821,823,826,829,831,833,835,837,839,841,843,845,847,849,851,853,855,857,859,861,864,867,869,871,873,875],{"class":123,"line":817},15,[195,819,820],{"class":237},"print",[195,822,209],{"class":208},[195,824,825],{"class":252},"\"highlighted:\"",[195,827,828],{"class":208},", [r[",[195,830,91],{"class":237},[195,832,683],{"class":208},[195,834,645],{"class":200},[195,836,308],{"class":208},[195,838,651],{"class":200},[195,840,654],{"class":208},[195,842,657],{"class":212},[195,844,311],{"class":200},[195,846,346],{"class":237},[195,848,630],{"class":208},[195,850,666],{"class":212},[195,852,311],{"class":200},[195,854,718],{"class":208},[195,856,782],{"class":200},[195,858,314],{"class":237},[195,860,358],{"class":208},[195,862,863],{"class":200},"if",[195,865,866],{"class":208}," r[",[195,868,346],{"class":237},[195,870,683],{"class":208},[195,872,361],{"class":200},[195,874,364],{"class":237},[195,876,877],{"class":208},"])\n",[10,879,880,881,884,885,383],{},"The two are strikingly similar in length and shape. The differences are in ",[14,882,883],{},"where"," they act. The Office Script changes the live workbook that someone has open in Excel, and every co-author sees the result immediately; it has no file to load or save. The Python script reads a file and writes a file — which is perfect for a generated report or a nightly job, but for a workbook people are editing in OneDrive, Python would go through the Graph API instead (see ",[23,886,888],{"href":887},"\u002Fautomating-reporting-workflows\u002Fautomating-excel-online-with-microsoft-graph\u002Fread-and-write-excel-online-ranges-with-microsoft-graph\u002F","Read and Write Excel Online Ranges with Microsoft Graph",[29,890,892],{"id":891},"how-they-compare","How they compare",[894,895,896,909],"table",{},[897,898,899],"thead",{},[900,901,902,905,907],"tr",{},[903,904],"th",{},[903,906,38],{},[903,908,53],{},[910,911,912,924,935,946,957,968,979,994,1005,1016],"tbody",{},[900,913,914,918,921],{},[915,916,917],"td",{},"Language",[915,919,920],{},"TypeScript (a subset; no npm packages)",[915,922,923],{},"Python with any package",[900,925,926,929,932],{},[915,927,928],{},"Runs",[915,930,931],{},"inside Excel (web, Windows, Mac)",[915,933,934],{},"anywhere — laptop, server, cloud job",[900,936,937,940,943],{},[915,938,939],{},"Acts on",[915,941,942],{},"the open workbook",[915,944,945],{},"files, databases, APIs; cloud workbooks via Graph",[900,947,948,951,954],{},[915,949,950],{},"Needs Excel",[915,952,953],{},"yes",[915,955,956],{},"no (except xlwings \u002F COM automation)",[900,958,959,962,965],{},[915,960,961],{},"Recorder",[915,963,964],{},"yes, Action Recorder",[915,966,967],{},"no",[900,969,970,973,976],{},[915,971,972],{},"Scheduling",[915,974,975],{},"Power Automate flows",[915,977,978],{},"cron, Task Scheduler, CI, cloud schedulers",[900,980,981,984,991],{},[915,982,983],{},"External data",[915,985,986,987,990],{},"limited ",[41,988,989],{},"fetch",", Power Automate connectors",[915,992,993],{},"anything Python can reach",[900,995,996,999,1002],{},[915,997,998],{},"Large data",[915,1000,1001],{},"slow above tens of thousands of cells",[915,1003,1004],{},"pandas\u002Fpolars handle millions of rows",[900,1006,1007,1010,1013],{},[915,1008,1009],{},"Testing, version control",[915,1011,1012],{},"limited; scripts live in OneDrive",[915,1014,1015],{},"normal: pytest, git, code review",[900,1017,1018,1021,1024],{},[915,1019,1020],{},"Licensing",[915,1022,1023],{},"Microsoft 365 business or education",[915,1025,1026],{},"free; Microsoft 365 only for Graph access",[10,1028,1029,1030,1033,1034,1037,1038,1041,1042,1044],{},"Two rows deserve emphasis. ",[36,1031,1032],{},"Data volume",": an Office Script reads and writes cells through Excel's object model, and every call has overhead; scripts that touch large ranges should read them in one ",[41,1035,1036],{},"getValues()"," and write once, and even then they are not built for hundreds of thousands of rows. Python with pandas or polars processes such volumes in seconds. ",[36,1039,1040],{},"Reach",": Office Scripts are deliberately sandboxed — they work on the workbook, with only limited ",[41,1043,989],{}," calls to the web, and runs from Power Automate have per-call time limits and daily caps. Pulling data from a database, an SFTP server or an internal API is routine in Python and awkward or impossible in an Office Script.",[69,1046,78,1052,78,1055,78,1058,78,1062,78,1068,78,1075,78,1080,78,1084,78,1088,78,1091,78,1096,78,1105,78,1110,78,1115,78,1120,78,1124,78,1129,78,1131,78,1134,78,1138,78,1141,78,1144,78,1149,78,1152,78,1155,78,1157,78,1160,78,1164,78,1167,78,1172,78,1179,78,1184,78,1188],{"viewBox":1047,"role":72,"ariaLabelledBy":1048,"xmlns":76,"style":1051},"0 0 756 290",[1049,1050],"os-choose-t","os-choose-d","width:100%;max-width:756px;height:auto;display:block;margin:1.5rem auto;font-family:Inter,ui-sans-serif,system-ui,sans-serif",[80,1053,1054],{"id":1049},"Which tool for the job?",[84,1056,1057],{"id":1050},"If the job changes a workbook people are working in and users should run it themselves from Excel, use an Office Script. If it processes data from outside sources, large volumes or produces files, use Python. If both, let Python prepare the data and an Office Script or Graph apply it to the shared workbook.",[88,1059],{"x":91,"y":91,"width":1060,"height":1061,"fill":94},"756","290",[88,1063],{"x":1064,"y":98,"width":1065,"height":1066,"rx":1067,"fill":102,"stroke":103,"style":104},"240.0","280.0","75.5","12",[106,1069,1071],{"transform":1070},"translate(368.0,29.0) scale(1.000)",[110,1072],{"d":1073,"fill":113,"stroke":114,"style":1074},"M11 4a7 7 0 1 0 .01 0z M16 16l5 5","stroke-width:1.80px;stroke-linecap:round;stroke-linejoin:round",[117,1076,1079],{"x":1077,"y":1066,"style":1078},"380.0","font-size:13.5px;font-weight:700;fill:var(--brand-strong,#4338ca);text-anchor:middle","What does the job mainly do?",[123,1081],{"x1":1077,"y1":1082,"x2":1077,"y2":1083,"stroke":103,"style":104},"91.5","111.5",[123,1085],{"x1":1086,"y1":1083,"x2":1087,"y2":1083,"stroke":103,"style":104},"134.7","625.3",[123,1089],{"x1":1086,"y1":1083,"x2":1086,"y2":1090,"stroke":103,"style":104},"157.5",[1092,1093],"polygon",{"points":1094,"fill":1095},"134.7,161.5 129.7,152.5 139.7,152.5","#5b5cf0",[88,1097],{"x":1098,"y":1099,"width":1100,"height":1101,"rx":1102,"fill":94,"stroke":1103,"style":1104},"9.7","121.5","249.8","21.0","10","var(--line,#cdd5e6)","stroke-width:1.2px",[117,1106,1109],{"x":1086,"y":1107,"style":1108},"136.0","font-size:11.5px;font-weight:700;fill:var(--muted,#5b6780);text-anchor:middle","edit a shared workbook, user-triggered",[88,1111],{"x":97,"y":1112,"width":1113,"height":1114,"rx":1067,"fill":102,"stroke":103,"style":104},"163.5","229.3","110.5",[106,1116,1118],{"transform":1117},"translate(122.7,185.2) scale(1.000)",[110,1119],{"d":112,"fill":113,"stroke":114,"style":1074},[117,1121,1123],{"x":1086,"y":1122,"style":1078},"231.8","Office Script",[117,1125,1128],{"x":1086,"y":1126,"style":1127},"251.2","font-size:11.5px;font-weight:400;fill:var(--text,#172033);text-anchor:middle","button, recorder, co-authoring",[123,1130],{"x1":1077,"y1":1083,"x2":1077,"y2":1090,"stroke":103,"style":104},[1092,1132],{"points":1133,"fill":1095},"380.0,161.5 375.0,152.5 385.0,152.5",[88,1135],{"x":1136,"y":1099,"width":1137,"height":1101,"rx":1102,"fill":94,"stroke":1103,"style":1104},"290.5","179.1",[117,1139,1140],{"x":1077,"y":1107,"style":1108},"process data, produce files",[88,1142],{"x":1143,"y":1112,"width":1113,"height":1114,"rx":1067,"fill":149,"stroke":150,"style":104},"265.3",[106,1145,1147],{"transform":1146},"translate(368.0,185.2) scale(1.000)",[110,1148],{"d":156,"fill":113,"stroke":157,"style":1074},[117,1150,53],{"x":1077,"y":1122,"style":1151},"font-size:13.5px;font-weight:700;fill:var(--teal-ink,#0b6157);text-anchor:middle",[117,1153,1154],{"x":1077,"y":1126,"style":1127},"databases, APIs, pandas",[123,1156],{"x1":1087,"y1":1083,"x2":1087,"y2":1090,"stroke":103,"style":104},[1092,1158],{"points":1159,"fill":1095},"625.3,161.5 620.3,152.5 630.3,152.5",[88,1161],{"x":1162,"y":1099,"width":1163,"height":1101,"rx":1102,"fill":94,"stroke":1103,"style":1104},"602.9","45.0",[117,1165,1166],{"x":1087,"y":1107,"style":1108},"both",[88,1168],{"x":1169,"y":1112,"width":1113,"height":1114,"rx":1067,"fill":1170,"stroke":1171,"style":104},"510.7","#fdefd8","var(--gold,#b4740a)",[106,1173,1175],{"transform":1174},"translate(613.3,176.5) scale(1.000)",[110,1176],{"d":1177,"fill":113,"stroke":1178,"style":1074},"M6 4v5a5 5 0 0 0 5 5h7 M6 20v-5 M15 11l3 3-3 3","var(--gold-ink,#7a4e06)",[117,1180,1183],{"x":1087,"y":1181,"style":1182},"223.0","font-size:13.5px;font-weight:700;fill:var(--gold-ink,#7a4e06);text-anchor:middle","combine",[117,1185,1187],{"x":1087,"y":1186,"style":1127},"242.5","Python prepares · Script or Graph",[117,1189,1191],{"x":1087,"y":1190,"style":1127},"260.0","applies",[29,1193,1195],{"id":1194},"scheduling-and-sharing","Scheduling and sharing",[10,1197,1198,1199,1202,1203,1206,1207,27],{},"An Office Script on its own runs when someone clicks ",[14,1200,1201],{},"Run"," or a button in the workbook. To run on a schedule or when something happens — a file arrives, a form is submitted — it is called from a Power Automate flow with the ",[14,1204,1205],{},"Run script"," action, which can pass parameters in and receive a return value. That makes Office Scripts plus Power Automate a no-server automation stack inside Microsoft 365, managed by business users. The trade-off is that logic lives in two places (the flow and the script), and failures surface in the flow's run history rather than in your usual logging. Comparing Power Automate with Python on whole workflows is covered in ",[23,1208,1210],{"href":1209},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-power-automate-for-report-workflows\u002F","Python vs Power Automate for Report Workflows",[10,1212,1213],{},"A Python job is scheduled like any program — cron, systemd timers, Windows Task Scheduler, GitHub Actions, a cloud scheduler — and logs, alerts and retries are under your control. It needs somewhere to run and someone to maintain it, which is easy for a team with developers and a real cost for one without. Sharing a Python tool with Excel users means either giving them its output (a report in their inbox or SharePoint) or packaging it, for example as an executable or a small web app.",[29,1215,1217],{"id":1216},"testing-versioning-and-maintenance","Testing, versioning and maintenance",[10,1219,1220],{},"Python code lives in a repository, goes through code review, and has unit tests that run on every change — the habits that keep a report correct for years. Office Scripts are files in OneDrive; they can be copied into a repository by hand, but there is no built-in testing framework, and the usual way to check a change is to run it on a copy of the workbook. For a three-line formatting script that is fine; for business-critical logic, it is a real argument for keeping the logic in Python and the Office Script thin. Office Scripts do have one maintenance advantage: they always match the workbook's own object model, so there is no file-format library that might not support a feature — charts, tables, PivotTables and slicers are all reachable through the API.",[29,1222,1224],{"id":1223},"combining-them","Combining them",[10,1226,1227,1228,27],{},"The tools combine well along their natural boundary. A common pattern: a Python job prepares the data — querying a database, cleaning and aggregating with pandas — and writes the result into a table in a workbook on SharePoint through Microsoft Graph, or drops a file there; a Power Automate flow then runs an Office Script that refreshes PivotTables, applies formatting and timestamps the sheet for the people who work in it. Each tool does what it is best at: Python the heavy data work and integrations, the Office Script the in-workbook polish that needs Excel's own engine. Writing to an Excel Online table from Python is shown in ",[23,1229,1231],{"href":1230},"\u002Fautomating-reporting-workflows\u002Fautomating-excel-online-with-microsoft-graph\u002Fappend-rows-to-an-excel-online-table-with-microsoft-graph\u002F","Append Rows to an Excel Online Table with Microsoft Graph",[69,1233,78,1238,78,1241,78,1244,78,1247,78,1250,78,1255,78,1259,78,1263,78,1267,78,1272,78,1275,78,1279,78,1286,78,1291,78,1294,78,1296,78,1299,78,1302,78,1305,78,1311,78,1316,78,1320,78,1324,78,1327,78,1330,78,1335,78,1338],{"viewBox":1234,"role":72,"ariaLabelledBy":1235,"xmlns":76,"style":77},"4 0 752 142",[1236,1237],"os-combo-t","os-combo-d",[80,1239,1240],{"id":1236},"Python and an Office Script working together",[84,1242,1243],{"id":1237},"A scheduled Python job queries the database and cleans the data with pandas, writes the result to a table in a SharePoint workbook through Microsoft Graph, and a Power Automate flow then runs an Office Script that refreshes PivotTables and applies formatting for the people using the workbook.",[88,1245],{"x":90,"y":91,"width":92,"height":1246,"fill":94},"142",[88,1248],{"x":97,"y":98,"width":1249,"height":1114,"rx":1067,"fill":149,"stroke":150,"style":104},"153.0",[106,1251,1253],{"transform":1252},"translate(84.5,29.0) scale(1.000)",[110,1254],{"d":156,"fill":113,"stroke":157,"style":1074},[117,1256,1258],{"x":1257,"y":1066,"style":1151},"96.5","Python job",[117,1260,1262],{"x":1257,"y":1261,"style":1127},"95.0","query, clean,",[117,1264,1266],{"x":1257,"y":1265,"style":1127},"112.5","aggregate",[123,1268],{"x1":1269,"y1":1270,"x2":1271,"y2":1270,"stroke":103,"style":104},"178.0","71.2","200.0",[1092,1273],{"points":1274,"fill":1095},"204.0,71.2 195.0,76.2 195.0,66.2",[88,1276],{"x":1277,"y":98,"width":1249,"height":1114,"rx":1067,"fill":1278,"stroke":1103,"style":104},"209.0","#e7ebef",[106,1280,1282],{"transform":1281},"translate(273.5,29.0) scale(1.000)",[110,1283],{"d":1284,"fill":113,"stroke":1285,"style":1074},"M7 18h10a4 4 0 0 0 .6-8A6 6 0 0 0 6.1 11.4 3.4 3.4 0 0 0 7 18z","var(--text,#172033)",[117,1287,1290],{"x":1288,"y":1066,"style":1289},"285.5","font-size:13.5px;font-weight:700;fill:var(--text,#172033);text-anchor:middle","Microsoft Graph",[117,1292,1293],{"x":1288,"y":1261,"style":1127},"write to the workbook",[117,1295,894],{"x":1288,"y":1265,"style":1127},[123,1297],{"x1":1298,"y1":1270,"x2":148,"y2":1270,"stroke":103,"style":104},"367.0",[1092,1300],{"points":1301,"fill":1095},"393.0,71.2 384.0,76.2 384.0,66.2",[88,1303],{"x":1304,"y":98,"width":1249,"height":1114,"rx":1067,"fill":1170,"stroke":1171,"style":104},"398.0",[106,1306,1308],{"transform":1307},"translate(462.5,37.8) scale(1.000)",[110,1309],{"d":1310,"fill":113,"stroke":1178,"style":1074},"M13 2L4 14h7l-1 8 9-12h-7z",[117,1312,1315],{"x":1313,"y":1314,"style":1182},"474.5","84.2","Power Automate",[117,1317,1319],{"x":1313,"y":1318,"style":1127},"103.8","on update, run script",[123,1321],{"x1":1322,"y1":1270,"x2":1323,"y2":1270,"stroke":103,"style":104},"556.0","578.0",[1092,1325],{"points":1326,"fill":1095},"582.0,71.2 573.0,76.2 573.0,66.2",[88,1328],{"x":1329,"y":98,"width":1249,"height":1114,"rx":1067,"fill":102,"stroke":103,"style":104},"587.0",[106,1331,1333],{"transform":1332},"translate(651.5,37.8) scale(1.000)",[110,1334],{"d":112,"fill":113,"stroke":114,"style":1074},[117,1336,1123],{"x":1337,"y":1314,"style":1078},"663.5",[117,1339,1340],{"x":1337,"y":1318,"style":1127},"refresh, format, stamp",[29,1342,1344],{"id":1343},"common-pitfalls","Common pitfalls",[1346,1347,1348,1355,1361,1367,1373],"ul",{},[1349,1350,1351,1354],"li",{},[36,1352,1353],{},"Big data in an Office Script."," Cell-by-cell loops over large ranges are slow; process data in Python.",[1349,1356,1357,1360],{},[36,1358,1359],{},"Business logic split across flow, script and workbook."," Keep the logic in one place that can be tested.",[1349,1362,1363,1366],{},[36,1364,1365],{},"Python editing a file someone has open in OneDrive."," Use the Graph API or let an Office Script make the change.",[1349,1368,1369,1372],{},[36,1370,1371],{},"Assuming Office Scripts are available everywhere."," They need Microsoft 365 business or education accounts.",[1349,1374,1375,1378],{},[36,1376,1377],{},"Choosing by language preference alone."," Choose by where the job runs and what it must reach.",[29,1380,1382],{"id":1381},"conclusion","Conclusion",[10,1384,1385],{},"Office Scripts and Python overlap but suit different jobs. Office Scripts are the natural choice for changing a shared workbook from inside Excel — user-triggered buttons, recorded steps, scheduled formatting through Power Automate — without servers or Python skills. Python is the choice for processing data from outside sources, handling large volumes, producing files and integrating with everything else, with proper testing and version control. For many teams the best answer is both: Python prepares the data and an Office Script finishes the workbook.",[29,1387,1389],{"id":1388},"frequently-asked-questions","Frequently asked questions",[10,1391,1392,1395],{},[36,1393,1394],{},"What is the difference between Office Scripts and Python for Excel?","\nOffice Scripts are TypeScript programs that run inside Excel against the open workbook. Python runs outside Excel and works with files, databases and APIs, reaching cloud workbooks through the Microsoft Graph API.",[10,1397,1398,1401],{},[36,1399,1400],{},"Can Office Scripts run on a schedule?","\nYes, through Power Automate. A flow with a recurrence or another trigger calls the Run script action, which can pass parameters to the script and receive a result.",[10,1403,1404,1407],{},[36,1405,1406],{},"Can Office Scripts handle large datasets?","\nThey work through Excel's object model, which is slow for very large ranges. Read and write ranges in one call where possible, and use Python with pandas or polars for large data processing.",[10,1409,1410,1413],{},[36,1411,1412],{},"Should I replace VBA with Office Scripts or Python?","\nUse Office Scripts for in-workbook automation that must work in Excel for the web and be run by users. Use Python for data processing, integrations and generated reports. Many teams use both.",[29,1415,1417],{"id":1416},"related","Related",[1346,1419,1420,1426,1433,1440],{},[1349,1421,1422,1423,1425],{},"Up one level: ",[23,1424,26],{"href":25}," — picking tools for Excel work.",[1349,1427,1428,1432],{},[23,1429,1431],{"href":1430},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-vba-for-excel-automation\u002F","Python vs VBA for Excel Automation"," — the desktop counterpart of this comparison.",[1349,1434,1435,1439],{},[23,1436,1438],{"href":1437},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Ftranslate-common-vba-macros-to-python\u002F","Translate Common VBA Macros to Python"," — moving existing macros.",[1349,1441,1442,1446],{},[23,1443,1445],{"href":1444},"\u002Fautomating-reporting-workflows\u002Fautomating-excel-online-with-microsoft-graph\u002Frun-a-report-when-an-excel-file-changes-in-onedrive\u002F","Run a Report When an Excel File Changes in OneDrive"," — a Python trigger for cloud workbooks.",[1448,1449,1450],"style",{},"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 .srMev, html code.shiki .srMev{--shiki-default:#032F62;--shiki-dark:#ADDCFF}html pre.shiki code .sa561, html code.shiki .sa561{--shiki-default:#E36209;--shiki-dark:#FFB757}html pre.shiki code .sP0c6, html code.shiki .sP0c6{--shiki-default:#005CC5;--shiki-dark:#91CBFF}html pre.shiki code .sSjpA, html code.shiki .sSjpA{--shiki-default:#005CC5;--shiki-dark:#FF9492}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_Opv, html code.shiki .s_Opv{--shiki-default:#6F42C1;--shiki-dark:#DBB7FF}html pre.shiki code .sMTad, html code.shiki .sMTad{--shiki-default:#6F42C1;--shiki-dark:#FFB757}",{"title":191,"searchDepth":231,"depth":231,"links":1452},[1453,1454,1455,1456,1457,1458,1459,1460,1461,1462],{"id":31,"depth":231,"text":32},{"id":180,"depth":231,"text":181},{"id":891,"depth":231,"text":892},{"id":1194,"depth":231,"text":1195},{"id":1216,"depth":231,"text":1217},{"id":1223,"depth":231,"text":1224},{"id":1343,"depth":231,"text":1344},{"id":1381,"depth":231,"text":1382},{"id":1388,"depth":231,"text":1389},{"id":1416,"depth":231,"text":1417},"2026-10-02","Choose between Python and Office Scripts for automating Excel: where each runs, the same task written in TypeScript and in Python, how each is scheduled and shared, what each can reach — files, databases, APIs — limits and licensing, testing and version control, and when to combine an Office Script with a Python job.","md",[1467,1469,1471,1473],{"q":1394,"a":1468},"Office Scripts are TypeScript programs that run inside Excel against the open workbook. Python runs outside Excel and works with files, databases and APIs, reaching cloud workbooks through the Microsoft Graph API.",{"q":1400,"a":1470},"Yes, through Power Automate. A flow with a recurrence or another trigger calls the Run script action, which can pass parameters to the script and receive a result.",{"q":1406,"a":1472},"They work through Excel's object model, which is slow for very large ranges. Read and write ranges in one call where possible, and use Python with pandas or polars for large data processing.",{"q":1412,"a":1474},"Use Office Scripts for in-workbook automation that must work in Excel for the web and be run by users. Use Python for data processing, integrations and generated reports. Many teams use both.","python vs office scripts for excel automation",null,{"breadcrumb":1478},[1479,1482,1485],{"name":1480,"item":1481},"Home","\u002F",{"name":1483,"item":1484},"Getting Started with Python Excel Automation","\u002Fgetting-started-with-python-excel-automation\u002F",{"name":26,"item":25},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-office-scripts-for-excel-automation",{"title":1488,"description":1489},"Python vs Office Scripts for Excel Automation Compared","Office Scripts (TypeScript in Excel for the web, run from Power Automate) versus Python (pandas, openpyxl, Graph API): the same task in both, scheduling, data access, limits, testing and when to use each.","python-vs-office-scripts-for-excel-automation","getting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-office-scripts-for-excel-automation\u002Findex",[1493,1494],"choosing-libraries","excel-online","how-to","GxS5NjCZdp0WqPI6qB7UV5mCdFIpfLRpeLKatrIVPYM",[1498,1502],{"title":1499,"path":1500,"stem":1501,"children":-1},"Pick an Excel Engine for .xlsx, .xlsm, .xls, .xlsb and .ods","\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpick-an-excel-engine-for-xlsx-xlsm-xls-xlsb-and-ods","getting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpick-an-excel-engine-for-xlsx-xlsm-xls-xlsb-and-ods\u002Findex",{"title":1210,"path":1503,"stem":1504,"children":-1},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-power-automate-for-report-workflows","getting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fpython-vs-power-automate-for-report-workflows\u002Findex",[1506,1508],{"path":1507,"title":26},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library",{"path":1509,"title":1483},"\u002Fgetting-started-with-python-excel-automation",[],[1512,1516,1519,1522,1525,1528],{"path":1513,"title":1514,"kind":1515},"\u002Fgetting-started-with-python-excel-automation\u002Fautomating-excel-with-com-and-pywin32\u002Fxlwings-vs-pywin32-for-excel-automation","xlwings vs pywin32 for Excel Automation","compare",{"path":1517,"title":1518,"kind":1515},"\u002Fgetting-started-with-python-excel-automation\u002Fwriting-dataframes-to-excel-with-pandas\u002Fopenpyxl-vs-xlsxwriter-vs-pandas-excelwriter","openpyxl vs xlsxwriter vs pandas.ExcelWriter",{"path":1520,"title":1521,"kind":1495},"\u002Fautomating-reporting-workflows\u002Fscheduling-python-excel-scripts-with-cron\u002Fchoose-a-scheduler-for-python-excel-reports","Choose a Scheduler for Python Excel Reports",{"path":1523,"title":1524,"kind":1515},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fgoogle-sheets-vs-excel-files-for-python-automation","Google Sheets vs Excel Files for Python Automation",{"path":1526,"title":1527,"kind":1495},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Flightweight-python-excel-libraries-compared","Lightweight Python Excel Libraries Compared",{"path":1529,"title":1530,"kind":1515},"\u002Fgetting-started-with-python-excel-automation\u002Fchoosing-a-python-excel-library\u002Fopenpyxl-vs-pandas-for-excel-automation","openpyxl vs pandas for Excel Automation",1790972057328]