一、为什么要造这个轮子
【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
# https://cmake.org/download/
# 解压
tar -zxvf cmake-3.27.0.tar.gz
# 进入目录
cd cmake-3.27.0
# 安装
./bootstrap && make -j4 && sudo make install
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
这里看到红色报错,不影响,实际上 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;
}
这里为方便,我把头文件和静态库放到了项目根目录下,
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
可以看到,生成 Excel 文件,并且正常打开。
若直接引用头文件, 则 #include <OpenXLSX/OpenXLSX.hpp> ,编译时也需指定静态库的位置。
5、附:Windows 下编译使用 OpenXLSX
git clone 完成后,进入 OpenXLSX 根目录,新建 build 文件夹,然后执行编译,
mkdir build
cd build
cmake ..
cmake --build . --target OpenXLSX --config Release
cmake --install .
报错 file INSTALL cannot find,但其实已经安装了 OpenXlsx,因为这个报错很明显还没有编译 benchmark.lib,因为我们根本不需要这个库,
# 可以通过 prefix 指定安装路径,
cmake --install . --prefix=F:\OpenXLSX
VS2019 中使用,需要配置 包含目录、库目录、库名字,
踩坑注意,C++语言标准会影响某些标准库,否则会报错 namespace std 没有成员 string_view,
同样的代码,运行成功。
6、附:封装 OpenXLSX 并导出为 DLL
VS2019 创建 DLL 项目,
定义 hpp 以及对应的 cpp,
注意必须包含 pch.h,
编译配置,
然后生成,
可以看到,已经导出函数,
Rust 中使用该 DLL,
[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();
}
编译运行,
7、附:Rust 调用 rlib 子库
[workspace]
#以子目录成员方式添加 lib
members = [
"mydll"
]
编写 build.rs 指定 rlib 路径,
fn main() {
// .rlib 路径
println!("cargo:rustc-link-search=./target/debug/");
}
构建 rlib 库,
使用 extern crate ,
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
使用 rlib 调用,因为原构建 target 为 x86_64-pc-windows-msvc ,因此不兼容 wasm32-unknown-unknown,文章来源:https://www.toymoban.com/news/detail-637467.html
文章来源地址https://www.toymoban.com/news/detail-637467.html
四、
到了这里,关于基于 Emscripten + WebAssembly 实现浏览器操作 Excel的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!