dw和vs做网站/网络广告推广方式

dw和vs做网站,网络广告推广方式,济南地铁建设,工业设计网站象需求要求:业务人员有个非常复杂得excel表格,各种表头等,但是模板是固定得。当然也可以实现在excel上搞出各种表格,但是不如直接用已有模板替换其中要动态得内容方便,这里我们用到CSDN得 xlsx-populate 插件。 实列中我…

需求要求:业务人员有个非常复杂得excel表格,各种表头等,但是模板是固定得。当然也可以实现在excel上搞出各种表格,但是不如直接用已有模板替换其中要动态得内容方便,这里我们用到CSDN得 xlsx-populate  插件。

实列中我们使用node做一个服务

一、首先创建一个空白文件夹  my-xlsx-populate

1、创建index.html文件

这里得html主要用来点击操作作用

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Excel 文件处理</title><style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f4f4f9;}button {padding: 10px 20px;background-color: #007BFF;color: #fff;border: none;border-radius: 4px;cursor: pointer;}button:hover {background-color: #0056b3;}</style>
</head><body><button id="processButton">处理文件</button><script>const processButton = document.getElementById('processButton');processButton.addEventListener('click', async () => {try {const response = await fetch('/process', {method: 'POST',headers: {'Content-Type': 'application/json'}});if (response.ok) {const blob = await response.blob();const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = '修改后.xlsx';a.click();window.URL.revokeObjectURL(url);} else {const errorText = await response.text();alert(`处理文件时出错: ${errorText}`);}} catch (error) {alert(`网络请求出错: ${error.message}`);}});</script>
</body></html>

1、创建server.js文件

const express = require('express');
const XlsxPopulate = require('xlsx-populate');
const path = require('path');
const fs = require('fs');const app = express();// 检查 uploads 目录是否存在,不存在则创建
const uploadDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadDir)) {fs.mkdirSync(uploadDir);
}// 处理静态文件,使得前端页面可以被访问
app.use(express.static(__dirname));// 处理文件处理请求
app.post('/process', async (req, res) => {try {// 获取 uploads 目录下的所有文件const files = fs.readdirSync(uploadDir);if (files.length === 0) {console.error('uploads 目录中没有文件');return res.status(400).send('uploads 目录中没有文件');}// 选择第一个文件进行处理const selectedFile = path.join(uploadDir, files[0]);console.log('选定文件:', selectedFile);// 检查文件扩展名const fileExtension = path.extname(selectedFile).toLowerCase();if (fileExtension !== '.xlsx') {console.error('文件扩展名不正确:', fileExtension);return res.status(400).send('仅支持 .xlsx 文件');}try {// 检查文件是否可读fs.accessSync(selectedFile, fs.constants.R_OK);// 读取 Excel 文件const workbook = await XlsxPopulate.fromFileAsync(selectedFile);console.log('成功读取文件:', selectedFile);const sheet = workbook.sheet(0);// 获取第一行const firstRow = sheet.row(1);// 示例修改:在 A1 单元格写入特定文本sheet.cell('B1').value('此文件已被处理');sheet.cell('F9').value(22.00);sheet.cell('C9').value('测试文件内容替换');// 生成修改后的文件路径const outputPath = path.join(__dirname, 'output.xlsx');await workbook.toFileAsync(outputPath);// 检查修改后的文件是否存在if (!fs.existsSync(outputPath)) {console.error('修改后的文件未生成:', outputPath);return res.status(500).send('修改后的文件未生成');}// 对文件名进行严格编码const originalFileName = '修改后.xlsx';const encodedFileName = encodeURIComponent(originalFileName).replace(/'/g, '%27');// 设置响应头res.setHeader('Content-Disposition', `attachment; filename="${encodedFileName}"`);res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');// 发送修改后的文件给客户端下载res.download(outputPath, originalFileName, async (err) => {if (err) {console.error('下载文件时出错:', err);res.status(500).send('下载文件时出错');}try {// 删除临时文件if (fs.existsSync(selectedFile)) {fs.unlinkSync(selectedFile);}if (fs.existsSync(outputPath)) {fs.unlinkSync(outputPath);}} catch (unlinkErr) {console.error('删除临时文件时出错:', unlinkErr);}});} catch (parseError) {console.error('解析 Excel 文件时出错:', parseError.message);res.status(500).send(`解析 Excel 文件时出错,请检查文件是否损坏或格式是否正确: ${parseError.message}`);}} catch (error) {console.error('处理文件时出错:', error.message);res.status(500).send(`处理文件时出错: ${error.message}`);}
});// 启动服务器
const port = 3000;
app.listen(port, () => {console.log(`服务器运行在端口 ${port}`);
});

3.my-xlsx-populate目录中下创建uploads文件里面存放 .xlxs文件模板

3.my-xlsx-populate目录中右键打开CMD

安装依赖:

npm init -y
npm install express multer xlsx-populate
具体结构:

启动服务器:运行 server.js 文件

node server.js

 打开页面

在浏览器中访问 http://localhost:3000

运行后下载文件打开:

server.js中代码对应exce代码中得坐标

下面我们会详细介绍一下 xlsx-populate ,这做效果演示

下载修改完得excel文件

xlsx-populate介绍

xlsx-populate 主要是为 Node.js 环境设计的,因为它依赖于一些仅在 Node.js 环境中可用的功能和库,比如文件系统访问(fs 模块)等。这意味着它不能直接在浏览器端的 JavaScript 中使用,因为浏览器环境缺乏对本地文件系统的直接访问权限,并且存在安全限制。

生产环境中Linux中可以使用pm2来运行server.js文件保持node运行。

主要功能

  • 读写Excel文件:可以打开现有的 .xlsx 文件进行编辑或创建新的文件。
  • 数据处理:支持对单元格的数据进行各种操作,如设置值、公式计算等。
  • 格式调整:能够修改单元格的样式,包括字体大小、颜色、背景色等。
  • 图片插入:支持在工作表中添加图片。
  • 图表支持:可以在工作表内生成图表。

  1. 示例修改:在单元格写入特定文本
            sheet.cell('B1').value('此文件已被处理');sheet.cell('F9').value(22.00);sheet.cell('C9').value('测试文件内容替换');   

  

  2. 设置公式
sheet.cell('D1').formula('SUM(F9:F10)');
3.设置样式
sheet.cell('B1').style({fontColor: 'FF0000', // 红色bold: true,horizontalAlignment: 'center'
});

3.插入图片
const fs = require('fs');
const imageBuffer = fs.readFileSync('path/to/image.png');sheet.addImage({image: imageBuffer,type: 'picture',position: {x: 5, // 列号y: 5, // 行号}
});

4.添加或删除行/列
// 添加一行在第3行的位置
sheet.insertRow(3);// 删除第4行
sheet.deleteRow(4);

5.设置列宽和行高
// 设置列宽
sheet.column('C').width(20);// 设置行高
sheet.row(9).height(30);

更多高级和实用的操作方法:

6. 数据验证(Data Validation)

你可以为单元格添加数据验证规则。

sheet.cell('A1').dataValidation({type: 'list',allowBlank: true,formula1: '"Apple,Banana,Cherry"'
});
7.条件格式(Conditional Formatting)

为单元格或范围设置条件格式。

sheet.range('A1:A10').conditionalFormat({type: 'cellIs',operator: 'greaterThan',formula: 50,style: {fill: 'FFFF00' // 黄色背景}
});

8.添加图表

可以在工作表中插入图表。

sheet.addChart({type: 'column', // 图表类型range: sheet.range('A1:B10'), // 数据范围position: {x: 12, // 列号y: 12  // 行号},width: 400,height: 300
});
9. 复制和移动区域

可以复制或移动指定的区域。

// 复制 A1:B2 区域到 C3
sheet.range('A1:B2').copyTo(sheet.range('C3'));// 移动 A1:B2 区域到 D4
sheet.range('A1:B2').moveTo(sheet.range('D4'));
10.获取单元格值和属性

获取特定单元格的值、公式或其他属性。

const value = sheet.cell('A1').value(); // 获取单元格值
const formula = sheet.cell('A1').formula(); // 获取单元格公式
const style = sheet.cell('A1').style(); // 获取单元格样式
11.批量操作

使用批量操作可以提高性能,尤其是在处理大量数据时。

sheet.batch(() => {for (let i = 1; i <= 100; i++) {sheet.cell(`A${i}`).value(i);}
});
12.设置页眉和页脚、

可以为工作表设置页眉和页脚。

sheet.headerFooter({oddHeader: '&C&"Arial,Bold"Page &P of &N',oddFooter: '&L&"Arial,Italic"Confidential&R&D&T'
});
13. 设置打印区域

可以指定打印区域和打印标题行/列。

sheet.printArea('A1:D20'); // 设置打印区域
sheet.printTitles({rows: '1:1', // 设置第一行为标题行columns: 'A:A' // 设置第一列为标题列
});
14.保存到流(Stream)

可以将修改后的文件保存到一个流中,而不是直接保存到文件系统。

const fs = require('fs');
const writeStream = fs.createWriteStream('output.xlsx');workbook.toStream().pipe(writeStream);
15.冻结窗格

你可以设置工作表中的冻结窗格,方便查看大量数据时固定某些行或列。

sheet.freezePanes('B2'); // 冻结 B2 左上方的所有单元格
16.隐藏行列

可以隐藏指定的行或列。

// 隐藏第3行
sheet.row(3).hidden(true);// 隐藏第C列
sheet.column('C').hidden(true);
17.保护工作表

可以设置工作表的保护功能,防止未经授权的修改。

sheet.protect({password: 'your-password',selectLockedCells: false,selectUnlockedCells: true
});
18. 设置超链接

可以在单元格中插入超链接。

sheet.cell('A1').hyperlink('https://www.example.com');
sheet.cell('A1').value('点击这里访问 Example.com');
19.设置注释

可以为单元格添加注释。

sheet.cell('A1').comment({text: '这是一个示例注释',author: '作者名字'
});
20. 批量设置样式

可以通过 range 方法对多个单元格应用相同的样式。

sheet.range('A1:C3').style({fontColor: '0000FF', // 蓝色字体bold: true,horizontalAlignment: 'center'
});
21.设置单元格类型

可以设置单元格的数据类型(如日期、数字、文本等)。

sheet.cell('A1').type('date'); // 设置单元格为日期类型
sheet.cell('A1').value(new Date()); // 设置当前日期sheet.cell('B1').type('number'); // 设置单元格为数字类型
sheet.cell('B1').value(12345); // 设置数值
22.导入和导出 JSON 数据

可以从 JSON 数据导入到 Excel 文件,或者将 Excel 文件导出为 JSON 数据。

// 导入 JSON 数据到 A1 开始的区域
const jsonData = [{ "Name": "John", "Age": 30, "City": "New York" },{ "Name": "Anna", "Age": 22, "City": "London" }
];
sheet.importData(jsonData, 'A1');// 将 A1 开始的区域导出为 JSON 数据
const exportedData = sheet.exportData('A1:C3');
console.log(exportedData);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/70181.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Coze扣子新功能详解

今晚(2025-01-24)扣子再次进行更新 主要更新内容&#xff1a; 搭建小程序和 H5 用户界面时&#xff0c;支持使用音频组件播放音频内容 数据库操作体验提升 界面优化&#xff1a;对数据库详情界面进行了重新设计&#xff0c;并将工作流运行数据库的测试数据位置从原工作流底…

汇能感知的光谱相机/模块产品有哪些?

CM020A 分辨率&#xff1a;1600H1200V 光谱范围&#xff1a;350~950nm 光谱分辨率&#xff1a;1nm 接口&#xff1a;USB2.0 帧率&#xff1a;16001200 (6帧) 输出格式&#xff1a;Raw 8bit FOV&#xff1a;D73.5H58.8V44.1 相机尺寸&#xff1a;505055mm VM02S10 分辨率…

Ollama 本地GUI客户端:为DeepSeek用户量身定制的智能模型管理与交互工具

Ollama 本地GUI客户端&#xff1a;为DeepSeek用户量身定制的智能模型管理与交互工具 相关资源文件已经打包成EXE文件&#xff0c;可双击直接运行程序&#xff0c;且文章末尾已附上相关源码&#xff0c;以供大家学习交流&#xff0c;博主主页还有更多Python相关程序案例&#xf…

菜鸟之路Day15一一IO流(一)

菜鸟之路Day15一一IO流&#xff08;一&#xff09; 作者&#xff1a;blue 时间&#xff1a;2025.2.8 文章目录 菜鸟之路Day15一一IO流&#xff08;一&#xff09;0.概述1.初识IO流1.1.什么是IO流&#xff1f;1.2.IO流的作用1.3.IO流的分类 2.IO流的体系结构3.字节输出流的基本…

idea拉取合并后的分支

文章目录 远程拉取代码.更新本地库拉取后本地库就有了合并后的代码 远程拉取代码.更新本地库 拉取后本地库就有了合并后的代码

1-18 GIT设置公钥

1-1 GIT如何设置公钥 1.0 注册账号 这个应该都是会的&#xff0c;就不做介绍了 2.0 设置公钥 PWD的作用是查看文件的路径 ssh-keygen -t ed25519 -C "Gitee SSH Key" 读取公钥文件&#xff1a; cat ~/.ssh/id_ed25519.pub 3.0 测试 查看绑定的用户名和邮箱&#xff1…

《机器学习数学基础》补充资料:求解线性方程组的克拉默法则

《机器学习数学基础》中并没有将解线性方程组作为重点&#xff0c;只是在第2章2.4.2节做了比较完整的概述。这是因为&#xff0c;如果用程序求解线性方程组&#xff0c;相对于高等数学教材中强调的手工求解&#xff0c;要简单得多了。 本文是关于线性方程组的拓展&#xff0c;供…

Jenkins介绍

什么是Jenkins Jenkins 是一个开源的自动化服务器&#xff0c;主要用于持续集成和持续交付&#xff08;CI/CD&#xff09;。它帮助开发团队自动化构建、测试和部署软件&#xff0c;从而提高开发效率和软件质量。 如果一个系统是前后端分离的开发模式&#xff0c;在集成阶段会需…

嵌入式音视频开发(二)ffmpeg音视频同步

系列文章目录 嵌入式音视频开发&#xff08;零&#xff09;移植ffmpeg及推流测试 嵌入式音视频开发&#xff08;一&#xff09;ffmpeg框架及内核解析 嵌入式音视频开发&#xff08;二&#xff09;ffmpeg音视频同步 嵌入式音视频开发&#xff08;三&#xff09;直播协议及编码器…

iOS App的启动与优化

App的启动流程 App启动分为冷启动和热启动 冷启动&#xff1a;从0开始启动App热启动&#xff1a;App已经在内存中&#xff0c;但是后台还挂着&#xff0c;再次点击图标启动App。 一般对App启动的优化都是针对冷启动。 App冷启动可分为三个阶段&#xff1a; dyld&#xff1a…

DDoS技术解析

这里是Themberfue 今天我们不聊别的&#xff0c;我们聊聊著名的网络攻击手段之一的 DDoS&#xff0c;看看其背后的技术细节。 DoS 了解 DDoS 前&#xff0c;先来讲讲 DoS 是什么&#xff0c;此 DoS 而不是 DOS 操作系统啊。1996年9月6日&#xff0c;世界第三古老的网络服务提供…

docker安装kafka,并通过springboot快速集成kafka

目录 一、docker安装和配置Kafka 1.拉取 Zookeeper 的 Docker 镜像 2.运行 Zookeeper 容器 3.拉取 Kafka 的 Docker 镜像 4.运行 Kafka 容器 5.下载 Kafdrop 6.运行 Kafdrop 7.如果docker pull wurstmeister/zookeeper或docker pull wurstmeister/kafka下载很慢&#x…

C++ 与 Java 的对比分析:除法运算中的错误处理

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Java 文章目录 &#x1f4af;前言&#x1f4af;C中的除法错误处理&#x1f4af;Java中的除法错误处理&#x1f4af;C与Java错误处理的对比&#x1f4af;错误处理的优化和实践&#x1f4af;小结 &#x1f4af;前言 在…

LLM之循环神经网络(RNN)

在人工智能的领域中&#xff0c;神经网络是推动技术发展的核心力量。今天&#xff0c;让我们深入探讨循环神经网络&#xff08;RNN&#xff09; 一、神经网络基础 &#xff08;1&#xff09;什么是神经网络 神经网络&#xff0c;又称人工神经网络&#xff0c;其设计灵感源于人…

SQL sever数据导入导出实验

1.创建数据库TCP-H &#xff08;1&#xff09;右键“数据库”&#xff0c;点击“新建数据库”即可 &#xff08;2&#xff09;用sql语言创建&#xff0c;此处以创建数据库DB_test为例&#xff0c;代码如下&#xff1a; use master;go--检查在当前服务器系统中的所有数据里面…

让编程变成一种享受-明基RD320U显示器

引言 作为一名有着多年JAVA开发经验的从业者&#xff0c;在工作过程中&#xff0c;显示器的重要性不言而喻。它不仅是我们与代码交互的窗口&#xff0c;更是影响工作效率和体验的关键因素。在多年的编程生涯中&#xff0c;我遇到过各种各样的问题。比如&#xff0c;在进行代码…

计算机网络(涵盖OSI,TCP/IP,交换机,路由器,局域网)

一、网络通信基础 &#xff08;一&#xff09;网络通信的概念 网络通信是指终端设备之间通过计算机网络进行的信息传递与交流。它类似于现实生活中的物品传递过程&#xff1a;数据&#xff08;物品&#xff09;被封装成报文&#xff08;包裹&#xff09;&#xff0c;通过网络…

✨2.快速了解HTML5的标签类型

✨✨HTML5 的标签类型丰富多样&#xff0c;每种类型都有其独特的功能和用途&#xff0c;以下是一些常见的 HTML5 标签类型介绍&#xff1a; &#x1f98b;结构标签 &#x1faad;<html>&#xff1a;它是 HTML 文档的根标签&#xff0c;所有其他标签都包含在这个标签内&am…

eNSP防火墙综合实验

一、实验拓扑 二、ip和安全区域配置 1、防火墙ip和安全区域配置 新建两个安全区域 ip配置 Client1 Client2 电信DNS 百度web-1 联通DNS 百度web-2 R2 R1 三、DNS透明代理相关配置 1、导入运营商地址库 2、新建链路接口 3、配置真实DNS服务器 4、创建虚拟DNS服务器 5、配置D…

Linux 配置交换空间(Swap)解决内存不足

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …