基于Python編寫(xiě)一個(gè)Excel轉(zhuǎn)XML格式轉(zhuǎn)換工具
需求背景
假設(shè)我們需要將Excel中的多語(yǔ)言翻譯數(shù)據(jù)轉(zhuǎn)換為Salesforce平臺(tái)所需的CustomLabels格式的XML文件。原始數(shù)據(jù)存儲(chǔ)在Excel中,需要按照特定的XML結(jié)構(gòu)進(jìn)行輸出。
工具準(zhǔn)備
我們需要使用以下Python庫(kù):
xlwings:用于Excel文件操作xml.etree.ElementTree:用于XML構(gòu)建xml.dom.minidom:用于XML格式化輸出
核心代碼實(shí)現(xiàn)
1. XML美化函數(shù)
def prettify_xml(elem):
"""格式化 XML 輸出"""
rough_string = ET.tostring(elem, "utf-8")
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")
這個(gè)函數(shù)確保生成的XML文件具有良好的可讀性,使用4個(gè)空格進(jìn)行縮進(jìn)。
2. 主處理函數(shù)
def main():
# 1. 打開(kāi) Excel 文件
excel_file_path = r"C:\Projects\Translation\test_data.xlsx"
wb = xw.Book(excel_file_path)
# 2. 選擇指定工作表
try:
sheet = wb.sheets["TranslationData"]
except KeyError:
print("? 錯(cuò)誤:指定工作表不存在!")
wb.close()
return
# 3. 定義列映射關(guān)系
column_mapping = {
'full_name': 'B', # 標(biāo)簽名稱(chēng)
'categories': 'F', # 分類(lèi)信息
'short_desc': 'G', # 簡(jiǎn)短描述
'value': 'C' # 實(shí)際值
}
# 4. 構(gòu)建 XML 根元素
root = ET.Element("CustomLabels",
xmlns="http://soap.sforce.com/2006/04/metadata")
# 5. 遍歷數(shù)據(jù)行
row_index = 2 # 從第二行開(kāi)始(跳過(guò)標(biāo)題行)
processed_count = 0
while True:
full_name = sheet.range(f"{column_mapping['full_name']}{row_index}").value
# 檢查是否到達(dá)數(shù)據(jù)末尾
if full_name is None:
break
# 讀取其他字段數(shù)據(jù)
categories = sheet.range(f"{column_mapping['categories']}{row_index}").value
short_desc = sheet.range(f"{column_mapping['short_desc']}{row_index}").value
value = sheet.range(f"{column_mapping['value']}{row_index}").value
# 創(chuàng)建 XML 標(biāo)簽元素
label_elem = ET.SubElement(root, "labels")
ET.SubElement(label_elem, "fullName").text = str(full_name)
ET.SubElement(label_elem, "categories").text = str(categories)
ET.SubElement(label_elem, "language").text = "en_US"
ET.SubElement(label_elem, "protected").text = "false"
ET.SubElement(label_elem, "shortDescription").text = str(short_desc)
ET.SubElement(label_elem, "value").text = str(value)
row_index += 1
processed_count += 1
# 6. 生成并保存 XML
xml_str = prettify_xml(root)
output_xml_path = "output_custom_labels.xml"
with open(output_xml_path, "w", encoding="utf-8") as f:
f.write(xml_str)
print(f"? 處理完成!共轉(zhuǎn)換 {processed_count} 條記錄")
print(f"? XML 文件已生成:{output_xml_path}")
wb.close()
示例數(shù)據(jù)結(jié)構(gòu)
Excel數(shù)據(jù)格式(test_data.xlsx)
| B列 (fullName) | C列 (value) | F列 (categories) | G列 (shortDescription) |
|---|---|---|---|
| Welcome_Message | 歡迎使用系統(tǒng) | UI_Labels | 歡迎消息 |
| Error_404 | 頁(yè)面不存在 | Error_Messages | 404錯(cuò)誤提示 |
| Save_Success | 保存成功 | Notification | 成功提示 |
生成的XML輸出
<?xml version="1.0" encoding="utf-8"?>
<CustomLabels xmlns="http://soap.sforce.com/2006/04/metadata">
<labels>
<fullName>Welcome_Message</fullName>
<categories>UI_Labels</categories>
<language>en_US</language>
<protected>false</protected>
<shortDescription>歡迎消息</shortDescription>
<value>歡迎使用系統(tǒng)</value>
</labels>
<labels>
<fullName>Error_404</fullName>
<categories>Error_Messages</categories>
<language>en_US</language>
<protected>false</protected>
<shortDescription>404錯(cuò)誤提示</shortDescription>
<value>頁(yè)面不存在</value>
</labels>
</CustomLabels>
功能特點(diǎn)
1. 靈活的數(shù)據(jù)映射
通過(guò)修改column_mapping字典,可以輕松調(diào)整Excel列與XML字段的對(duì)應(yīng)關(guān)系。
2. 錯(cuò)誤處理
- 工作表不存在時(shí)的友好提示
- 自動(dòng)跳過(guò)空行
- 類(lèi)型安全轉(zhuǎn)換(使用str()包裝)
3. 可擴(kuò)展性
可以輕松添加新的字段或修改XML結(jié)構(gòu):
<PYTHON> # 添加自定義字段示例 ET.SubElement(label_elem, "customField").text = "custom_value"
4. 格式化輸出
生成的XML文件具有良好的縮進(jìn)和格式,便于閱讀和調(diào)試。
實(shí)際應(yīng)用場(chǎng)景
1. 多語(yǔ)言支持
將翻譯團(tuán)隊(duì)提供的Excel翻譯文件轉(zhuǎn)換為應(yīng)用程序可讀的XML格式。
2. 配置管理
將配置數(shù)據(jù)從Excel遷移到XML格式的配置文件。
3. 數(shù)據(jù)遷移
在不同系統(tǒng)間遷移數(shù)據(jù)時(shí),作為中間轉(zhuǎn)換工具。
4. 元數(shù)據(jù)管理
處理Salesforce、SAP等系統(tǒng)的元數(shù)據(jù)文件。
優(yōu)化建議
1. 添加日志記錄
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
2. 支持多種編碼
# 檢測(cè)并處理不同的文件編碼
def detect_encoding(file_path):
import chardet
with open(file_path, 'rb') as f:
result = chardet.detect(f.read())
return result['encoding']
3. 批量處理支持
def process_multiple_files(input_folder, output_folder):
# 處理整個(gè)文件夾中的Excel文件
pass
使用注意事項(xiàng)
- 數(shù)據(jù)驗(yàn)證:建議添加數(shù)據(jù)驗(yàn)證邏輯,確保必填字段不為空
- 特殊字符處理:XML中的特殊字符(如<, >, &等)需要轉(zhuǎn)義處理
- 性能優(yōu)化:處理大量數(shù)據(jù)時(shí),考慮使用更高效的數(shù)據(jù)讀取方式
- 錯(cuò)誤恢復(fù):添加異常處理,支持從錯(cuò)誤點(diǎn)繼續(xù)處理
總結(jié)
這個(gè)Python腳本展示了如何通過(guò)自動(dòng)化工具解決實(shí)際工作中的數(shù)據(jù)格式轉(zhuǎn)換問(wèn)題。通過(guò)結(jié)合x(chóng)lwings和XML處理庫(kù),我們創(chuàng)建了一個(gè)強(qiáng)大而靈活的數(shù)據(jù)轉(zhuǎn)換工具。
主要優(yōu)點(diǎn):
- 減少手動(dòng)操作,提高工作效率
- 減少人為錯(cuò)誤,保證數(shù)據(jù)一致性
- 可定制性強(qiáng),適應(yīng)不同需求
- 代碼簡(jiǎn)潔易懂,便于維護(hù)和擴(kuò)展
這種自動(dòng)化思路可以應(yīng)用于各種數(shù)據(jù)轉(zhuǎn)換場(chǎng)景,只需要根據(jù)具體需求調(diào)整映射關(guān)系和輸出格式即可。
以上就是基于Python編寫(xiě)一個(gè)Excel轉(zhuǎn)XML格式轉(zhuǎn)換工具的詳細(xì)內(nèi)容,更多關(guān)于Python Excel轉(zhuǎn)XML工具的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Python將Markdown格式轉(zhuǎn)為EPUB電子書(shū)格式的代碼實(shí)現(xiàn)
我們每天都會(huì)接觸到大量的文本內(nèi)容,無(wú)論是收藏的技術(shù)文檔、自己撰寫(xiě)的筆記,還是網(wǎng)絡(luò)上的優(yōu)質(zhì)文章,都可能面臨閱讀體驗(yàn)不佳的問(wèn)題,所以本文給大家介紹了使用Python將Markdown格式轉(zhuǎn)為EPUB電子書(shū)格式的實(shí)現(xiàn)方法,需要的朋友可以參考下2025-04-04
pygame實(shí)現(xiàn)簡(jiǎn)單五子棋游戲
這篇文章主要為大家詳細(xì)介紹了pygame實(shí)現(xiàn)簡(jiǎn)單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>2022-01-01
Python實(shí)現(xiàn)將wav轉(zhuǎn)amr,并轉(zhuǎn)換成hex數(shù)組
這篇文章主要介紹了Python實(shí)現(xiàn)將wav轉(zhuǎn)amr,并轉(zhuǎn)換成hex數(shù)組方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Python密碼學(xué)Caesar?Cipher凱撒密碼算法教程
這篇文章主要為大家介紹了Python密碼學(xué)Caesar?Cipher凱撒密碼算法教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
python提取視頻中的音頻的實(shí)現(xiàn)示例
MoviePy是一個(gè)用于視頻編輯的庫(kù),它可以提取視頻中的音頻并保存為音頻文件,本文主要介紹了python提取視頻中的音頻的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-03-03
python實(shí)現(xiàn)對(duì)arxml文件的操作方法
本篇文章給大家介紹python實(shí)現(xiàn)對(duì)arxml文件的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
對(duì)python中Matplotlib的坐標(biāo)軸的坐標(biāo)區(qū)間的設(shè)定實(shí)例講解
今天小編就為大家分享一篇對(duì)python中Matplotlib的坐標(biāo)軸的坐標(biāo)區(qū)間的設(shè)定實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
Python簡(jiǎn)單實(shí)現(xiàn)區(qū)域生長(zhǎng)方式
今天小編就為大家分享一篇Python簡(jiǎn)單實(shí)現(xiàn)區(qū)域生長(zhǎng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Python實(shí)現(xiàn)好友全頭像的拼接實(shí)例(推薦)
下面小編就為大家?guī)?lái)一篇Python實(shí)現(xiàn)好友全頭像的拼接實(shí)例(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06

