Notice

使用以下脚本需要安装 openpyxllxml 两个库。

string.xml转成Excel文件

"""
将 Android string.xml 文件中的文本转换成 Excel 表格并保存到文件。
使用方法:python android_string_to_excel.py -f strings.xml [-o outfile_name]
-f: 要处理的 Android string.xml 文件路径.
-o: 输出文件路径,如果未指定,则默认为 'strings.xlsx'.
""" import os
import argparse import openpyxl
from lxml import etree def printUsage():
"""print usage and exit"""
usage = '''Usage:
python android_string_to_excel.py -f strings.xml [-o outfile_name]
'''
print(usage)
exit(-1) parser = argparse.ArgumentParser(description='Convert Android string.xml to Excel')
parser.add_argument('-f', '--file',
type=str,
required=True,
help='Android string.xml file path')
parser.add_argument('-o', '--output',
type=str,
help='Output file name, default is "strings.xlsx"')
args = parser.parse_args() xml_path = args.file
out_file = args.output or 'strings.xlsx' if not os.path.isfile(xml_path):
print(f'Error: {xml_path} is not a valid file!')
printUsage() try:
tree = etree.parse(xml_path)
except etree.ParseError as e:
print(f'Error: cannot parse XML at {xml_path}, {e}')
exit(-1) root = tree.getroot()
workbook = openpyxl.Workbook()
sheet = workbook.active
col_idx = 1
headers = ['key', 'value']
for col_idx, header in enumerate(headers, 1):
sheet.cell(row=1, column=col_idx, value=header) for row_idx, child in enumerate(root, 2):
key = child.attrib['name']
value = child.text.strip() if child.text else ''
sheet.cell(row=row_idx, column=1, value=key)
sheet.cell(row=row_idx, column=2, value=value) workbook.save(out_file)
print(f'{xml_path} converted and saved to {out_file}.')

Excel生成string.xml文件

import argparse
import xml.etree.ElementTree as ET
from openpyxl import load_workbook parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file', type=str, required=True,
help='Excel file path')
parser.add_argument('-s', '--sheet', type=str, default='Sheet1',
help='Sheet name in Excel file, default is "Sheet1"')
parser.add_argument('-k', '--key', type=int, default=1,
help='Index of key column in Excel file, default is 1')
parser.add_argument('-v', '--value', type=int, default=2,
help='Index of value column in Excel file, default is 2')
parser.add_argument('-o', '--output', type=str, default='strings.xml',
help='Output file name, default is "strings.xml"')
args = parser.parse_args() def excel_to_xml(excel_file, sheet_name, key_index, value_index, output_file):
workbook = load_workbook(filename=excel_file)
worksheet = workbook[sheet_name] root = ET.Element("resources")
for row in worksheet.values:
key = str(row[key_index-1])
value = str(row[value_index-1])
item = ET.SubElement(root, "string", name=key)
item.text = value tree = ET.ElementTree(root)
tree.write(output_file, encoding='utf-8') excel_to_xml(args.file, args.sheet, args.key, args.value, args.output)

Android string.xml与Excel的互相转换的更多相关文章

  1. Android string.xml error: Apostrophe not preceded by \

    Android string.xml error: Apostrophe not preceded by \ 遇到了这个错误,编译无法通过 error: Apostrophe not preceded ...

  2. 【Android】android string.xml前后加空格的技巧

    android string.xml 文字中间加入空格 <string name="password">密    码</string> &#160 ...

  3. android string.xml %问题

    反复检查后发现是string.xml中的 % 导致编译失败, 这是由于新的SDK采用了新版本的aapt(Android项目编译器),这个版本的aapt编译起来会比老版本更加的严格,然后在Android ...

  4. android string.xml里的空格字符

    在string.xml定义字符串的时候常常要用到空格, 直接用键盘敲的话不知道是几个空格,常常看错了,导致误删. 假设用 来替代空格的话,就好非常多. 另外使用%1$s,%1$d能够在一个字符串里定义 ...

  5. Android string.xml 添加特殊字符

    解决项目中在string.xml 中显示特殊符号的问题,如@号冒号等.只能考虑使用ASCII码进行显示: @号 @ :号 : 空格   以下为常见的ASCII十进制交换编码: --> <- ...

  6. Android string.xml 显示特殊符号

    项目中要在string.xml 中显示特殊符号,如@号冒号等,直接写肯定不行啦..只能考虑使用ASCII码进行显示: 省略号 …@号 @:号 :空格   以下为常见的ASCII十进制交换编码: --& ...

  7. android string.xml前后加空格的技巧

    方法1: <string name="password">密    码</string>&#160 这个就代表着空格. 方法2:用\u0020代表空 ...

  8. Android String.xml中的符号总结

    <b></b>加粗字体 <i></i> 斜体字体 <u></u> 给字体加下划线 \n 换行 \u0020表示空格 \u2026 ...

  9. android textview改变部分文字的颜色和string.xml中文字的替换(转)

    转   :http://blog.csdn.net/ljz2009y/article/details/23878669 一:TextView组件改变部分文字的颜色: TextView textView ...

  10. Android Studio 轻松整理字符串到string.xml中

    昨天了解了Alt+Enter快捷键的大用处,今天又发现了一个快捷的方法,必须记下来.转载请注明出处http://www.cnblogs.com/LT5505/p/5466630.html 1.首先代码 ...

随机推荐

  1. Thread 线程中的 Synchronized block and lock

    Thread Definition of Synchronized Synchronized block in java are marked with the synchronized keywor ...

  2. 系统论——复杂适应系统CAS(三)

    美国的圣塔菲研究所一直是复杂性研究的中心.1994年,约翰·霍兰德在圣菲研究所举办的吴拉姆纪念讲座中做了名为"隐秩序"的著名演进,而后,出版了<隐秩序-适应性造就复杂性> ...

  3. 在Kubernetes上安装Netdata的方法

    介绍 Netdata可用于监视kubernetes集群并显示有关集群的信息,包括节点内存使用率.CPU.网络等,简单的说,Netdata仪表板可让您全面了解Kubernetes集群,包括在每个节点上运 ...

  4. 四月十五号java基础知识

    1.今天下午做了一个题感受很深,自己做题没有思路或者有点思路死磕也没有搞清楚,看起来很简单的问题,在我手里很难 做咯许久还是室友帮忙解决的,后面重新打一遍还是出问题,找他解决的,问了问他我自己的问题, ...

  5. day65:Linux:nginx代理&nginx负载均衡

    目录 1.nginx代理 2.nginx代理与配置 3.nginx负载均衡调度多web节点(静态页面) 4.nginx负载均衡调度多应用节点(blog) 5.nginx_proxy + web应用节点 ...

  6. Ubuntu Server搭建个人服务器

    Ubuntu Server20.04.5 LTS [参考资料] Ubuntu官方地址:https://www.ubuntu.com/ Ubuntu论坛地址:https://ubuntuforums.o ...

  7. Django相关配置信息

    Django相关配置信息 1.配置数据库mysql 1.1 setting.py中配置信息 DATABASES = { 'default': { 'ENGINE': 'django.db.backen ...

  8. CVE-2016-3088漏洞复现

    1.背景介绍. ActiveMQ的web控制台分三个应用,admin.api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口:admin和api都 ...

  9. for of 和 for in 的区别

    1 var arr = ["f", "6", 3, "a", 7]; 2 var obj = { name: "shun" ...

  10. vscode使用git推送代码

    下载vscode https://code.visualstudio.com/ 点击应用管理 搜素Chinese (Simplified) Language Pack for Visual Studi ...