文档翻译 - 如何翻译整个Excel文件?

113 阅读3分钟

一. Excel文件是什么?

Excel是一种电子表格软件,由微软开发和发布。它具有强大的数据处理和分析功能,可以帮助用户管理和计算数据、创建图表和报表,并进行各种数据分析任务。Excel文件由一个或多个电子表格组成,用户可以在单元格中输入和编辑数据,并使用内置函数和公式进行计算。Excel还支持数据排序、筛选、图表绘制等功能,以及与外部数据源的连接和导入。它是一种广泛应用于各个领域和行业的办公软件。

二. 常见的Excel翻译方式

1. 函数翻译工具

官方 Excel 函数翻译工具 工具,通过调用翻译函数来翻译指定的文本。

但是,整个文件的翻译可能比较繁琐。

2. 使用现成的工具一键翻译

例如:

浪客剑心:如何使用ChatGPT翻译文档(PDF/EPUB/DOCX/PPTX/XLSX)


如果你想做一个自己的Excel翻译程序,以下的读取文本技巧应该对你有用。

三. 如何读取和翻译Excel文件中用到的文本

一个完美的Excel翻译,应该是在保留原本的所有格式下,把所有的文本提取出来进行翻译。

1. 问题

在 Node.js 下,实际上有很多库可以读取 xlsx 文件,例如 xlsx、exceljs、node-xlsx 等。

但是除了 Microsoft Office 外,没有任何一个程序能够保证完全兼容 Excel 的所有特征。

这意味着一旦使用这些库来读取并重新生成 Excel 文件,很可能会导致一些函数被抹去的情况。

2. 解决方案

问题主要是格式转换的过程导致了文档内容发生变化。

只要能在文件中直接找到文本的位置并替换成翻译后的文本,就能完美地保留原来的格式和公式等内容。

所有我们需要先了解下Excel文件.xlsx的结构。

3. xlsx文件的存储结构

一个.xlsx文件实际上是一个压缩文件(ZIP格式),其中包含多个目录和文件。

主要的目录和文件包括:

  • _rels目录:包含与文件关系相关的文件。
  • docProps目录:包含与文档属性相关的文件,如核心属性和扩展属性。
  • xl目录:包含与Excel工作簿相关的文件。
  • [Content_Types].xml:定义文件中各个部分的内容类型。

xl 目录下,有一个神奇的文件 xl/sharedStrings.xml

里面的t节点,包含了Excel文件中使用到的所有文本

4. 读取并修改Excel中的文本

需要使用的第三方库:

jszip: 在JavaScript中创建、读取和操作ZIP文件的库。
xmldom: 一个用于JavaScript的轻量级XML解析库,使您能够创建、修改和遍历XML文档的节点。

4.1. 使用 jszip 读取Excel文件

const excelFile = 'excel文件路径'
const fileBuffer = fs.readFileSync(excelFile)
const zip = await JSZip.loadAsync(fileBuffer)

4.2. 使用xmldom读取sharedStrings.xml文件内容

let xml = await zip.file('xl/sharedStrings.xml')?.async('string')
const doc = parser.parseFromString(xml, 'application/xml')

4.3 访问所有文本节点并翻译

// 按顺序访问所有文本节点
const nodes = doc.getElementsByTagName('t')
for (let i = 0; i < nodes.length; i++) {
    const node = nodes[i]
    // 使用ChatGPT翻译 node.textContent ..., translate 代表需要的翻译函数, 可以使用ChatGPT翻译
    node.textContent = translate(node.textContent)
}

4.4 把翻译后的sharedStrings.xml替换压缩包里的文件

const serializer = new XMLSerializer()
const modifiedXml = serializer.serializeToString(doc)
await zip.file('xl/sharedStrings.xml', modifiedXml, {
   compression: 'DEFLATE',
   compressionOptions: { level: 3 }
})

// 生成翻译后的Excel文件
fs.writeFileSync("翻译后的Excel文件", await zip.generateAsync({ type: 'nodebuffer' }))

然后就得到完美翻译的文件了。

5. 优化建议

  • 翻译工作表的名称, 工作表的名称在workbook.xml。

  • 结合ChatGPT的上下文理解的方式翻译文本, 而不是单独翻译的每一处文本. 这个处理的优化空间很大, 也需要比较精细的处理.

如果文章能帮助到你,欢迎点赞。

后续我会继续分享一些关于各种文件格式翻译的代码,有兴趣的可以关注一下。谢谢。