HarmonyOS 鸿蒙Next系统有解析Excel表格的能力吗?需要参考哪一块的文档

HarmonyOS 鸿蒙Next系统有解析Excel表格的能力吗?需要参考哪一块的文档 【问题描述】:鸿蒙系统有解析Excel表格的能力吗?需要参考哪一块的文档

【问题现象】:咨询鸿蒙系统中的解析excel表格的功能,需要一份详细的参考文档,需要读取excel每个单元格的函数

【版本信息】:不适用

【复现代码】:不适用

【尝试解决方案】:三方库excel_hm(V1.0.0),这个有行列的限制,不太适用

8 回复

【背景知识】

  1. SheetJS链接来源于xlsx):SheetJS社区版是一个纯粹基于JavaScript的表格处理库,提供经过实战检验的开源解决方案,支持各种表格文件格式,包括Microsoft Excel、WPS Excel、CSV等。该库提供了丰富的API,能够在不需要服务器端支持的情况下,直接在浏览器中进行表格数据的操作。
  2. 前端页面调用应用侧函数:注册应用侧代码有两种方式,一种在Web组件初始化调用,使用javaScriptProxy()接口;另外一种在Web组件初始化完成后调用,使用registerJavaScriptProxy()接口。两种方式都需要和deleteJavaScriptRegister接口配合使用,防止内存泄漏。

【解决方案】

  1. 该方案基于SheetJS库0.20.3版本。在前端html页面通过以下方式引入: <script src="https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js"></script>

  2. 读取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>
    
  3. 定义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]));
    }
    
  4. 前端页面文件定义为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 表格的能力。

核心能力与推荐方案:

  1. 官方能力支持:HarmonyOS Next 的 ArkTS/ArkUI 框架本身并未内置专门的 Excel 文件解析器。处理这类结构化文档,通常需要借助系统提供的文件管理数据解析基础能力来组合实现。
  2. 关键文档参考:您需要重点关注 “文件管理”“数据请求与处理” 相关的开发指南。
    • 文件管理:用于从设备存储或沙箱内获取 .xlsx.xls 文件。请参考 《HarmonyOS应用开发文档》中“文件管理” 部分,了解如何安全地访问和读取用户文件。
    • 数据处理:获取到文件数据(通常是 ArrayBufferUint8Array 格式的二进制流)后,需要对其进行解析。虽然系统未直接提供Excel解析API,但您可以使用纯ArkTS/JavaScript代码,或集成第三方解析库来处理这些二进制数据。

关于您提到的三方库限制:

您遇到的 excel_hm 库的行列限制,是其自身实现的问题。在HarmonyOS Next的纯ArkTS环境中,您可以探索其他更成熟的、由社区维护的JavaScript/TypeScript Excel解析库(例如 xlsxsheetjs 等库的核心解析部分),将其适配或作为源码集成到您的HarmonyOS工程中。集成时,需确保该库的代码兼容 ArkTS的严格类型检查和ES6+语法规范

实现路径建议:

  1. 使用文件选择器@ohos.file.picker)让用户选择Excel文件,或通过文件访问API访问指定路径文件。
  2. 将文件读取为二进制数据。
  3. 集成或调用一个纯逻辑的Excel解析库(不依赖Node.js或浏览器DOM环境)来解析该二进制数据,将其转换为JSON等结构化数据。
  4. 在ArkUI界面中展示和处理这些数据。

总结: HarmonyOS Next 通过其文件系统和数据处理能力,为解析Excel提供了基础支持。具体的解析逻辑需要开发者通过集成适配成熟的第三方JavaScript解析库来实现。请优先查阅官方文档的 “文件管理” 章节以了解文件操作规范,并选择兼容纯ArkTS环境的解析库进行集成。

回到顶部