多语言管理方案 - Excel导入与导出

8 篇文章 0 订阅
8 篇文章 0 订阅

技术栈:JavaScript + fs + xlsx.js

简介

前篇: Vue-i18n国际化多语言-在线表格翻译
结合本博客之前的国际化多语言的实现与实际业务场景,意识到人工在项目中手动配置、替换多语言花费的人力成本较高,于是衍生出其他的管理方案,解放双手,核心原理就是多语言配置文件与 Excel 文件相互转换、文件读写。

  1. 导出:输入多语言配置数据,输出 Excel文件
  2. 导入: 输入Excel文件,输出多语言配置数据文件
  3. 管理:Excel文件,可采用本地或者云管理。至于在线编辑的功能,就是将Excel文件在在线平台导入导出即可。

因为Vika单词插入记录最多10条,此处就不演示直接与Vika进行多语言管理的实现,代码在博主本地,有需要的可以私。

实现

数据结构

本篇代码适用于双层嵌套的对象多语言配置文本,每个语种为一个文件。

{
	module1: {
		label1: "123",
		label2: "qwe",
	},
	module2: {
		label1: "345",
		label2: "7788",
	},
}

例如法语的配置文件为:
在这里插入图片描述

安装

涉及到 Excel 的解析和文件读写,就分别需要xlsx、fs这两个插件。

npm install xlsx --save
npm install fs --save
# or
yarn add xls
yarn add fs

导出Excel

import XLSX from 'xlsx'
import zh from '../lang/web/zh.js'
import en from '../lang/web/en.js'
import fr from '../lang/web/fr.js'

// 判断数据是否非undefined,因为可能漏配了
const notUndefined = (data) => {
  return !(typeof data === 'undefined')
}

/** 将深层嵌套对象扁平化,对象转数组(以中文为标准,进行补全) */
const objsToExcelData = () => {
  const resArr = []
  const keysWrapper = Object.keys(zh) // 外层label
  keysWrapper.forEach((keyWrap) => {
    if (typeof zh[keyWrap] === 'object') {
      const keysInner = Object.keys(zh[keyWrap]) // 内层label
      typeof zh[keyWrap] === 'object' &&
        keysInner.forEach((keyInn) => {
          const obj = {
            LabelWrapper: keyWrap,
            LabelInner: keyInn,
            zh: zh[keyWrap][keyInn], // 中文
            en: en[keyWrap] && notUndefined(en[keyWrap][keyInn]) ? en[keyWrap][keyInn] : '', // 英文
            fr: fr[keyWrap] && notUndefined(en[keyWrap][keyInn]) ? fr[keyWrap][keyInn] : '' // 法语
          }
          resArr.push(obj)
        })
    }
  })
  console.log(resArr)
  return resArr
}

/** 将数据解析成Excel格式并导出 */
const exportToExcel = (data) => {
  const worksheet = XLSX.utils.json_to_sheet(data) // json数据转Excel表
  const workbook = XLSX.utils.book_new() // 新建Excel文件
  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1') // 将表添加到EXCEL文件
  XLSX.writeFile(workbook, 'exported-data.xlsx') // 导出
}

导入Excel

import * as fs from 'fs'
import XLSX from 'xlsx'

const chartLangLabels = ['zh', 'en', 'fr'] // 表格语言对应的label字段

/** 获取excel数据并解析 */
const getExcelData = (url) => {
  const workBook = XLSX.readFile(url) // 目标文件获取
  let name = workBook.SheetNames[0] // 读取表格中第一个表
  let sheet = workBook.Sheets[name] // 数据获取
  console.log(XLSX.utils.sheet_to_json(sheet)) // 数据格式转换
  return XLSX.utils.sheet_to_json(sheet)
}

/** 处理excel表格的数据 */
const handleExcelData = (data) => {
  // 目标数据结构, 类似于 { zh:{} ,en: {}, fr: {}}
  const resData = {}
  chartLangLabels.forEach((langLabel) => {
    resData[langLabel] = {}
  })
  data.forEach((item) => {
    const labelWrapper = item.LabelWrapper // LabelWrapper 外层label,业务模块
    const labelInner = item.LabelInner // LabelInner 内层label(因为有多个业务模块 所以加了一层嵌套)
    chartLangLabels.forEach((currLang) => {
      if (!resData[currLang][labelWrapper]) resData[currLang][labelWrapper] = {} // 业务模块多语言undefined时,创建{}
      resData[currLang][labelWrapper][labelInner] = item[currLang]
    })
  })
  return resData
}

/** 读写数据 */
const writeData = (targetData) => {
  chartLangLabels.forEach((lang) => {
    let str = `export default {\n    ${outputJSONString(targetData[lang], undefined, 4)}}`
    // 文件写入,文件名与chartLangLabels内保持一致 
    fs.writeFile(`./src/lang/web/${lang}.js`, str, 'utf-8', function (err) {
      if (err) {
        console.log(lang + '写文件操作失败')
        console.log(err)
      } else console.log(lang + '写文件操作成功')
    })
  })
}

应用

导出


const handleData = () => {
  const data = objsToExcelData()
  exportToExcel(data)
}

handleData()

导入

const handleImportData = () => {
  let resData = getExcelData('./src/utils/lang.xlsx') // excel数据路径
  const targetData = handleExcelData(resData) // 得到需要的数据结构
  writeData(targetData) // 文件读写
}

handleImportData()

效果

导出的Excel文件结果
导出的多语言Excel文件结果
按照导出规则写入的js文件结果
导入的多语言js文件结果

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java是一种通用的高级编程语言,通过Java编写程序可以实现各种功能,包括Excel导入导出。在Java中,可以使用Apache POI来操作Excel文件,Apache POI是一个流行的用于读写Microsoft Office文件的Java库,它包括HSSF(用于读写Excel 97-2003),XSSF(用于读写Excel 2007+)和SS(实验性的通用Spiral包)。 在Java中使用Apache POI进行Excel导入时,首先需要创建一个Workbook对象,该对象可以是XSSFWorkbook(用于.xlsx文件格式),也可以是HSSFWorkbook(用于.xls文件格式)。一旦获得了Workbook对象,就可以从工作表中获取数据。对于每个工作表,都可以使用Sheet对象访问单元格中的值,并使用Row对象访问单元格中的列数据。 在Excel导出方面,在Java中使用Apache POI可以创建Excel文档并向其中添加数据。要创建一个Excel文档,首先需要创建一个Workbook对象,然后添加一个或多个工作表。对于每个工作表,可以使用Sheet对象访问单元格,并使用Row对象访问列数据。将数据添加到单元格后,可以使用FileOutputStream将文档写入指定的文件。 总的来说,使用Java进行Excel导入导出是一种非常灵活和高效的方法,可以通过学习和使用Apache POI等工具来实现。 ### 回答2: Java是一个跨平台的编程语言,它可以很好地进行Excel文件的导入导出。Java提供了一些库,比如Apache POI,用于操作Excel文件。通过这些库,我们可以在Java中进行Excel文件的读取和写入。 Excel导入导出可以用来处理各种数据,这对于企业来说非常有用。因为数据是企业的核心资产之一,所以正确导入导出数据是非常重要的。Java对于处理Excel数据非常方便,我们可以很容易地将数据转换成Java对象,然后以任何我们需要的方式进行处理。 在使用Java进行Excel导入导出时,我们需要先导入Apache POI库。通过这个库,我们可以调用其提供的方法来操作Excel文件。例如,我们可以通过创建Workbook对象来读取Excel文件,并通过Sheet对象访问工作表中的单元格。 对于Excel导出,我们首先需要定义Excel模板,然后使用Java代码填充模板。我们可以通过创建Workbook对象来创建新的工作簿。然后,我们可以创建一个Sheet对象,然后使用Row对象和Cell对象来创建表格。最后,我们将表格数据写入Excel文件中。 总而言之,Java提供了快速,可靠的Excel导入导出解决方案。这对于企业来说非常重要,因为数据是企业运营的核心资产。利用Java的Excel导入导出功能,企业可以更好地处理数据并提高效率。 ### 回答3: Java中导入导出Excel文档是非常常见的操作,可以根据具体需求使用Java自带的API或者开源框架完成。本文将重点介绍Apache POI和EasyExcel两个开源框架的使用。 一、Apache POI Apache POI是Apache软件基金会的一个开源项目,提供基于Java的API用于处理Microsoft Office格式文件。其中包括Word、Excel和PowerPoint等文档的读写操作,对于Excel的读写操作使用的是XSSF和HSSF两个模块,分别支持.xlsx和.xls格式的文件。 1.导入Excel 首先需要导入POI的jar包,然后使用以下代码读取Excel中的数据: ``` File file = new File("test.xlsx"); InputStream inputStream = new FileInputStream(file); Workbook workbook = new XSSFWorkbook(inputStream);//读取xlsx格式 //Workbook workbook = new HSSFWorkbook(inputStream);//读取xls格式 Sheet sheet = workbook.getSheetAt(0);//获取第一个sheet Iterator<Row> iterator = sheet.iterator(); while(iterator.hasNext()) { Row row = iterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); while(cellIterator .hasNext()) { Cell cell = cellIterator.next(); switch (cell.getCellType()) { case STRING: System.out.print(cell.getStringCellValue() + " "); break; case NUMERIC: System.out.print(cell.getNumericCellValue() + " "); break; case BOOLEAN: System.out.print(cell.getBooleanCellValue() + " "); break; case FORMULA: System.out.print(cell.getCellFormula() + " "); break; default: System.out.print(""); } } System.out.println();//换行 } inputStream.close(); ``` 2.导出Excel 基于POI的Excel导出主要是通过创建Workbook对象、Sheet对象和Cell对象,然后将数据填充到Cell对象中,最后输出到文件中。以下是导出Excel的示例代码: ``` Workbook workbook = new XSSFWorkbook();//创建工作簿 Sheet sheet = workbook.createSheet("sheet0");//创建sheet Row row = sheet.createRow(0);//创建行 Cell cell = row.createCell(0);//创建单元格 cell.setCellValue("姓名"); cell = row.createCell(1); cell.setCellValue("年龄"); cell = row.createCell(2); cell.setCellValue("性别"); row = sheet.createRow(1);//创建行 cell = row.createCell(0); cell.setCellValue("张三"); cell = row.createCell(1); cell.setCellValue(20); cell = row.createCell(2); cell.setCellValue("男"); FileOutputStream outputStream = new FileOutputStream("test.xlsx");//输出到文件 workbook.write(outputStream); outputStream.close(); ``` 二、EasyExcel EasyExcel是一个基于POI封装的Java开源框架,提供简单易用的方式完成Excel导入导出操作。相对于POI,EasyExcel的优点在于它的API更加简单明了,使用起来更加方便快捷。 1.导入Excel EasyExcel导入Excel的方式主要是通过读取监听器实现,可以实现不同sheet的读取、数据转换和对数据的处理等功能。以下是导入Excel的示例代码: ``` //创建读取监听器 public class ExcelListener extends AnalysisEventListener<User> { private List<User> userList = new ArrayList<>(); @Override public void invoke(User user, AnalysisContext analysisContext) { userList.add(user);//每读取一条数据就添加到List中 } @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { //读取完成后的操作 } public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } } //使用监听器读取Excel数据 File file = new File("test.xlsx"); EasyExcel.read(file, User.class, new ExcelListener()).sheet().doRead(); ``` 2.导出Excel EasyExcel导出Excel的方式主要是通过生成器模式创建写入对象、构造sheet页和单元格,最后输出到文件或者流中。以下是导出Excel的示例代码: ``` //创建写入对象 ExcelWriter writer = EasyExcel.write("test.xlsx", User.class).build(); //构造sheet页和单元格 WriteSheet sheet = EasyExcel.writerSheet("sheet0").build(); //填充数据到单元格 List<User> userList = new ArrayList<>(); userList.add(new User("张三", 20, "男")); userList.add(new User("李四", 22, "女")); writer.write(userList, sheet); //输出到文件或者流中 writer.finish(); ``` 总结 以上是Apache POI和EasyExcel两个框架的Excel导入导出操作,两者都十分流行和实用,可以根据项目需求进行选择。在实际开发中,需要注意的是Excel的版本问题、数据类型的转换、异常处理等,并加以优化和完善,从而提高代码的可维护性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值