【Laya + TS + JS】SheetJS(js-xlsx)前端生成Excel表格

SheetJS(js-xlsx)介绍

SheetJS 社区版提供了久经考验的开源解决方案,用于从几乎任何复杂的电子表格中提取有用的数据,并生成适用于传统和现代软件的新电子表格。SheetJS是前端操作Excel以及类似的二维表的最佳选择之一,而js-xlsx是它的社区版本。其功能强大,支持xls、xlsx、ods等十几种格式。npm库名称为xlsx,node库也叫node-xlsx,免费版不支持样式调整。

版本选择

纯js即可读取/生成excel,功能强大,支持多种格式,兼容性高。
xlsx.js有core和full两个版本,使用xlsx.core.min.js版本基本上就能满足大部分需求,我在项目中选择了core的版本。
其他详细介绍可以去看官方github:https://github.com/SheetJS/sheetjs。
SheetJS js-xlsx 中文文档:https://github.com/rockboom/SheetJS-docs-zh-CN

兼容性

在这里插入图片描述

SheetJS(js-xlsx)准备

获取xlsx.core.min.js

https://github.com/SheetJS/sheetjs/blob/master/dist/xlsx.core.min.js

通过npm i xlsx 下拉 https://www.npmjs.com/package/xlsx
在这里插入图片描述
xlsx.core.min.js放入bin\libs\min文件夹下,复制改名xlsx.core.js放入bin\libs下,项目设置中勾选添加
在这里插入图片描述

添加xlsx.d.ts声明文件

在这里插入图片描述
index.d.ts复制改名xlsx.d.ts放入libs文件夹下,添加export namespace XLSX{ },即可通过XLSX.xxx进行调用
在这里插入图片描述

SheetJS(js-xlsx)使用

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现3D迷雾效果的关键是使用Shuriken粒子系统和深度纹理。以下是一些步骤: 1. 创建一个LayaAir3D项目并安装LayaAirIDE。 2. 创建一个3D场景并添加相机。 3. 添加一个平面地形和一个角色模型。 4. 创建一个空节点并将模型和地形添加到该节点下。 5. 创建一个Shuriken粒子系统并将其添加到空节点下。 6. 创建一个深度纹理,并将其添加到相机中。 7. 在代码中,使用Shader3D来控制深度纹理和粒子系统的渲染。 下面是一个简单的示例代码: ```typescript import { Laya } from "Laya"; import { Scene3D } from "laya/d3/core/scene/Scene3D"; import { Camera } from "laya/d3/core/Camera"; import { Vector3 } from "laya/d3/math/Vector3"; import { MeshSprite3D } from "laya/d3/core/MeshSprite3D"; import { Sprite3D } from "laya/d3/core/Sprite3D"; import { ShuriKenParticle3D } from "laya/d3/core/particleShuriKen/ShuriKenParticle3D"; import { Shader3D } from "laya/d3/shader/Shader3D"; import { ShaderDefine } from "laya/d3/shader/ShaderDefine"; import { ShaderData } from "laya/d3/shader/ShaderData"; import { ShaderPass } from "laya/d3/shader/ShaderPass"; import { BaseTexture } from "laya/resource/BaseTexture"; import { RenderTexture } from "laya/resource/RenderTexture"; import { TextureFormat } from "laya/resource/TextureFormat"; export class Fog3D { private _scene: Scene3D; private _camera: Camera; private _depthTexture: RenderTexture; private _depthShader: Shader3D; private _depthPass: ShaderPass; private _fogShader: Shader3D; private _fogPass: ShaderPass; private _depthData: ShaderData; private _fogData: ShaderData; private _fogTexture: BaseTexture; private _particles: ShuriKenParticle3D[]; constructor(scene: Scene3D, camera: Camera) { this._scene = scene; this._camera = camera; // 创建深度纹理 this._depthTexture = new RenderTexture(1024, 1024, TextureFormat.R8G8B8A8, BaseTexture.FORMAT_R8G8B8A8, true); this._camera.depthTextureMode |= Camera.DEPTHTEXTUREDEPTH; // 创建深度渲染Shader this._depthShader = Shader3D.find("DEPTH"); if (!this._depthShader) { this._depthShader = Shader3D.add("DEPTH"); this._depthShader.addSubShaderPass(ShaderPassNames.depth); } this._depthPass = this._depthShader.getSubShaderPass(ShaderPassNames.depth); // 创建迷雾渲染Shader this._fogShader = Shader3D.find("FOG"); if (!this._fogShader) { this._fogShader = Shader3D.add("FOG"); this._fogShader.addSubShaderPass(ShaderPassNames.fog); } this._fogPass = this._fogShader.getSubShaderPass(ShaderPassNames.fog); // 创建ShaderData this._depthData = new ShaderData(); this._fogData = new ShaderData(); // 获取粒子系统 this._particles = []; this._scene.traverse((node: Sprite3D) => { if (node instanceof ShuriKenParticle3D) { this._particles.push(node); } }); } public render() { // 渲染深度纹理 this._depthData.setMatrix4x4(Shader3D.WORLDVIEWPROJECT_MATRIX, this._camera.projectionViewMatrix); this._scene.render(this._depthTexture, this._camera, true, null, false, this._depthPass, this._depthData); // 设置ShaderData this._fogData.setTexture(Fog3D.FogTexture, this._fogTexture); this._fogData.setTexture(Fog3D.DepthTexture, this._depthTexture); this._fogData.setVector3(Fog3D.CameraPosition, this._camera.transform.position); // 渲染粒子系统 for (let i = 0, n = this._particles.length; i < n; i++) { let particle = this._particles[i]; particle.renderer.sharedMaterial.setShaderPass(this._fogPass); particle.renderer.sharedMaterial.setShaderData(this._fogData); } } public dispose() { this._depthTexture.destroy(); this._depthData.destroy(); this._fogData.destroy(); } static FogTexture: number = Shader3D.propertyNameToID("u_FogTexture"); static DepthTexture: number = Shader3D.propertyNameToID("u_DepthTexture"); static CameraPosition: number = Shader3D.propertyNameToID("u_CameraPosition"); } class ShaderPassNames { static depth: string = "DEPTH"; static fog: string = "FOG"; } // 初始化 Laya3D.init(0, 0, true); Laya.stage.scaleMode = Laya.Stage.SCALE_FULL; Laya.stage.screenMode = Laya.Stage.SCREEN_NONE; // 创建场景 let scene = Laya.stage.addChild(new Scene3D()); // 创建相机 let camera = new Camera(0, 0.1, 100); camera.transform.translate(new Vector3(0, 1, -5)); camera.transform.rotate(new Vector3(0, 0, 0), true, false); camera.clearColor = null; scene.addChild(camera); // 创建地形 let terrain = MeshSprite3D.createFromMesh(Laya.PrimitiveMesh.createPlane(100, 100, 100, 100)); terrain.transform.translate(new Vector3(0, 0, 0)); scene.addChild(terrain); // 创建角色 let character = Sprite3D.load("res/character.lh"); character.once(Laya.Event.HIERARCHY_LOADED, null, () => { scene.addChild(character); }); // 创建迷雾 let fog = new Fog3D(scene, camera); fog.FogTexture = Laya.loader.getRes("res/fog.png"); fog.FogTexture.wrapModeU = Laya.BaseTexture.WARPMODE_CLAMP; fog.FogTexture.wrapModeV = Laya.BaseTexture.WARPMODE_CLAMP; fog.FogTexture.filterMode = Laya.BaseTexture.FILTERMODE_BILINEAR; fog.FogTexture.anisoLevel = 16; // 渲染 Laya.timer.frameLoop(1, null, () => { character.transform.translate(new Vector3(0, 0, 0.01)); fog.render(); }); // 加载资源 Laya.loader.create([ { url: "res/character.lh", type: Laya.Loader.HIERARCHY }, { url: "res/fog.png", type: Laya.Loader.TEXTURE2D } ], Laya.Handler.create(null, () => { console.log("资源加载完成!"); })); ``` 在上面的示例代码中,我们使用Shader3D来控制深度纹理和粒子系统的渲染。我们创建了两个Shader:DEPTH和FOG,以及相应的ShaderPass。DEPTH Shader用于渲染深度纹理,FOG Shader用于渲染迷雾效果。我们还使用ShaderData来传递数据到Shader中,例如深度纹理、迷雾纹理和相机位置。最后,我们使用Shuriken粒子系统来实现迷雾效果。 在代码中,我们使用了一个Fog3D类来封装迷雾效果。在构造函数中,我们创建了深度纹理和Shader,并获取了粒子系统。在render()方法中,我们首先渲染深度纹理,然后设置ShaderData,并渲染粒子系统。在dispose()方法中,我们释放了深度纹理和ShaderData。 我们还封装了一些常量,例如FogTexture、DepthTexture和CameraPosition,它们用于传递数据到Shader中。 最后,我们创建了一个场景、相机、地形、角色和迷雾,并将它们渲染到屏幕上。注意,我们需要先加载资源,然后才能创建迷雾。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JIQIU.YANG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值