一. 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的上下文理解的方式翻译文本, 而不是单独翻译的每一处文本. 这个处理的优化空间很大, 也需要比较精细的处理.
如果文章能帮助到你,欢迎点赞。
后续我会继续分享一些关于各种文件格式翻译的代码,有兴趣的可以关注一下。谢谢。