基于 Emscripten + WebAssembly 实现浏览器操作 Excel

这篇具有很好参考价值的文章主要介绍了基于 Emscripten + WebAssembly 实现浏览器操作 Excel。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、为什么要造这个轮子

【C++】使用WebAssembly在浏览器端操作Excel_wasm文件用什么打开_你的薄荷醇的博客-CSDN博客使用WebAssembly在浏览器端操作Excel_wasm文件用什么打开https://blog.csdn.net/weixin_44305576/article/details/125545900?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168964185516800185863561%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168964185516800185863561&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-4-125545900-null-null.142%5Ev88%5Econtrol_2,239%5Ev2%5Einsert_chatgpt&utm_term=C%2B%2B%20wasm&spm=1018.2226.3001.4187初学 WASM 时,使用的是 C++,当时看到上面这篇博客,只能使用 Web 端操作 xls 文件,而不支持 xlsx 文件,从该文章出发,确实达到了作者在 Web 简单操作 Excel 的目标。而本文仅从小白入门学习的角度出发,重造一个轮子,以更完善支持 Web 端操作 Excel。

二、Linux 开发环境搭建

Rust Wasm Linux开发环境搭建_centos安装rust_余衫马的博客-CSDN博客Linux 下 Rust + Wasm/Wasi 开发_centos安装rusthttps://blog.csdn.net/weixin_47560078/article/details/130559636参照这里的 Linux 开发环境。

三、OpenXLSX

# 参考官网 https://github.com/troldal/OpenXLSX

1、安装CMake

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

# https://cmake.org/download/

# 解压
tar -zxvf cmake-3.27.0.tar.gz

# 进入目录
cd cmake-3.27.0

# 安装
./bootstrap && make -j4 && sudo make install

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

2、下载并编译 OpenXLSX

# clone 代码
git clone https://github.com/troldal/OpenXLSX.git

# 进入目录
cd OpenXLSX

# 新建 build 文件夹
mkdir build

# 进入 build 文件夹
cd build

# 编译
cmake ..

# 构建
cmake --build . --target OpenXLSX --config Release

# root 权限执行安装
cmake --install .

# 自定义安装路径
# cmake --install . --prefix=/home/sam/mylib

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

这里看到红色报错,不影响,实际上 OpenXLSX 库已经安装了,这个报错是说没有其他库。

3、使用 OpenXLSX  静态库

#include <OpenXLSX.hpp>

using namespace OpenXLSX;

int main() {

    XLDocument doc;
    doc.create("Spreadsheet.xlsx");
    auto wks = doc.workbook().worksheet("Sheet1");

    wks.cell("A1").value() = "Hello, OpenXLSX!";

    doc.save();

    return 0;
}

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

这里为方便,我把头文件和静态库放到了项目根目录下,

4、编译运行 c++

# 安装 C/C++ 编译器
# C/C++ 编译器
yum -y install gcc
yum -y install gcc-c++

[root@localhost demo]# gcc hello.c -o hello1
[root@localhost demo]# ./hello1 
Hello,world

[root@localhost demo]# g++ hello.cpp -o hello2
[root@localhost demo]# ./hello2
Hello,world!
# 指定 C++ 17 标准,链接静态库 libOpenXLSX.a 
g++ -std=c++17 main.cpp libOpenXLSX.a -o test_open_xlsx
./test_open_xlsx

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

可以看到,生成 Excel 文件,并且正常打开。

若直接引用头文件, 则 #include <OpenXLSX/OpenXLSX.hpp> ,编译时也需指定静态库的位置。

5、附:Windows 下编译使用 OpenXLSX

 git clone 完成后,进入 OpenXLSX 根目录,新建 build 文件夹,然后执行编译,

mkdir build
cd build
cmake ..

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

cmake --build . --target OpenXLSX --config Release

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

cmake --install .

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

报错 file INSTALL cannot find,但其实已经安装了 OpenXlsx,因为这个报错很明显还没有编译 benchmark.lib,因为我们根本不需要这个库,

# 可以通过 prefix 指定安装路径, 
cmake --install . --prefix=F:\OpenXLSX

 基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

VS2019 中使用,需要配置 包含目录、库目录、库名字,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

踩坑注意,C++语言标准会影响某些标准库,否则会报错 namespace std 没有成员 string_view, 

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

同样的代码,运行成功。 

6、附:封装 OpenXLSX 并导出为 DLL

VS2019 创建 DLL 项目,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

定义 hpp 以及对应的 cpp,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

注意必须包含 pch.h,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

编译配置,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

然后生成, 

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

可以看到,已经导出函数,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

Rust 中使用该 DLL,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

[dependencies]
# 调用外部 dll
libloader = "0.1.4"

main.rs 调用 dll, 

use cstr::cstr;
use libloader::*;
use std::{ffi::CStr,os::raw::c_char};

fn main() {
    get_libfn!("dll/mydll.dll", "println", println, (), s: &str);
    println("你好");

    get_libfn!("dll/mydll.dll", "add", add, usize, a: usize, b: usize);
    println!(" 1 + 2 = {}", add(1, 2));

    get_libfn!("dll/mydll.dll", "print_hello", print_hello, bool);
    print_hello();

    get_libfn!("dll/mydll.dll","return_str", return_str,*const c_char, s: *const c_char);
    let str = unsafe { CStr::from_ptr(return_str(cstr!("你好 ").as_ptr())) };
    print!("out {}", str.to_str().unwrap());

    get_libfn!("dll/Dll1.dll", "testExcel", test_excel, usize);
    test_excel();
}

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

编译运行,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

7、附:Rust 调用 rlib 子库 

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

[workspace]
#以子目录成员方式添加 lib
members = [
    "mydll"
]

 编写 build.rs 指定 rlib 路径,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

fn main() {
    // .rlib 路径
    println!("cargo:rustc-link-search=./target/debug/");
}

构建 rlib 库,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

使用 extern crate ,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

use cstr::cstr;
use libloader::*;
use std::{ffi::CStr,os::raw::c_char};
extern crate mydll;


fn main() {
    get_libfn!("dll/mydll.dll", "println", println, (), s: &str);
    println("你好");

    get_libfn!("dll/mydll.dll", "add", add, usize, a: usize, b: usize);
    println!(" 1 + 2 = {}", add(1, 2));

    get_libfn!("dll/mydll.dll", "print_hello", print_hello, bool);
    print_hello();

    get_libfn!("dll/mydll.dll","return_str", return_str,*const c_char, s: *const c_char);
    let str = unsafe { CStr::from_ptr(return_str(cstr!("你好 ").as_ptr())) };
    print!("out {}", str.to_str().unwrap());

    // get_libfn!("dll/Dll1.dll", "testExcel", test_excel, usize);
    // test_excel();

    mydll::test_excel_dll();

}

编译运行,同样运行成功。

8、附:Rust 调用外部 DLL 的三个库

# 调用外部 dll
# libloader = "0.1.4"
# libloading = "0.7.2"
# dlopen2 = "0.4"

注:rust wasm 不支持 libc,

issue 文档 https://github.com/astonbitecode/j4rs/issues/53

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++

使用 rlib 调用,因为原构建 target 为 x86_64-pc-windows-msvc ,因此不兼容 wasm32-unknown-unknown,

基于 Emscripten + WebAssembly 实现浏览器操作 Excel,wasm,混乱编程宇宙,C/C++移植Web,wasm,excel,c++文章来源地址https://www.toymoban.com/news/detail-637467.html

四、

到了这里,关于基于 Emscripten + WebAssembly 实现浏览器操作 Excel的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows使用selenium操作Edge浏览器实现爬虫

    以前的大部分程序都是操作Chrome,很少有操作Edge,现在以Edge为例。 Selenium本身是无法直接控制浏览器的,不同的浏览器需要不同的驱动程序,Google Chrome需要安装ChromeDriver、Edge需要安装Microsoft Edge WebDriver,其他浏览器也需要安装相应的驱动。 edge://version/ https://developer.micros

    2024年02月03日
    浏览(60)
  • Chrome浏览器如何实现多开操作?(Mac系统为例)

    一切不以解决问题为目的的小技巧都是耍流氓。 在测试过程中,有时间需要验证多个账户登陆的情况,大部分情况下都需要一台电脑上打开多个浏览器,但是如果想都使用Chrome浏览器怎么办呢? 大部分的伙伴都是打开一个隐私窗口,但是隐私窗口很多功能是无法使用的,比

    2024年02月04日
    浏览(46)
  • 基于Flutter的图片浏览器的实现

                                 1.在包结构中创建images包来存放我们用到的图片,在pubspec.yaml中声明路径:     2. 检查虚拟机是否正常运行: 大体流程: 特别注意: 我们创建继承自 State 的 _MyHomePageState 类的用处是 状态管理: State 对象是与 StatefulWidget 相关联的状态的

    2024年02月05日
    浏览(41)
  • 跨境电商如何利用隐擎fox指纹浏览器实现更安全的操作?

    随着全球化的推进,跨境电商已成为现代商业中的重要一环。然而,随之而来的问题是如何确保在跨境电商中进行安全可靠的操作。在这一领域,隐擎fox指纹浏览器(又称防关联浏览器、多开浏览器)正逐渐成为一项关键技术,为跨境电商提供了更高水平的安全性和隐私保护

    2024年02月13日
    浏览(53)
  • 没想到还有这种骚操作~如何使用Golang实现无头浏览器截图?

    在Web开发中,有时需要对网页进行截图,以便进行页面预览、测试等操作。 而使用无头浏览器来实现截图功能,可以避免手动操作的繁琐和不稳定性。 这篇文章将介绍: 使用Golang进行无头浏览器的截图,轻松实现页面预览、测试和模拟用户操作。 这篇文章发完,有朋友在朋

    2024年02月05日
    浏览(52)
  • 【Python小技巧】Python操控Chrome浏览器实现网页打开、切换、关闭(送独家Chrome操作打包类源码、Chrome浏览器Cookie在哪里?)

    本文将为您展示如何通过Python控制浏览器实现网页的打开、页面的切换和关闭的基本操作,另外对于高阶用户,知道Chrome浏览器Cookie在哪里?可以方便方位Cookie从而实现带登录的更多操作。当然,利用本文方法,你也可以提前登录好,这样就可以直接操作,而免去繁琐的登录

    2024年02月16日
    浏览(61)
  • 利用Python+selenium技术,实现浏览器基本操作详解,代码有详细注释

    首先,需要安装selenium库和对应的浏览器驱动程序。以Chrome浏览器为例,可以使用以下命令安装selenium和chromedriver: 然后,需要下载对应版本的chromedriver,并将其添加到环境变量中。下载地址:http://chromedriver.storage.googleapis.com/index.html 不懂安装的,可以参考Chormedriver下载和安

    2024年02月09日
    浏览(58)
  • java + Selenium 实现自动化测试,模拟人手点击操作 chrome 浏览器

    引入 maven 依赖: 安装 chromeDriver:略 SeleniumUtils.java: ChromeDriverUtils.java: 使用示例:

    2024年02月11日
    浏览(60)
  • 一个完整Python实战项目:selenium识别验证码实现自动登录,自动操作浏览器获取某东数据

    最近都没啥时间,很久没更新了。 今天分享一下,如何用selenium识别验证码,实现自动登录以及获取数据。 目标:某东 话不多说直接开始 环境 Python 3.10 Pycharm 模块使用 import random import time from selenium import webdriver import pyautogui import base64 import ddddocr import csv win + R 输入cmd 输入安

    2024年02月04日
    浏览(49)
  • 从零开始学习Python控制开源Selenium库自动化浏览器操作,实现爬虫,自动化测试等功能(一)

    介绍Selenium : Selenium是一个用于自动化浏览器操作的开源工具和库。它最初是为Web应用测试而创建的,但随着时间的推移,它被广泛用于Web数据抓取和网页自动化操作。Selenium 支持多种编程语言,包括Python,Java,C#等。 这里我们主要实现采用Python的方式 Selenium 的主要特点和

    2024年01月22日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包