android 解放双手 自动化生成多语言strings内容

2023-05-16

本文主要基于jxl.jar 自动解析Excel xls文件内容,生成values-文件夹及strings.xml文件

资源文件:代码及jxl.jar下载

只能支持97-2003的Excel xls,不适配Excel xlsx文件,需要另存为97-2003的xls文件后才能读取。

产品经理给出的多语言.xls文件内容如下,
在这里插入图片描述
自动化生成后:
在这里插入图片描述
在这里插入图片描述

工具类:

public class ValueModel {

    private String countryCode; //string文件所属国家代号,即value-后接的字符串
    private String name;        //字段的name
    private String defaultValue;    //字段的默认内容
    private String value;   //字段的多语言内容

    public String getCountryCode() {
        return countryCode;
    }

    public void setCountryCode(String countryCode) {
        this.countryCode = countryCode;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDefaultValue() {
        return defaultValue;
    }

    public void setDefaultValue(String defaultValue) {
        this.defaultValue = defaultValue;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "ValueModel{" +
                "countryCode='" + countryCode + '\'' +
                ", name='" + name + '\'' +
                ", defaultValue='" + defaultValue + '\'' +
                ", value='" + value + '\'' +
                '}';
    }
}
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;

/**
 * Created:     by leon
 * Date:        2018/12/1
 * Description: 根据xls文件自动化生成多语言strings内容
 *              需要参考给定的xls文件格式
 */
public class GlobalizationUtil {

    //xls文件所在目录,也是生成的values文件夹的所在目录
    private final static String DIR = "C:\\Users\\leon\\Desktop\\globalization";
    //xls文件名
    private final static String XMS_PATH = DIR + "\\多语言.xls";
    //key 为第几列, value 为国家代码
    private static Map<Integer, String> sCodeMap = new HashMap<>();
    //key为国家代码, value 为多语言内容
    private static Map<String, List<ValueModel>> sValueMap = new HashMap<>();

    public static void getXlsData() {
        getXlsData(XMS_PATH, 2, 5);
    }

    /**
     * 只能支持xls格式,即97-2003Excel文件,暂不支持xlsx格式
     *
     * @param xlsPath      多语言xls文件
     * @param startColumns 从第几列开始是多语言内容,从0计数
     * @param count        一共有几列是多语言的内容
     */
    public static void getXlsData(String xlsPath, int startColumns, int count) {
        sValueMap.clear();
        sCodeMap.clear();
        File excelFile = new File(xlsPath);
        try {
            WorkbookSettings workbookSettings = new WorkbookSettings();
            //可以设置为UTF-8或者GBK或者ISO-8859-1,这里需要设置为ISO-8859-1,否则有可能其他国家文字会出现乱码
            workbookSettings.setEncoding("ISO-8859-1");
            Workbook workbook = Workbook.getWorkbook(excelFile, workbookSettings);
            //总共有几张表
            int sheetNum = workbook.getNumberOfSheets();
            //0代表获取的是第一张表
            Sheet sheet = workbook.getSheet(0);
            //表名
            String sheetName = sheet.getName();
            //表的行数
            int sheetRows = sheet.getRows();
            //表的列数
            int sheetColumns = sheet.getColumns();

            System.out.println("the num of sheets is " + sheetNum);
            System.out.println("the name of sheet is  " + sheetName);
            System.out.println("total rows is 行=" + sheetRows);
            System.out.println("total cols is 列=" + sheetColumns);
            //i=1,代表从第2行开始读取文件内容
            for (int i = 1; i < sheetRows; i++) {
                //第2行是读取国家代码
                if (i == 1) {
                    for (int number = 0; number < count; number++) {
                        int columnIndex = startColumns + number;
                        String code = sheet.getCell(columnIndex, i).getContents();
                        sCodeMap.put(columnIndex, code);
                        sValueMap.put(code, new ArrayList<>());
                    }
                } else {
                    String name = sheet.getCell(0, i).getContents();
                    if (name == null || name.equals("")) {
                        break;
                    }
                    String defaultValue = sheet.getCell(1, i).getContents();
                    for (int number = 0; number < count; number++) {
                        int columnIndex = startColumns + number;
                        String code = sCodeMap.get(columnIndex);
                        List<ValueModel> countryList = sValueMap.get(code);
                        ValueModel valueModel = new ValueModel();
                        valueModel.setName(name);
                        valueModel.setDefaultValue(defaultValue);
                        valueModel.setCountryCode(code);
                        valueModel.setValue(sheet.getCell(columnIndex, i).getContents());
                        countryList.add(valueModel);
                    }
                }
            }
            workbook.close();
            createValuesStringsXml();
        } catch (Exception e) {
            System.out.println("read error=" + e);
        }
    }

    /**
     * 创建values文件夹和strings文件,并写入内容
     */
    private static void createValuesStringsXml() {
        Set<String> keySet = sValueMap.keySet();
        for (String code : keySet) {
            File cacheDir = new File(DIR, "values-" + code);
            if (!cacheDir.exists()) {
                cacheDir.mkdir();
            }
            File file = new File(cacheDir, "strings.xml");
            try {
                if (!file.exists()) {
                    file.createNewFile();
                }
                BufferedWriter bw = new BufferedWriter(new FileWriter(file));
                bw.write("<resources>");
                bw.newLine();
                List<ValueModel> list = sValueMap.get(code);
                for (ValueModel model : list) {
                    bw.write("<string name=\"" + model.getName() + "\">" + model.getValue() + "</string>");
                    bw.newLine();
                }
                bw.write("</resources>");
                bw.close();
                System.out.println("写入完成" + cacheDir.getName() + " " + file.getName());

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 解放双手 自动化生成多语言strings内容 的相关文章

  • 以编程方式更改相对布局

    我有相对布局 即main xml我设置如下 但现在我必须将 view1 放在 view2 上宽度 200dp 高度 100dp 这样 view2 将成为大视图 而 view1 将成为小视图 public void onCreate Bund
  • Android Studio 2.2 更新后任务“:app:processDebugManifest”执行失败

    错误 任务 app processDebugManifest 执行失败 清单合并失败 属性 Activity com facebook FacebookActivity theme value android style Theme Tra
  • 从左到右和从右到左滑动图像

    我正在开发一个应用程序 我想在其中添加可以从左到右和从右到左滑动的图像 如下图所示 内部的白色游戏图像应该从左到右移动 反之亦然 到目前为止我所做的是 我能够从左到右移动单个图像 反之亦然 但我想要设置背景图像 就像上面的圆形黑色背景一样
  • 致命信号11(和引擎项目)

    我正在创建由 andengine 框架提供支持的 android 游戏 box2d 扩展我收到 致命信号 11 这似乎是突然发生的 我想你可以随机称呼它 没有任何线索 至少 我不知道有任何线索可以帮助我解决这个问题 我的猜测是 1 我正在使
  • Android NDK:从 JNI C 类调用 java 方法

    我有 JNI 方法 我试图在其中调用 Java 方法 这是我的 JNI 代码 void DummySink afterGettingFrame unsigned frameSize unsigned numTruncatedBytes st
  • 仅适用于我所在国家/地区的 Google 地图?

    如何在 Android 应用程序中使用 Google 地图 使其仅显示我的国家 地区 我的意思是 世界其他地方不会出现在应用程序中 查看其中之一迈克 威廉姆斯 http econym org uk gmap range htm很棒的 GMa
  • Android 10:IMEI 在 API 29 上不再可用。寻找替代方案

    我们客户的应用程序的主要功能很大程度上依赖于跟踪客户的设备 他们提供与特定手机 而不是其所有者 绑定的产品 使用设备 IMEI 可以实现这一点 但随着 Android 10 中的隐私更改 他们使其无法访问 https developer a
  • 如何将 Exif 长/纬度转换为实际值?

    我正在尝试从我的一些图片中获取 Exif 数据 这些是我收到的纬度和经度值 有人可以帮助我并告诉我这些数字的含义吗 DEBUG lat 30 1 12 1 34 1 7588 纬度 DEBUG long 81 1 22 1 41 1 758
  • NFC 中的 AAR 记录:有效负载在哪里?

    根据这个答案 https stackoverflow com a 9235624 115145经测试验证 当您使用 Android Beam 推送包含 AAR 记录的 NFC 消息时 接收设备将启动MAIN LAUNCHERAAR 中指定的
  • 同一活动的多个通知

    我有一个正在从通知栏打开的活动 但是当我这样做时NotificationManager notify 我给意图一个不同的捆绑 以便每个通知打开相同的活动 但从数据库中获取彼此的其他信息 但是 当我尝试输入任何通知 例如有 3 个通知 时 它
  • Android 位图图像缓存

    嗨 我正在 Android 中实现图像缓存 经历过这个 http developer android com training displaying bitmaps cache bitmap html http developer andr
  • 如何在android中获取listview的高度?

    我需要使用自定义 ListVAdapter 找到 android ListView 的高度 每个 ListView 项目的高度都可以不同 我尝试过在这里找到的以下代码 public static void setListViewHeight
  • Android 中什么原因导致 MotionEvent.ACTION_CANCEL?

    我正在调试 Android 上的一些触摸处理内容 并试图找出为什么 MotionEvent 发送到我的视图onTouchListener包含一个cancel行动 我无法找到任何有关其原因的文档 并且希望有人能为我指出调试此问题的正确方向 错
  • 安卓天文台表

    如何以默认 00 00 以外的特定时间启动计时器 是否可以设置 chronometerObj setBase startTime ch setBase SystemClock elapsedRealtime anylongvalue ch
  • 如何在 Composable 中使用示例数据?

    在 XML 中 我们通过使用以下属性来使用样本名称 日期等 工具 样本 名字 有什么方法我们可以使用类似的示例数据 工具 样本在预览可组合项中 您可以使用 PreviewParameter https developer android c
  • 以编程方式将音乐文件访问到我的应用程序中

    如何以编程方式将设备中的音乐文件访问到我的应用程序中 另一种方法可能是使用 MediaStore 内容提供程序来查找您的音乐 http developer android com reference android provider Med
  • 一般:如何更改 Android 核心 API 类?

    这只是一个一般性问题 供我参考 我知道如何创建标准的 Android 应用程序 但我想知道 这怎么可能 人们如何增强 Android 核心功能并深入挖掘系统 例如 假设我想调整下载管理器 http developer android com
  • 图片上传亚马逊s3 android SDK 2.0

    我想将图像上传到 android 中的亚马逊 s3 存储桶 我没有收到任何错误 但它不起作用有人可以帮助我吗 我找不到任何关于此的好的例子或问题 我将图像分配给 文件图像3 images3 new File uri getPath publ
  • 如何在android中的listview中添加listview?

    我在列表视图项目中添加为 3 个文本视图 我想用 3 个文本视图和列表视图显示列表视图项目 我正在这样做
  • 使用媒体编解码器将 PCM 转换为 AAC

    我正在 Android Jelly Bean 中使用媒体编解码器类将 PCM 格式编码为 AAC 该文件已编码 但没有音乐播放器能够播放该文件 我在网上找不到任何工作代码或正确的文档 这是我的代码 public void doConvert

随机推荐

  • javascript之字符串

    replace replace pattern replacement 字段说明pattern字符串或者具有Symbol replace方法的对象replacement可以是字符串或者函数 字符串时 xff0c 会替换pattern匹配的子
  • win10重装遇到的问题

    今天在重装win10系统时遇到几个问题 xff0c 折腾了一整天 win10计算机意外地重新启动或遇到错误 解决方法 1 在出现错误提示的界面中我们按 Shift 43 F10 打开命令提示符 2 在命令提示符中输入 cd oobe xff
  • Arduino IDE搭建ESP8266开发环境,开发包下载过慢解决方法

    Arduino IDE搭建ESP8266开发环境 xff0c 开发板管理器中下载过慢解决方法 方法一 xff1a 1 首选项 附加开发板管理器网址 xff1a http arduino esp8266 com stable package
  • CheckBox的使用(一):onCheckedChanged事件

    重写接口 public void onCheckedChanged CompoundButton buttonView boolean isChecked package com example androidtest import and
  • 指针与引用的关系

    c xff0b xff0b 中的引用与指针的区别 相同点 xff1a 1 都是地址的概念 xff1b 指针指向一块内存 xff0c 它的内容是所指内存的地址 xff1b 引用是某块内存的别名 区别 xff1a 1 指针是一个实体 xff0c
  • C&C++图形图像处理开源库

    Google三维APIO3D O3D 是一个开源的 WebAPI 用来在浏览器上创建界面丰富的交互式的 3D 应用程序 这是一种基于网页的可控3D标准 此格式期望真正的基于浏览器 xff0c 独立于操作系统之外 xff0c 并且支持主流的3
  • protobuf的ParseFromArray 解析失败的问题

    前段时间 xff0c 在解析定义的Message时 xff0c 总是提示解析失败 xff0c 刚开始以为是消息号与消息没有对应上 xff0c 检查后发现消息号与消息是对应的 后来发现消息的一个字段定义为required 但是没有赋值 xff
  • Incorrect number of FETCH variables

    在写存储过程 xff0c 运行后提示 Incorrect number of FETCH variables 原来是用游标select的字段数需要与fetch into的变量数一致 修改后的如下 xff1a DROP PROCEDURE I
  • phpStorm 2016.1 最新版激活方法

    新版激活方法 1 在线激活 最新 http 123 206 193 241 1017 http www 0 php com 1017 xff08 可用 xff0c 更新于 20170621 xff09 http idea singee77
  • Android EditText最大字数限制并提示

    public class MaxTextLengthFilter implements InputFilter private int mMaxLength 构造方法中传入最多能输入的字数 public MaxTextLengthFilte
  • Android调用系统, 任意比例裁剪图片

    废话不多说 直接上代码 核心代码 span class hljs javadoc 跳转到系统裁剪图片页面 span class hljs javadoctag 64 param span imagePath 需要裁剪的图片路径 span s
  • Kotlin教程学习-字符串拼接,数组,List

    摘要 Kotlin是一种优雅的语言 是JetBrains公司开发的JVM语言 与Java有着极密切的联系 Kotlin有着怎样的魅力呢 首先看到的就是import语句 这个很好理解 既然Kotlin有包的概念 自然就可以使用import语句
  • Android app启动白屏优化

    可以看到启动的时候会有一个白屏 如果手机较慢的话 这个白屏就会持续一段时间 不太友好 那么还有没有什么办法优化呢 给我们的应用窗口弄一个PlaceHolder Android最新的Material Design有这么个建议的 建议我们使用一
  • 04 点亮LED 汇编

    1 原理图 从原理图看到 xff0c 3个LED分别由GPF4 GPF5和GPF6控制 2 寄存器描述 GPF4 GPF5和GPF6可用作输入输出 xff0c 或中断功能 要点亮LED xff0c 需要将IO设置为输出模式 xff0c 并输
  • CentOS7.5安装CloudStack4.11出现Requires python(abi) = 2.6的解决方案

    错误描述 root 64 manage yum install cloudstack management 已加载插件 xff1a fastestmirror Loading mirror speeds from cached hostfi
  • 一款APP从设计稿到切图过程全方位揭秘(IOS版)

    9月17日凌晨 xff0c IOS9正式推送 xff0c 它使用的字体最终还是变了 xff0c 我下面写的内容你们也要酌情更新 xff0c 因为我写的实在赶不上它更新的速度了 iOS9使用的西文字体由Helvetica Neue变更为 Sa
  • Dagger2找不到DaggerActivityComponent类

    这是因为你要成功编译一次 xff0c DaggerXXXComponent才会自动生成 xff0c 如果是Android Studio的话 快捷键Ctrl 43 F9编译就行了
  • AndroidStudio升级3.0后报错,Annotation processors must be explicitly declared now

    报错信息显示为butterknife的注解导致的 Error Execution failed span class hljs keyword for span task span class hljs string 39 app java
  • Java设计模式透析之 —— 模板方法(Template Method)

    链接 xff1a http blog csdn net guolin blog article details 8744002
  • android 解放双手 自动化生成多语言strings内容

    本文主要基于jxl jar 自动解析Excel xls文件内容 xff0c 生成values 文件夹及strings xml文件 资源文件 xff1a 代码及jxl jar下载 只能支持97 2003的Excel xls xff0c 不适配