ShapeCrawler:.NET开发者的PPTX操控魔法

news2025/3/30 20:41:58

引言

在当今的软件开发领域,随着数据可视化和信息展示需求的不断增长,处理 PPTX 文件的场景日益频繁。无论是自动化生成报告、批量制作演示文稿,还是对现有 PPT 进行内容更新与格式调整,开发者都需要高效的工具来完成这些任务。传统的方法往往依赖于 Microsoft Office 等办公软件,但这种方式在一些场景下存在局限性,例如在服务器端环境中,可能无法安装完整的 Office 套件;而且手动操作效率低下,难以满足大规模、自动化处理的需求。

这时,ShapeCrawler 作为一款强大的用于处理 PPTX 文件的开源.NET SDK 应运而生,它能够让开发者在.NET 应用程序中轻松实现对 PPTX 文件的各种操作,从创建新的演示文稿,到编辑幻灯片中的形状、文本,再到插入图片、图表等元素,都可以通过简洁的 API 完成。无需依赖 Microsoft Office,即可实现高效、灵活的 PPTX 文件处理,大大提升开发效率和应用的可扩展性 ,接下来就让我们一起深入了解 ShapeCrawler 的神奇之处吧。

ShapeCrawler 是什么

ShapeCrawler 是一款用于处理 PPTX 文件的开源.NET SDK,基于 Open XML SDK 开发,这使得它能够深入到 PPTX 文件的底层结构,对文件内容进行高效操作 。其一大显著优势在于,开发者无需在开发或运行环境中安装 Microsoft Office,就可以对 PPTX 文件进行各种操作,这极大地拓宽了应用场景,特别是在服务器端环境或者一些没有安装 Office 软件的设备上,它能够轻松实现 PPTX 文件的处理任务,避免了因依赖 Office 软件而带来的诸多限制。

ShapeCrawler 为开发者提供了一组简单易用的 API,通过这些 API,开发者可以方便地遍历、查询、修改和创建 PowerPoint 演示文稿中的各种元素。无论是基本的文本编辑,如设置文本内容、字体格式、颜色等;还是复杂的形状操作,比如添加、删除形状,调整形状的大小、位置、填充颜色、边框样式;亦或是对图像、图表等元素的处理,像插入图片、更新图片,创建各种类型的图表并设置图表数据、样式等,ShapeCrawler 都能轻松胜任。它将原本繁琐的 PPTX 文件操作流程进行了高度封装,使得开发者可以用较少的代码量实现丰富的功能,大大提高了开发效率 。例如,在传统方式下,若要在 PPT 中插入一张图片并设置其位置和大小,可能需要编写大量复杂的代码来与 Office 软件进行交互,而使用 ShapeCrawler,只需几行简单的代码即可完成 。

核心功能速览

创建与打开演示文稿

  • 创建新演示文稿:使用Presentation类的构造函数即可初始化一个全新的演示文稿对象,随后还能通过Slides.Add()方法向其中添加幻灯片。例如:
using ShapeCrawler;
Presentation presentation = new Presentation();
Slide slide = presentation.Slides.Add();
presentation.Save("new_presentation.pptx");
  • 打开现有文稿:只需在创建Presentation对象时传入现有 PPTX 文件的路径,就能轻松打开并对其进行后续操作,像这样:
using ShapeCrawler;
Presentation presentation = new Presentation("existing_presentation.pptx");

形状操作

  • 添加形状:支持添加多种形状,如矩形、圆形、文本框等。以添加矩形为例:
Slide slide = presentation.Slides[0];
var rectangle = slide.Shapes.AddRectangle(x: 100, y: 100, width: 200, height: 100);
  • 修改形状属性:能够对形状的位置、大小、填充颜色、边框样式等属性进行修改。比如修改矩形的填充颜色:
rectangle.Fill.Color.RGB = System.Drawing.Color.Red;
  • 删除形状:通过调用形状集合的Remove方法,可删除指定形状。假设要删除前面创建的矩形:
slide.Shapes.Remove(rectangle);

文本处理

  • 获取文本:从指定形状的TextFrame中获取文本内容。例如获取名为 “TextBox1” 形状中的文本:
var shape = slide.Shapes.GetByName("TextBox1");
string text = shape.TextFrame.Text;
  • 设置文本:直接对TextFrame的Text属性赋值,即可设置形状中的文本内容。如将文本设置为 “Hello, ShapeCrawler!”:
shape.TextFrame.Text = "Hello, ShapeCrawler!";
  • 替换文本:通过遍历幻灯片中的所有文本框,对符合条件的文本进行替换操作。例如将所有文本框中的 “old text” 替换为 “new text”:
foreach (var slide in presentation.Slides)
{
    foreach (var shape in slide.Shapes)
    {
        if (shape.TextFrame != null)
        {
            shape.TextFrame.Text = shape.TextFrame.Text.Replace("old text", "new text");
        }
    }
}

图片处理

  • 添加图片:先将图片文件以流的形式读取,再使用AddPicture方法将其插入到幻灯片中,并可设置图片的位置和大小。示例代码如下:
string imagePath = "path/to/your/image.jpg";
using (var imageStream = new FileStream(imagePath, FileMode.Open))
{
    var imageShape = slide.Shapes.AddPicture(imageStream);
    imageShape.X = 150;
    imageShape.Y = 150;
    imageShape.Width = 300;
    imageShape.Height = 200;
}
  • 更新图片:对于已存在的图片,可以通过获取图片对象的Image属性,调用Update方法来更新图片内容。假设要更新名为 “Picture1” 的图片:
var picture = slide.Shapes.GetByName<IPicture>("Picture1");
picture.Image.Update("new_image_path.jpg");

图表创建

ShapeCrawler 支持创建多种类型的图表,如柱状图、折线图、饼图等。以创建柱状图为例,代码如下:

var chart = slide.Shapes.AddChart(ChartType.BarClustered, x: 100, y: 100, width: 500, height: 300);
ChartData chartData = new ChartData();
chartData.Series.Add("Series 1", new[] { 10, 20, 30, 40 });
chartData.Categories = new[] { "Category 1", "Category 2", "Category 3", "Category 4" };
chart.ChartData = chartData;
chart.Title.Text = "Sample Chart";

通过以上这些核心功能,开发者可以灵活地对 PPTX 文件进行全方位的操作 ,满足各种复杂的业务需求。无论是简单的文本替换,还是复杂的图表创建与图片处理,ShapeCrawler 都能提供简洁高效的实现方式 。

上手实战:基础操作示例

安装 ShapeCrawler 库

在开始使用 ShapeCrawler 进行 PPTX 文件操作之前,首先需要将其安装到项目中。对于.NET 项目,我们可以通过 NuGet 包管理器来完成安装。打开 Visual Studio,在 “解决方案资源管理器” 中右键点击项目名称,选择 “管理 NuGet 程序包” 。在弹出的窗口中,切换到 “浏览” 选项卡,在搜索框中输入 “ShapeCrawler”,找到对应的包后点击 “安装” 按钮,按照提示完成安装过程 。

如果使用.NET CLI 命令行工具,也可以通过以下命令进行安装:

dotnet add package ShapeCrawler

安装完成后,即可在项目中使用 ShapeCrawler 的相关功能 。

创建新的 PPTX 文件

下面我们通过一段完整的代码示例来展示如何使用 ShapeCrawler 创建一个新的 PPTX 文件,并在其中添加幻灯片、形状以及设置文本:

using ShapeCrawler;
using System;

class Program
{
    static void Main()
    {
        // 创建Presentation实例,表示一个新的演示文稿
        Presentation presentation = new Presentation();

        // 向演示文稿中添加一张幻灯片
        Slide slide = presentation.Slides.Add();

        // 在幻灯片上添加一个文本框形状
        var textShape = slide.Shapes.AddTextBox();

        // 设置文本框中的文本内容
        textShape.Text = "这是使用ShapeCrawler创建的PPTX文件";

        // 设置文本框的位置和大小(这里简单设置,可根据需求调整)
        textShape.X = 100;
        textShape.Y = 100;
        textShape.Width = 300;
        textShape.Height = 100;

        // 保存演示文稿为PPTX文件
        string filePath = "newPresentation.pptx";
        presentation.Save(filePath);

        Console.WriteLine($"已成功创建文件:{filePath}");
    }
}

在这段代码中,首先通过Presentation类的构造函数创建了一个新的演示文稿实例 。然后使用presentation.Slides.Add()方法添加了一张幻灯片 。接着,通过slide.Shapes.AddTextBox()方法在幻灯片上添加了一个文本框形状,并通过textShape.Text属性设置了文本框中的文本内容 。之后,设置了文本框的位置(X和Y属性)和大小(Width和Height属性) 。最后,使用presentation.Save(filePath)方法将演示文稿保存为指定路径的 PPTX 文件 。运行这段代码后,即可在指定路径下生成一个包含文本的 PPTX 文件 。

打开并读取 PPTX 文件内容

要打开并读取现有 PPTX 文件的内容,可以参考以下代码示例:

using ShapeCrawler;
using System;

class Program
{
    static void Main()
    {
        // 打开现有PPTX文件
        string filePath = "existingPresentation.pptx";
        Presentation presentation = new Presentation(filePath);

        // 获取第一张幻灯片
        Slide firstSlide = presentation.Slides[0];

        // 遍历幻灯片上的所有形状
        foreach (var shape in firstSlide.Shapes)
        {
            // 判断形状是否包含文本框
            if (shape.TextFrame != null)
            {
                // 获取形状中的文本内容
                string text = shape.TextFrame.Text;
                Console.WriteLine($"形状中的文本:{text}");
            }
        }

        // 关闭演示文稿(虽然在.NET中一般会自动释放资源,但显式关闭更规范)
        presentation.Close();
    }
}

上述代码中,首先通过Presentation类的构造函数传入现有 PPTX 文件的路径,打开了指定的演示文稿 。然后通过索引presentation.Slides[0]获取了第一张幻灯片 。接着,使用foreach循环遍历幻灯片上的所有形状 。在循环中,通过判断shape.TextFrame != null来确定形状是否包含文本框,如果包含,则通过shape.TextFrame.Text获取形状中的文本内容并输出 。最后,调用presentation.Close()方法关闭演示文稿,释放相关资源 。

修改 PPTX 文件内容

以下是一些常见的修改 PPTX 文件内容的操作示例:

  1. 修改文本:假设我们要将指定形状中的文本进行修改:
using ShapeCrawler;
using System;

class Program
{
    static void Main()
    {
        string filePath = "presentationToModify.pptx";
        Presentation presentation = new Presentation(filePath);

        Slide firstSlide = presentation.Slides[0];
        // 假设我们知道要修改的形状名称为“TextBox1”
        var shape = firstSlide.Shapes.GetByName("TextBox1");
        if (shape != null && shape.TextFrame != null)
        {
            shape.TextFrame.Text = "修改后的文本内容";
        }

        presentation.Save("modifiedPresentation.pptx");
        presentation.Close();
    }
}
  1. 更新图片:如果要更新 PPTX 文件中的图片,可以参考以下代码:
using ShapeCrawler;
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "presentationWithImage.pptx";
        Presentation presentation = new Presentation(filePath);

        Slide firstSlide = presentation.Slides[0];
        // 假设要更新的图片形状名称为“Picture1”
        var picture = firstSlide.Shapes.GetByName<IPicture>("Picture1");
        if (picture != null)
        {
            string newImagePath = "newImage.jpg";
            using (var imageStream = new FileStream(newImagePath, FileMode.Open))
            {
                picture.Image.Update(imageStream);
            }
        }

        presentation.Save("updatedPresentation.pptx");
        presentation.Close();
    }
}
  1. 添加表格:在幻灯片中添加表格的示例代码如下:
using ShapeCrawler;
using System;

class Program
{
    static void Main()
    {
        string filePath = "presentationToAddTable.pptx";
        Presentation presentation = new Presentation(filePath);

        Slide firstSlide = presentation.Slides[0];
        // 在幻灯片上添加一个3列2行的表格,设置其位置
        var table = firstSlide.Shapes.AddTable(x: 100, y: 150, columnsCount: 3, rowsCount: 2);

        // 设置表格单元格内容
        table[0, 0].TextFrame.Text = "第一行第一列";
        table[0, 1].TextFrame.Text = "第一行第二列";
        table[0, 2].TextFrame.Text = "第一行第三列";
        table[1, 0].TextFrame.Text = "第二行第一列";
        table[1, 1].TextFrame.Text = "第二行第二列";
        table[1, 2].TextFrame.Text = "第二行第三列";

        presentation.Save("presentationWithTable.pptx");
        presentation.Close();
    }
}

在进行修改操作时,需要注意对文件的保存,确保修改后的内容能够持久化 。同时,在获取形状、图片等元素时,要注意判断是否获取成功,避免空引用异常 。

深入应用:复杂场景处理

自动化报告生成

在实际业务中,常常需要根据大量的数据生成定制化的报告 PPT。借助 ShapeCrawler,我们能够将数据与 PPT 模板相结合,实现自动化的报告生成流程,极大地提高工作效率。

假设我们有一份销售数据报告的需求,数据存储在一个List集合中,每个SaleData对象包含日期、产品名称、销售额等属性 。同时,我们有一个 PPT 模板,其中包含占位符形状用于填充数据 。以下是实现自动化报告生成的代码思路:

using ShapeCrawler;
using System;
using System.Collections.Generic;

class SaleData
{
    public DateTime Date { get; set; }
    public string ProductName { get; set; }
    public decimal SalesAmount { get; set; }
}

class Program
{
    static void Main()
    {
        // 假设已经获取到销售数据
        List<SaleData> saleDataList = GetSaleData();

        // 打开PPT模板
        string templatePath = "sales_report_template.pptx";
        Presentation presentation = new Presentation(templatePath);

        // 获取模板中用于填充数据的幻灯片
        Slide dataSlide = presentation.Slides[0];

        // 遍历销售数据并填充到幻灯片中
        foreach (SaleData data in saleDataList)
        {
            // 假设模板中有名为“DatePlaceholder”“ProductNamePlaceholder”“SalesAmountPlaceholder”的占位符形状
            var dateShape = dataSlide.Shapes.GetByName("DatePlaceholder");
            var productShape = dataSlide.Shapes.GetByName("ProductNamePlaceholder");
            var amountShape = dataSlide.Shapes.GetByName("SalesAmountPlaceholder");

            if (dateShape != null && dateShape.TextFrame != null)
            {
                dateShape.TextFrame.Text = data.Date.ToString("yyyy-MM-dd");
            }
            if (productShape != null && productShape.TextFrame != null)
            {
                productShape.TextFrame.Text = data.ProductName;
            }
            if (amountShape != null && amountShape.TextFrame != null)
            {
                amountShape.TextFrame.Text = data.SalesAmount.ToString("C");
            }

            // 如果需要,添加新的幻灯片用于展示下一组数据
            // 这里简单示例,实际可能需要根据布局和数据量灵活处理
            if (saleDataList.IndexOf(data) < saleDataList.Count - 1)
            {
                Slide newSlide = presentation.Slides.Add();
                // 复制模板幻灯片的格式和占位符等设置到新幻灯片(这里省略具体实现)
                dataSlide = newSlide;
            }
        }

        // 保存生成的报告
        string outputPath = "generated_sales_report.pptx";
        presentation.Save(outputPath);
        presentation.Close();
    }

    static List<SaleData> GetSaleData()
    {
        // 这里简单模拟获取销售数据的方法,实际应用中可能从数据库、文件等获取
        List<SaleData> dataList = new List<SaleData>
        {
            new SaleData { Date = DateTime.Now.AddDays(-3), ProductName = "Product A", SalesAmount = 1000.5m },
            new SaleData { Date = DateTime.Now.AddDays(-2), ProductName = "Product B", SalesAmount = 1500.2m },
            new SaleData { Date = DateTime.Now.AddDays(-1), ProductName = "Product C", SalesAmount = 900.8m }
        };
        return dataList;
    }
}

在这段代码中,首先定义了SaleData类来表示销售数据 。然后在Main方法中,获取销售数据并打开 PPT 模板 。通过遍历销售数据,找到模板幻灯片中对应的占位符形状,并将数据填充到占位符中 。如果数据有多组,还可以根据需要添加新的幻灯片来展示后续数据 。最后,保存生成的报告 PPT 。通过这样的方式,就实现了根据数据自动化生成报告 PPT 的功能,避免了手动逐个填写数据的繁琐过程 。

批量模板处理

在企业培训、教育课件制作等场景中,经常需要对大量的 PPT 模板进行处理,替换其中的内容,以满足不同的需求 。ShapeCrawler 为我们提供了便捷的方式来实现这一操作 。

例如,企业有一个培训 PPT 模板,需要为不同部门的员工生成个性化的培训资料,每个部门的资料中需要包含部门名称、培训重点等不同内容 。我们可以通过以下方法实现批量模板处理:

  1. 准备模板和数据:首先,准备好 PPT 模板文件,假设为 “training_template.pptx” 。同时,准备一个包含部门信息的数据源,例如一个List集合,每个DepartmentInfo对象包含部门名称、培训重点等属性 。

  2. 编写处理代码

using ShapeCrawler;
using System;
using System.Collections.Generic;

class DepartmentInfo
{
    public string DepartmentName { get; set; }
    public string TrainingFocus { get; set; }
}

class Program
{
    static void Main()
    {
        // 假设已经获取到部门信息
        List<DepartmentInfo> departmentInfoList = GetDepartmentInfo();

        // 模板路径
        string templatePath = "training_template.pptx";

        foreach (DepartmentInfo info in departmentInfoList)
        {
            // 打开模板
            Presentation presentation = new Presentation(templatePath);

            // 获取模板中用于替换内容的幻灯片
            Slide targetSlide = presentation.Slides[0];

            // 假设模板中有名为“DepartmentNamePlaceholder”“TrainingFocusPlaceholder”的占位符形状
            var departmentShape = targetSlide.Shapes.GetByName("DepartmentNamePlaceholder");
            var focusShape = targetSlide.Shapes.GetByName("TrainingFocusPlaceholder");

            if (departmentShape != null && departmentShape.TextFrame != null)
            {
                departmentShape.TextFrame.Text = info.DepartmentName;
            }
            if (focusShape != null && focusShape.TextFrame != null)
            {
                focusShape.TextFrame.Text = info.TrainingFocus;
            }

            // 生成个性化的文件名,例如“department_name_training.pptx”
            string outputFileName = $"{info.DepartmentName}_training.pptx";
            string outputPath = Path.Combine("output_folder", outputFileName);

            // 保存生成的PPT
            presentation.Save(outputPath);
            presentation.Close();
        }
    }

    static List<DepartmentInfo> GetDepartmentInfo()
    {
        // 这里简单模拟获取部门信息的方法,实际应用中可能从数据库、文件等获取
        List<DepartmentInfo> infoList = new List<DepartmentInfo>
        {
            new DepartmentInfo { DepartmentName = "Sales", TrainingFocus = "Sales Skills and Customer Relationship Management" },
            new DepartmentInfo { DepartmentName = "Engineering", TrainingFocus = "Technical Skills and New Product Development" },
            new DepartmentInfo { DepartmentName = "Finance", TrainingFocus = "Financial Analysis and Budget Management" }
        };
        return infoList;
    }
}

在上述代码中,定义了DepartmentInfo类来存储部门信息 。在Main方法中,遍历部门信息列表,针对每个部门,打开 PPT 模板,找到对应的占位符形状并替换为该部门的相关信息 。然后,根据部门名称生成个性化的输出文件名,并将生成的 PPT 保存到指定的输出文件夹中 。通过这样的方式,就可以快速地为多个部门生成个性化的培训 PPT,大大提高了工作效率,同时保证了文档格式的一致性 。

常见问题与解决方案

在使用 ShapeCrawler 操作 PPTX 文件的过程中,开发者可能会遇到一些常见问题,以下为大家整理并提供相应的解决方案。

文件路径相关问题

  • 问题描述:在打开或保存 PPTX 文件时,可能会出现文件路径错误的情况,例如指定的文件路径不存在,或者文件名称拼写错误,导致无法成功打开或保存文件,程序抛出FileNotFoundException或IOException异常 。

  • 解决方案:在操作文件前,务必仔细检查文件路径和文件名的正确性。可以使用System.IO.Path类的相关方法来构建和验证文件路径,例如Path.Combine方法用于正确组合路径和文件名,避免因路径分隔符使用不当导致的错误 。在保存文件时,确保目标文件夹存在,如果不存在,可以使用Directory.CreateDirectory方法创建文件夹 。如下是一个简单的示例:

string folderPath = "your_folder_path";
if (!Directory.Exists(folderPath))
{
    Directory.CreateDirectory(folderPath);
}
string filePath = Path.Combine(folderPath, "your_file.pptx");
Presentation presentation = new Presentation();
presentation.Save(filePath);

类型转换异常

  • 问题描述:当尝试将获取到的形状对象转换为不兼容的类型时,会抛出InvalidCastException异常 。例如,试图将一个普通形状对象转换为图片形状对象,而实际上该形状并非图片形状 。

  • 解决方案:在进行类型转换之前,使用is关键字先检查对象的实际类型 。例如:

var shape = slide.Shapes[0];
if (shape is IPicture pictureShape)
{
    // 可以安全地进行类型转换并操作图片形状
    pictureShape.Image.Update("new_image_path.jpg");
}
else
{
    // 处理非图片形状的情况
}

通过这种方式,可以避免在类型不匹配时进行无效的类型转换,从而防止异常的发生 。

形状或文本获取失败

  • 问题描述:在通过名称获取形状或文本框时,可能会因为名称错误、形状不存在于当前幻灯片等原因导致获取失败,返回null值,后续对null对象进行操作时会引发NullReferenceException异常 。

  • 解决方案:在获取形状或文本框后,先检查返回值是否为null,确保对象存在后再进行操作 。例如:

var textShape = slide.Shapes.GetByName("TextBox1");
if (textShape != null && textShape.TextFrame != null)
{
    textShape.TextFrame.Text = "New Text";
}

同时,在给形状命名时,要确保名称的唯一性和准确性,避免因名称混淆导致获取失败 。

图片插入失败

  • 问题描述:插入图片时,可能会遇到图片格式不支持、图片文件损坏、文件路径错误等问题,导致图片无法成功插入,程序抛出相应的异常 。

  • 解决方案:首先,确保插入的图片格式是 ShapeCrawler 支持的,常见的如 JPEG、PNG 等格式 。在读取图片文件时,使用try-catch块捕获可能出现的异常,例如FileNotFoundException(文件未找到)、IOException(读取文件出错)等,并在捕获到异常时进行适当的处理,如提示用户检查文件路径和文件状态 。示例代码如下:

string imagePath = "path/to/your/image.jpg";
try
{
    using (var imageStream = new FileStream(imagePath, FileMode.Open))
    {
        var imageShape = slide.Shapes.AddPicture(imageStream);
        // 设置图片位置、大小等属性
    }
}
catch (FileNotFoundException ex)
{
    Console.WriteLine($"图片文件未找到:{ex.Message}");
}
catch (IOException ex)
{
    Console.WriteLine($"读取图片文件出错:{ex.Message}");
}

通过对这些常见问题的了解和掌握相应的解决方案,开发者在使用 ShapeCrawler 进行 PPTX 文件操作时,可以更加顺畅地实现各种功能,提高开发效率 。

总结与展望

ShapeCrawler 作为一款功能强大的用于处理 PPTX 文件的开源.NET SDK,为开发者在.NET 平台上操作 PPTX 文件带来了极大的便利。通过其简洁易用的 API,我们能够高效地实现 PPTX 文件的创建、编辑、内容替换、图片图表插入等多种操作,无论是基础的文本处理,还是复杂的自动化报告生成、批量模板处理等场景,ShapeCrawler 都能游刃有余地应对 。

其无需依赖 Microsoft Office 软件的特性,不仅拓宽了应用场景,还降低了开发成本和环境依赖;丰富的功能集使得开发者可以用较少的代码实现丰富的 PPTX 文件处理功能,大大提高了开发效率 。在实际项目中,我们已经看到了 ShapeCrawler 在自动化办公、数据可视化展示、教育培训课件制作等领域发挥的重要作用,帮助企业和开发者节省了大量的时间和人力成本 。

展望未来,随着.NET 技术的不断发展以及 PPTX 文件应用场景的持续拓展,相信 ShapeCrawler 也会不断进化。未来它可能会进一步优化性能,支持更多的 PPTX 文件特性和格式,提供更丰富的 API 接口,以满足开发者日益增长的多样化需求 。同时,希望 ShapeCrawler 的社区能够不断壮大,吸引更多的开发者参与到项目中来,共同完善和丰富这个优秀的开源项目 。

如果你在.NET 开发中涉及到 PPTX 文件处理的相关需求,不妨尝试使用 ShapeCrawler,相信它会给你带来意想不到的惊喜 。

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

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

相关文章

微信小程序如何接入直播功能

一、小程序直播开通背景 1.政府资质要求 政府的要求&#xff0c;小程序开通直播需要注册主体具备互联网直播的资质&#xff0c;普通企业需要《信息网络传播视听节目许可证》&#xff0c;表演性质的直播需要《网络文化经营许可证》&#xff0c;政府主体需要《社会信用代码》及…

基于Spring Boot的停车场管理系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

慧通测控汽车智能座舱测试技术

一、引言 随着科技的飞速发展&#xff0c;汽车正从单纯的交通工具向智能化移动空间转变。智能座舱作为这一转变的核心体现&#xff0c;融合了多种先进技术&#xff0c;为用户带来前所未有的驾驶体验。从简单的信息娱乐系统到高度集成的人机交互、智能驾驶辅助以及车辆状态监测…

kettle插件-rabbitmq插件

场景&#xff1a;kettle本身可以直接链接rabbitmq&#xff0c;但是需要配置rabbitmq开启mqtt协议&#xff0c;本次讲解下自定义开发组件RabbitMQ consumer&#xff0c;无需开启mqtt协议即可使用。 1、docker 安装rabbitmq 1&#xff09;下载镜像 docker pull rabbitmq 2&…

为Windows10的WSL Ubuntu启动sshd服务并使用Trae远程连接

Windows10的WSL Ubuntu&#xff0c;使用起来非常方便&#xff0c;但是美中不足的是&#xff0c;无法从Windows主机ssh到Ubuntu 。 解决的方法是在Ubuntu安装sshd服务 Ubuntu安装sshd服务 执行命令 sudo apt install openssh-server 安装好后&#xff0c;先本地测试&#x…

【C#.NET】VS2022创建Web API项目

C# Web API 是一种基于 .NET 平台&#xff08;包括但不限于.NET Framework 和 .NET Core&#xff09;构建 HTTP 服务的框架&#xff0c;用于创建 RESTful Web 服务。REST&#xff08;Representational State Transfer&#xff09;是一种软件架构风格&#xff0c;它利用HTTP协议…

体育直播系统趣猜功能开发技术实现方案

功能概述 趣猜功能是“东莞梦幻网络科技”体育直播系统源码中的互动功能&#xff0c;主播可以发起竞猜题目&#xff0c;观众使用虚拟货币进行投注&#xff0c;增加直播间的互动性和趣味性。所有货币均为虚拟货币&#xff0c;通过系统活动获取&#xff0c;不可充值提现。 数据…

33.[前端开发-JavaScript基础]Day10-常见事件-鼠标事件-键盘事件-定时器-案例

1 window定时器 window定时器方法 setTimeout的使用 setInterval的使用 2 轮播消息提示 案例实战一 – 轮播消息提示 3 关闭隐藏消息 案例实战二 – 关闭隐藏消息 4 侧边栏展示 案例实战三 – 侧边栏展示 5 tab切换实现 案例实战四 – 登录框&#xff08;作业&#xff09;…

C# 多标签浏览器 谷歌内核Csharp

采用框架 &#xff1a;FBrowserCEF3lib 视频演示&#xff1a;点我直达 成品下载&#xff1a; https://wwms.lanzouo.com/iYOd42rl8vje

如何从0设计开发一款JS-SDK

一、前言 前端SDK是什么&#xff1f;前端SDK是为了帮助前端实现特定需求&#xff0c;而向开发者暴露的一些JS-API的集合&#xff0c;规范的SDK包括若干API实现、说明文档等 前端SDK其实很常见了&#xff0c;比如&#xff1a; UI组件库&#xff1a;通过封装一系列组件&#xff…

linux实现rsync+sersync实时数据备份

1.概述 rsync(Remote Sync) 是一个Unix/linux系统下的文件同步和传输工具 2.端口和运行模式 tcp/873 采用C/S模式&#xff08;客户端/服务器模式&#xff09; 3.特点 可以镜像保存整个目录和文件第一次全量备份(备份全部的文件),之后是增量备份(只备份变化的文件) 4. 数…

【计算机网络】计算机网络协议、接口与服务全面解析——结合生活化案例与图文详解

协议、接口与服务 导读一、协议1.1 定义1.2 组成 二、接口三、服务3.1 定义3.2 服务与协议的区别3.3 分类3.3.1 面向连接服务于无连接服务3.3.2 可靠服务和不可靠服务3.3.3 有应答服务和无应答服务 结语 导读 大家好&#xff0c;很高兴又和大家见面啦&#xff01;&#xff01;…

51c自动驾驶~合集26

我自己的原文哦~ https://blog.51cto.com/whaosoft/11968755 #大模型/Sora/世界模型之间是什么关系 1 什么是大模型 人工智能大模型&#xff08;Artificial Intelligence Large Model&#xff0c;简称AI大模型&#xff09;是指具有庞大的参数规模和复杂程度的机器学习模…

【NUUO 摄像头】(弱口令登录漏洞)

漏洞简介&#xff1a;NUUO 是NUUO公司的一款小型网络硬盘录像机设备。 NUUO NVRMini2 3.0.8及之前版本中存在后门调试文件。远程攻击者可通过向后门文件handle_site_config.php发送特定的请求利用该漏洞执行任意命令。 1.Fofa搜索语句&#xff1a; 在Fofa网站&#xff0c;搜索&…

【设计模式】抽象工厂模式(含与工厂方法模式的对比)

本期我们来学习一下设计模式之抽象工厂模式&#xff0c;在软件开发中&#xff0c;工厂模式 和 抽象工厂模式 都用于创建对象&#xff0c;但它们的应用场景和实现方式有所不同。本文将基于 C 代码&#xff0c;分析抽象工厂模式的实现&#xff0c;并对比其与工厂方法模式的区别。…

IDEA转战Trae AI IED配置

Trae Ai 的前身是vscode IDEA转战Trae AI IED配置 1.安装java相关的插件 2、安装spring相关的插件 3.配置maven环境 打开 Trae AI IDE -> 首选项 -> 设置 -> Editor 设置 ⚠️配置方式有两种 setting.json文件中直接编辑&#xff08;推荐&#xff09;界面设置 方案…

再学:区块链基础与合约初探 EVM与GAS机制

目录 1.区块链是什么 2.remix ​3.账户​ ​4.以太坊三种交易​ 5.EVM 6.以太坊客户端节点 ​7.Gas费用 8.区块链浏览器 1.区块链是什么 只需要检验根节点 Merkel根是否有更改&#xff0c;就不用检查每个交易是否有更改。方便很多。 2.remix 3.账户 如果交易失败的话&…

Nextjs15 - middleware的使用

nextjs 官方文档&#xff08;current branch 对应如下文档&#xff09; Middlewarepath-to-regexp 本专栏内容均可在Github&#xff1a;test_05/Middleware 找到 一、middleware 基本使用 中间件允许您在请求完成之前运行代码。然后&#xff0c;根据传入的请求&#xff0c;您…

边缘计算 vs. 云计算,谁才是工业物联网的未来?

前言 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;边缘计算正在彻底改变数据的处理、存储和分析方式。传统的IoT设备数据通常需要发送到云端进行处理&#xff0c;但随着设备数量的激增&#xff0c;这种模式在延迟、带宽和安全性方面暴露出诸多局限。边缘计…

leetcode.189.轮转数组

第一次全反转&#xff0c;第二次反转前k个&#xff0c;第三次反转后n-k个 需要注意的是向又轮转k个时&#xff0c;如果超出数组长度&#xff0c;要对其进行取模运算才是正确的向右轮转个数 class Solution { private:void rotate(vector<int>& nums,int start,int …