HarmonyOS 鸿蒙Next系统有解析Excel表格的能力吗?需要参考哪一块的文档
HarmonyOS 鸿蒙Next系统有解析Excel表格的能力吗?需要参考哪一块的文档 【问题描述】:鸿蒙系统有解析Excel表格的能力吗?需要参考哪一块的文档
【问题现象】:咨询鸿蒙系统中的解析excel表格的功能,需要一份详细的参考文档,需要读取excel每个单元格的函数
【版本信息】:不适用
【复现代码】:不适用
【尝试解决方案】:三方库excel_hm(V1.0.0),这个有行列的限制,不太适用
【背景知识】
- SheetJS(链接来源于xlsx):SheetJS社区版是一个纯粹基于JavaScript的表格处理库,提供经过实战检验的开源解决方案,支持各种表格文件格式,包括Microsoft Excel、WPS Excel、CSV等。该库提供了丰富的API,能够在不需要服务器端支持的情况下,直接在浏览器中进行表格数据的操作。
- 前端页面调用应用侧函数:注册应用侧代码有两种方式,一种在Web组件初始化调用,使用javaScriptProxy()接口;另外一种在Web组件初始化完成后调用,使用registerJavaScriptProxy()接口。两种方式都需要和deleteJavaScriptRegister接口配合使用,防止内存泄漏。
【解决方案】
-
该方案基于SheetJS库0.20.3版本。在前端html页面通过以下方式引入:
<script src="https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js"></script> -
读取Excel文件转换为ArrayBuffer后,使用SheetJS将二进制数据解析为工作簿(Workbook),代码示例如下:
<!-- HTML:文件上传控件 --> <input type="file" id="excelFile" accept=".xlsx, .xls, .csv" style="display: none;"/> <!-- 引入 SheetJS 库(可使用 CDN) --> <script src="https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js"></script> <script> // 1. 获取 DOM 元素 const fileInput = document.getElementById('excelFile'); // 2. 监听整个页面的点击事件 document.addEventListener('click', () => { // 触发文件选择框 fileInput.click(); }); // 3. 监听文件选择事件 fileInput.addEventListener('change', async (e) => { const file = e.target.files[0]; if (!file) return; // 未选择文件则退出 try { // 3. 读取文件的二进制数据(关键步骤) const data = await readFileAsArrayBuffer(file); // 4. SheetJS 解析:二进制数据 → 工作簿(Workbook) const workbook = XLSX.read(data, { type: 'array' }); // type: 'array' 对应 ArrayBuffer 类型 // 5. 提取第一个工作表的数据(可根据需求选择指定工作表) const firstSheetName = workbook.SheetNames[0]; // 获取第一个工作表名称 const worksheet = workbook.Sheets[firstSheetName]; // 获取第一个工作表对象 // 6. 工作表数据 → JSON 格式(常用) // 选项 header: 1 → 转为二维数组(无表头);不写 header → 以第一行为表头转为 JSON const jsonData = XLSX.utils.sheet_to_json(worksheet); // 若需转为二维数组:const arrData = XLSX.utils.sheet_to_aoa(worksheet); // 7. 展示解析结果 localStorage.setItem('readExcelBackData', JSON.stringify(jsonData, null, 2)); if (window.harmonyOS && typeof window.harmonyOS.receiveDataFromH5 === 'function') { // 调用原生注册的方法传递数据(支持字符串、JSON 等) window.harmonyOS.receiveDataFromH5(JSON.stringify(jsonData, null, 2)); // 若传递复杂对象,需先转为 JSON 字符串 // window.jsBridge.receiveDataFromH5(JSON.stringify({name: 'test', age: 18})); } } catch (err) { resultDiv.textContent = `解析错误:${err.message}`; } }); // 工具函数:将 File 对象转为 ArrayBuffer function readFileAsArrayBuffer(file) { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = (e) => resolve(e.target.result); // 读取成功 → 返回 ArrayBuffer reader.onerror = (err) => reject(err); reader.readAsArrayBuffer(file); // 以 ArrayBuffer 格式读取文件 }); } </script> -
定义ArkTS方法供前端页面调用,将解析后的Excel数据传入。示例代码如下:
// 提供原生方法供前端页面调用 传递数据 receiveDataFromH5(data: string) { console.info('receiveDataFromH5 data: ', data); try { this.excelData = JSON.parse(data); } catch (e) { console.error(`JSON.parse data fail: ${e}`); } console.info('receiveDataFromH5 dataObj.length: ', this.excelData.length); console.info('receiveDataFromH5 dataObj first row: ', JSON.stringify(this.excelData[0])); } -
前端页面文件定义为readExcel.html,放在rawfile文件路径下,通过Web组件进行加载。完整示例代码如下:
import { webview } from '@kit.ArkWeb'; import { List } from '@kit.ArkTS'; @Entry @Component struct ExcelCase { webController: webview.WebviewController = new webview.WebviewController(); h5ContentApi: H5ContentApi = new H5ContentApi(this.webController); private uiContext: UIContext = this.getUIContext(); @State row: number = 0; @State excelText: string = ''; aboutToDisappear(): void { this.webController.deleteJavaScriptRegister('harmonyOS'); } hmBridge() { let jsCode = `fileInput.click();`; this.webController.runJavaScript(jsCode, (error, result) => { if (error) { console.error('hmBridge fail:', error); } else { console.info('hmBridge succeed \n' + result); } }); } build() { Column() { Row() { Text('导入Excel:') .fontSize(30) .margin({ right: 20 }) Web({ controller: this.webController, // 加载前端页面文件 src: $rawfile('readExcel.html') }) .geolocationAccess(false) .fileAccess(true) .domStorageAccess(true) .onAlert((event) => { this.uiContext.showAlertDialog({ message: event.message }); return false; }) .onPageEnd(() => { this.hmBridge(); }) .javaScriptProxy({ controller: this.webController, methodList: [ 'receiveDataFromH5', ], asyncMethodList: ['receiveDataFromH5'], name: 'harmonyOS', object: this.h5ContentApi }) .width(45) .height(45) .borderWidth(1) .borderColor(Color.Gray); } .height(50) .margin({ top: 50, left: 50, bottom: 50 }) .alignItems(VerticalAlign.Center) Column() { Button('解析excel数据').onClick(() => { if (this.h5ContentApi.getExcelData()) { this.row = this.h5ContentApi.getExcelData().length; if (this.row > 0) { this.excelText = this.h5ContentApi.getExcelData()[0]; } } }) .fontSize(30) .margin({bottom: 15}) if (this.row > 0) { Text('解析Excel表格行数:' + this.row) .fontSize(15) .margin({bottom: 15}) Text('解析Excel表格,第一行内容:' + JSON.stringify(this.excelText)) .fontSize(15) .margin({bottom: 15}) } } .margin({ left: 50 }) .alignItems(HorizontalAlign.Start); } .width('100%') .height('100%') .alignItems(HorizontalAlign.Start); } } class H5ContentApi { webController?: webview.WebviewController; private excelData: List<Object> = new List<object>(); // 提供原生方法供前端页面调用 传递数据 receiveDataFromH5(data: string) { console.info('receiveDataFromH5 data: ', data); try { this.excelData = JSON.parse(data); } catch (e) { console.error(`JSON.parse data fail: ${e}`); } console.info('receiveDataFromH5 dataObj.length: ', this.excelData.length); console.info('receiveDataFromH5 dataObj first row: ', JSON.stringify(this.excelData[0])); } constructor(controller: webview.WebviewController) { this.webController = controller; } getExcelData() { return this.excelData; } }
更多关于HarmonyOS 鸿蒙Next系统有解析Excel表格的能力吗?需要参考哪一块的文档的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
老师您好,我这边运行您提供的代码也是可以读取数据的,辛苦您提供一下您的运行设备版本号,API版本号便于我们进一步分析定位。
我这边验证版本号为:6.0.0.108,型号代码为:ADY-AL10。
按昨天那个例子搞了一下,运行起来,读不出数据,不知道为啥
这个是demo,能帮忙看一下吗?
总的来说,HarmonyOS是一款非常优秀的操作系统,期待它能在未来带给我们更多惊喜!
验证版本号为:6.0.0.328,型号代码为:LMR-AL00
同问,
HarmonyOS Next支持解析Excel表格。可通过ArkTS调用系统提供的文件管理接口读取Excel文件,使用相关数据处理模块解析内容。具体实现需参考HarmonyOS应用开发文档中“文件管理”与“数据管理”章节,查看对Office格式文件的支持说明。
是的,HarmonyOS Next 系统具备解析 Excel 表格的能力。
核心能力与推荐方案:
- 官方能力支持:HarmonyOS Next 的 ArkTS/ArkUI 框架本身并未内置专门的 Excel 文件解析器。处理这类结构化文档,通常需要借助系统提供的文件管理和数据解析基础能力来组合实现。
- 关键文档参考:您需要重点关注 “文件管理” 和 “数据请求与处理” 相关的开发指南。
- 文件管理:用于从设备存储或沙箱内获取
.xlsx或.xls文件。请参考 《HarmonyOS应用开发文档》中“文件管理” 部分,了解如何安全地访问和读取用户文件。 - 数据处理:获取到文件数据(通常是
ArrayBuffer或Uint8Array格式的二进制流)后,需要对其进行解析。虽然系统未直接提供Excel解析API,但您可以使用纯ArkTS/JavaScript代码,或集成第三方解析库来处理这些二进制数据。
- 文件管理:用于从设备存储或沙箱内获取
关于您提到的三方库限制:
您遇到的 excel_hm 库的行列限制,是其自身实现的问题。在HarmonyOS Next的纯ArkTS环境中,您可以探索其他更成熟的、由社区维护的JavaScript/TypeScript Excel解析库(例如 xlsx 或 sheetjs 等库的核心解析部分),将其适配或作为源码集成到您的HarmonyOS工程中。集成时,需确保该库的代码兼容 ArkTS的严格类型检查和ES6+语法规范。
实现路径建议:
- 使用文件选择器(
@ohos.file.picker)让用户选择Excel文件,或通过文件访问API访问指定路径文件。 - 将文件读取为二进制数据。
- 集成或调用一个纯逻辑的Excel解析库(不依赖Node.js或浏览器DOM环境)来解析该二进制数据,将其转换为JSON等结构化数据。
- 在ArkUI界面中展示和处理这些数据。
总结: HarmonyOS Next 通过其文件系统和数据处理能力,为解析Excel提供了基础支持。具体的解析逻辑需要开发者通过集成适配成熟的第三方JavaScript解析库来实现。请优先查阅官方文档的 “文件管理” 章节以了解文件操作规范,并选择兼容纯ArkTS环境的解析库进行集成。

