当前位置: 首页 > news >正文

.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)

在使用MudTools.OfficeInterop.Word库进行Word文档自动化处理时,深入理解Word对象模型的核心组件是至关重要的。Word对象模型提供了一套层次化的结构,使开发者能够通过编程方式控制Word应用程序、文档以及文档内容。本章将详细介绍Word对象模型中最核心的三个对象:Application、Document和Range。

2.1 对象模型层次结构

Word对象模型采用了层次化的结构,从顶层的应用程序对象到具体的文档内容元素,每一层都包含下一层的对象。理解这种层次结构对于有效使用Word自动化功能至关重要。

Application (应用程序)
├── Documents (文档集合)
│   └── Document (文档)
│       ├── Sections (节)
│       ├── Paragraphs (段落)
│       ├── Tables (表格)
│       ├── Shapes (形状)
│       ├── Bookmarks (书签)
│       ├── Fields (域)
│       ├── Comments (批注)
│       ├── Headers/Footers (页眉/页脚)
│       └── Range (范围)
│           ├── Characters (字符)
│           ├── Words (单词)
│           ├── Sentences (句子)
│           └── ...
└── Windows (窗口)└── Window (窗口)

这种层次结构反映了Word应用程序的实际组织方式。Application对象代表整个Word应用程序实例,Documents集合包含所有打开的文档,每个Document对象代表一个具体的文档文件,而Range对象则代表文档中的特定内容区域。

2.2 核心对象详解

Application对象

Application对象是Word对象模型的顶层对象,代表整个Word应用程序实例。通过Application对象,您可以控制Word应用程序的全局设置和行为。

主要功能包括:

  • 控制应用程序的可见性(显示或隐藏Word窗口)
  • 管理打开的文档集合
  • 设置全局选项(如显示警告、状态栏等)
  • 控制应用程序级别的行为(如打印设置、语言设置等)

在MudTools.OfficeInterop.Word中,IWordApplication接口封装了Word应用程序的主要功能。通过WordFactory类的静态方法可以创建Application实例:

// 创建一个新的空白文档
// BlankWorkbook()方法会启动Word应用程序并创建一个空白文档
var wordApp = WordFactory.BlankWorkbook();// 基于模板创建文档
// CreateFrom()方法会启动Word应用程序并基于模板创建新文档
var wordApp = WordFactory.CreateFrom(@"C:\Templates\MyTemplate.dotx");// 打开现有文档
// Open()方法会启动Word应用程序并打开指定的现有文档
var wordApp = WordFactory.Open(@"C:\Documents\MyDocument.docx");

通过Application对象,您可以控制Word应用程序的可见性:

// 隐藏Word应用程序,适用于后台处理场景
wordApp.Visibility = WordAppVisibility.Hidden;// 显示Word应用程序,适用于需要用户交互的场景
wordApp.Visibility = WordAppVisibility.Visible;

Document对象

Document对象是Word对象模型的核心,代表一个打开的Word文档文件。每个Document对象都与一个具体的.docx、.doc或其他Word支持的文件格式相关联。

Document对象的主要功能包括:

  • 文档属性管理(名称、路径、标题等)
  • 文档内容操作(添加段落、表格、形状等)
  • 文档保存和关闭操作
  • 文档保护和权限管理
  • 页面设置和打印操作

在MudTools.OfficeInterop.Word中,IWordDocument接口提供了对Word文档的完整访问能力。通过Application对象的文档操作方法可以获取Document实例:

// 获取活动文档,通常是在创建或打开文档后立即获取
var document = wordApp.ActiveDocument;// 通过索引获取文档,适用于需要处理多个文档的场景
var document = wordApp.Documents[1];

Document对象包含了丰富的属性,用于获取和设置文档的各种信息:

// 获取文档名称,例如"MyDocument.docx"
string name = document.Name;// 获取文档完整路径,例如"C:\Documents\MyDocument.docx"
string fullPath = document.FullName;// 获取或设置文档标题,用于文档元数据管理
string title = document.Title;
document.Title = "新标题";

Range对象

Range对象是Word对象模型中最重要的概念之一,代表文档中的一个连续区域。Range由起始位置和结束位置定义,可以包含文档中的任意内容,从一个字符到整个文档。

Range对象的主要特点:

  • 动态性:当文档内容发生变化时,Range会自动调整其位置和内容
  • 灵活性:可以表示文档中的任意连续区域,包括跨段落的内容
  • 功能性:提供了丰富的文本操作、格式设置和内容管理功能

在MudTools.OfficeInterop.Word中,IWordRange接口封装了Range对象的主要功能。Range对象可以通过多种方式获取:

// 获取整个文档的内容范围,适用于操作整个文档内容的场景
var contentRange = document.Content;// 获取指定位置的范围,适用于操作文档特定部分的场景
// 参数1: 起始位置(从0开始)
// 参数2: 结束位置(不包含该位置)
var range = document.Range(0, 10);// 通过书签获取范围,适用于操作文档中标记区域的场景
var range = document.Bookmarks["MyBookmark"].Range;

Range对象的核心属性是Start和End,它们定义了范围在文档中的位置:

// 获取范围的起始和结束位置,用于确定当前操作区域
int start = range.Start;
int end = range.End;// 设置范围的位置,用于重新定义操作区域
range.SetRange(10, 20);

Range对象还提供了对文本内容的直接访问:

// 获取范围中的文本,用于读取文档内容
string text = range.Text;// 设置范围中的文本,用于替换或插入内容
range.Text = "新文本内容";

2.3 实战:文档的打开、创建、保存与关闭

在实际应用中,文档的创建、打开、保存和关闭是最基本也是最重要的操作。MudTools.OfficeInterop.Word提供了简单直观的API来完成这些操作。

使用WordFactory创建和打开文档

WordFactory类提供了三种主要方法来创建或打开Word文档:

// 创建一个新的空白文档
// 适用于需要从头开始创建文档的场景,如生成报告、合同等
using var wordApp = WordFactory.BlankWorkbook();// 基于模板创建文档
// 适用于需要保持统一格式的场景,如企业合同模板、学校论文模板等
using var wordApp = WordFactory.CreateFrom(@"C:\Templates\BusinessLetter.dotx");// 打开现有文档
// 适用于需要修改已有文档的场景,如编辑合同、修订报告等
using var wordApp = WordFactory.Open(@"C:\Documents\Report.docx");

文档保存操作

保存文档是文档处理中的关键步骤。Document对象提供了多种保存方法:

// 保存对当前文档的更改
// 适用于修改现有文档并保存回原文档的场景
document.Save();// 另存为指定文件名和格式
// 适用于需要保存为不同格式或不同文件名的场景
document.SaveAs(@"C:\Documents\NewReport.docx", WdSaveFormat.wdFormatDocumentDefault);// 另存为PDF格式
// 适用于需要将文档发布为只读格式的场景
document.SaveAs(@"C:\Documents\Report.pdf", WdSaveFormat.wdFormatPDF);

在保存文档时,可以指定是否建议以只读方式打开:

// 另存为并建议以只读方式打开
// 适用于发布最终版本文档,防止意外修改的场景
document.SaveAs(@"C:\Documents\Report.docx", WdSaveFormat.wdFormatDocumentDefault, readOnlyRecommended: true);

文档关闭操作

处理完文档后,需要正确关闭文档以释放资源:

// 关闭文档并保存更改
// 适用于修改文档后需要保存的场景
document.Close(true);// 关闭文档但不保存更改
// 适用于查看文档但不希望保存修改的场景
document.Close(false);// 使用枚举值指定关闭选项
// 适用于需要明确指定保存行为的场景
document.Close(); // 默认保存更改

处理保存提示(DisplayAlerts属性)

在自动化操作中,可能需要控制Word显示的警告和提示信息。通过设置Application对象的DisplayAlerts属性,可以控制警告的显示:

// 禁止显示所有警告
// 适用于完全自动化处理,不需要用户交互的场景
wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 仅显示消息框警告
// 适用于只需要关键警告提示的场景
wordApp.DisplayAlerts = WdAlertLevel.wdAlertsMessageBox;// 显示所有警告(默认)
// 适用于需要完整用户交互的场景
wordApp.DisplayAlerts = WdAlertLevel.wdAlertsAll;

2.4 应用场景和实际示例

场景1:批量生成员工合同

在企业人力资源管理中,经常需要为新员工批量生成劳动合同。使用MudTools.OfficeInterop.Word可以基于合同模板自动填充员工信息并生成个性化合同。

using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;
using System.Collections.Generic;// 员工信息类
public class EmployeeInfo
{public string Name { get; set; }public string Id { get; set; }public string Department { get; set; }public DateTime HireDate { get; set; }public decimal Salary { get; set; }
}// 批量生成员工合同
public void GenerateEmployeeContracts(List<EmployeeInfo> employees)
{// 假设我们有一个合同模板,其中包含占位符如<<Name>>、<<Id>>等string templatePath = @"C:\Templates\EmployeeContract.dotx";foreach (var employee in employees){// 基于模板创建新文档using var wordApp = WordFactory.CreateFrom(templatePath);var document = wordApp.ActiveDocument;// 隐藏Word应用程序以提高性能wordApp.Visibility = WordAppVisibility.Hidden;// 禁止显示警告wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 查找并替换占位符document.FindAndReplace("<<Name>>", employee.Name);document.FindAndReplace("<<Id>>", employee.Id);document.FindAndReplace("<<Department>>", employee.Department);document.FindAndReplace("<<HireDate>>", employee.HireDate.ToString("yyyy年MM月dd日"));document.FindAndReplace("<<Salary>>", employee.Salary.ToString("C"));// 保存为员工个人合同string outputPath = $@"C:\Contracts\{employee.Id}_{employee.Name}_合同.docx";document.SaveAs(outputPath, WdSaveFormat.wdFormatDocumentDefault);// 关闭文档document.Close();Console.WriteLine($"已生成合同: {outputPath}");}
}

场景2:自动化报告生成

在数据分析和业务报告领域,经常需要将数据自动填充到报告模板中并生成专业文档。

using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;
using System.Collections.Generic;// 销售数据类
public class SalesData
{public string ProductName { get; set; }public int UnitsSold { get; set; }public decimal Revenue { get; set; }public double GrowthRate { get; set; }
}// 生成销售报告
public void GenerateSalesReport(List<SalesData> salesData, DateTime reportDate)
{// 使用销售报告模板string templatePath = @"C:\Templates\SalesReport.dotx";// 基于模板创建报告using var wordApp = WordFactory.CreateFrom(templatePath);var document = wordApp.ActiveDocument;// 隐藏Word应用程序wordApp.Visibility = WordAppVisibility.Hidden;wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 替换报告日期document.FindAndReplace("<<ReportDate>>", reportDate.ToString("yyyy年MM月dd日"));// 查找数据表格位置var tableBookmark = document.Bookmarks["SalesTable"];if (tableBookmark != null){// 获取表格范围var tableRange = tableBookmark.Range;// 在表格位置插入新表格var table = document.Tables.Add(tableRange, salesData.Count + 1, 4);// 设置表头table.Cell(1, 1).Range.Text = "产品名称";table.Cell(1, 2).Range.Text = "销售数量";table.Cell(1, 3).Range.Text = "销售收入";table.Cell(1, 4).Range.Text = "增长率";// 填充数据for (int i = 0; i < salesData.Count; i++){var data = salesData[i];table.Cell(i + 2, 1).Range.Text = data.ProductName;table.Cell(i + 2, 2).Range.Text = data.UnitsSold.ToString();table.Cell(i + 2, 3).Range.Text = data.Revenue.ToString("C");table.Cell(i + 2, 4).Range.Text = $"{data.GrowthRate:P2}";}}// 保存报告string outputPath = $@"C:\Reports\SalesReport_{reportDate:yyyyMMdd}.docx";document.SaveAs(outputPath, WdSaveFormat.wdFormatDocumentDefault);document.Close();Console.WriteLine($"销售报告已生成: {outputPath}");
}

场景3:文档内容分析和提取

在文档处理和信息检索领域,可能需要分析文档内容并提取关键信息。

using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;
using System.Collections.Generic;
using System.Linq;// 文档分析器
public class DocumentAnalyzer
{// 提取文档统计信息public DocumentStats AnalyzeDocument(string filePath){// 打开文档进行分析using var wordApp = WordFactory.Open(filePath);var document = wordApp.ActiveDocument;// 隐藏Word应用程序wordApp.Visibility = WordAppVisibility.Hidden;wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 获取文档统计信息var stats = new DocumentStats{FileName = document.Name,WordCount = document.WordCount,PageCount = document.PageCount,ParagraphCount = document.ParagraphCount,TableCount = document.TableCount,CharacterCount = document.Content.StoryLength, // 近似字符数// 提取关键词(简单实现,实际应用中可能需要更复杂的算法)Keywords = ExtractKeywords(document.Content.Text)};document.Close(false); // 不保存更改return stats;}// 简单关键词提取(实际应用中可以使用更复杂的自然语言处理技术)private List<string> ExtractKeywords(string text){// 移除标点符号并分割单词var words = text.Split(new char[] { ' ', '\t', '\n', '\r', '.', ',', '!', '?', ';', ':' }, StringSplitOptions.RemoveEmptyEntries);// 过滤常见停用词并统计词频var commonWords = new HashSet<string> { "的", "了", "在", "是", "我", "有", "和", "就", "不", "人", "都", "一", "一个", "上", "也", "很", "到", "说", "要", "去" };var wordCounts = new Dictionary<string, int>();foreach (var word in words){var cleanWord = word.Trim().ToLower();if (cleanWord.Length > 1 && !commonWords.Contains(cleanWord)){if (wordCounts.ContainsKey(cleanWord))wordCounts[cleanWord]++;elsewordCounts[cleanWord] = 1;}}// 返回出现频率最高的前10个词return wordCounts.OrderByDescending(kvp => kvp.Value).Take(10).Select(kvp => kvp.Key).ToList();}
}// 文档统计信息类
public class DocumentStats
{public string FileName { get; set; }public int WordCount { get; set; }public int PageCount { get; set; }public int ParagraphCount { get; set; }public int TableCount { get; set; }public int CharacterCount { get; set; }public List<string> Keywords { get; set; }
}

2.5 最佳实践和注意事项

资源管理

在使用MudTools.OfficeInterop.Word时,正确管理COM资源至关重要:

// 正确的资源管理方式 - 使用using语句
using var wordApp = WordFactory.BlankWorkbook();
var document = wordApp.ActiveDocument;try
{// 执行文档操作document.Content.Text = "Hello, World!";// 保存文档document.SaveAs(@"C:\Temp\Example.docx");
}
finally
{// using语句会自动处理资源释放// 无需手动调用document.Close()和wordApp.Quit()
}

异常处理

Word自动化操作可能遇到各种异常,需要适当的异常处理:

using MudTools.OfficeInterop;
using MudTools.OfficeInterop.Word;
using System;public void SafeDocumentOperation(string filePath)
{try{using var wordApp = WordFactory.Open(filePath);var document = wordApp.ActiveDocument;// 设置安全选项wordApp.Visibility = WordAppVisibility.Hidden;wordApp.DisplayAlerts = WdAlertLevel.wdAlertsNone;// 执行操作document.Content.Text = "Updated content";document.Save();}catch (System.IO.FileNotFoundException){Console.WriteLine($"文件未找到: {filePath}");}catch (System.UnauthorizedAccessException){Console.WriteLine($"没有权限访问文件: {filePath}");}catch (Exception ex){Console.WriteLine($"处理文档时发生错误: {ex.Message}");}
}

通过以上详细介绍和示例,您应该对Word对象模型的核心组件有了深入的理解,并能够使用MudTools.OfficeInterop.Word库进行各种文档操作。掌握这些核心概念和最佳实践是进行更复杂Word自动化任务的基础。

相关文章:

.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)

在使用MudTools.OfficeInterop.Word库进行Word文档自动化处理时,深入理解Word对象模型的核心组件是至关重要的。Word对象模型提供了一套层次化的结构,使开发者能够通过编程方式控制Word应用程序、文档以及文档内容。本章将详细介绍Word对象模型中最核心的三个对象:Applicati…...

事件轮循机制EventLoop

事件轮循机制 Event Loop(事件循环)是 JavaScript 中非常重要的概念,它是 JavaScript 执行模型的核心部分。为了理解事件循环,我们需要从 JavaScript 的单线程特性入手。 1. 单线程模型 js是单线程的, 这意味着它一次只能执行一个任务 但是现代需要处理大量异步操作(处理用…...

ruoyi-vue初步接触

因为最近参加了一个比赛,培训的时候说最终考试是要求使用ruoyi-vue来做功能,于是我在网上找到了ruoyi这个项目,准备给他搭建起来。 找了一下官网 发现了这个 准备工作然后我就开始查看本机环境java --version openjdk 21.0.8 2025-07-15 OpenJDK Runtime Environment (build…...

AT_arc180_c [ARC180C] Subsequence and Prefix Sum

考虑只让你进行一次操作,值域很小,DP。 考虑设 \(f_{i, j}\) 表示到了第 \(i\) 个数,选择的子序列和为 \(j\) 的方案数,显然只需要判断当前位置选没选即可。 如果只是这样,这个题还放不到 ARC 的 C。 发现如果 \(j = 0\),会出现一些奇怪的去重问题,就是这个时候选和不选…...

如何快速看懂「祖传项目」?Qoder 强势推出新利器

今天, Repo Wiki 正式上线新功能:支持Wiki 共享、编辑和导出。为了让知识更好地在团队中流转,Qoder 提供了 Wiki 共享能力。当用户在本地生成 Wiki 时,会自动在代码库中创建一个专属目录,只需将该目录推送至代码仓库,即可将生成的文档轻松共享给团队成员,实现协作共建。…...

测试不再碎片化:AI智能体平台「项目资料套件」功能上线!

在实际项目中,你是否遇到过这样的困扰: 项目需求被拆散在多个文档里,测试准备时要反复切换查找? 功能文档、接口文档、用户流程文档分属不同来源,整理耗时费力? 新版本发布时,常常因为文档引用不一致导致测试遗漏? 这些问题,不仅影响测试效率,更容易造成测试覆盖不完…...

大模型与知识图谱驱动测试公开课

大模型与知识图谱驱动测试公开课来啦! 内容包含: 知识图谱介绍与模型结构 图数据库选型与数据检索 文档生成知识图谱与GraphRAG 利用大模型与知识图谱生成测试用例 自动化测试用例生成 09月18日(周四)20:00,思寒老师将为分享如何利用大模型生成业务测试用例与自动化测试用…...

上位机项目展示

项目名称:装备状态多模-态视觉检测系统 (上位机平台开发) 项目简介 本项目旨在为多种先进的视觉检测算法提供一个通用、稳定且高性能的上位机平台。我独立负责该平台的设计与开发,它作为硬件控制中心和用户交互界面,无缝集成了偏振相机等多种硬件,并为外部Python算法模块提…...

美化自己的Github主页-Github profile页面仓库使用指南

GitHub 的 Profile 页面仓库 是 GitHub 在 2020 年 7 月 推出的一个小功能,官方名字叫 “Special repository for your profile”。你可以创建一个跟自己用户名完全同名的公共仓库,仓库的 README.md 内容会显示在你的个人主页顶部。而在此之前,Github的个人主页只会在左侧一…...

充气泵方案:充气泵用数字传感器有什么好处?

在充气泵应用中,数字传感器相比模拟传感器能带来多维度优势,这些优势直接匹配充气泵对精准控制、稳定运行、简化生产的核心需求,具体好处可从以下5个关键维度展开:1.气压测量更精准,避免“过充/欠充”问题充气泵的核心需求是精准控制气压(如汽车轮胎需2.2-2.5bar、自行车…...

windows系统下anaconda的安装和使用

https://blog.csdn.net/D18010492948/article/details/149262110Rust编程语言群 1036955113 java新手自学群 626070845 java/springboot/hadoop/JVM 群 4915800 Hadoop/mongodb(搭建/开发/运维)Q群481975850GOLang Q1群:6848027 GOLang Q2群:450509103 GOLang Q3群:436173132…...

Lock分析:systemstate分析row cache lock

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Lock分析:systemstate分析row cache lock 案例是一次测试row cache lo…...

mysql查看连接数,从查询到优化

你的MySQL数据库最近是否响应变慢?很有可能是因为连接数过多导致的资源抢占!作为数据库管理员或开发者,掌握查看和监控MySQL连接数的技能至关重要,今天我们就来深入探讨这个话题。 快速查看MySQL当前连接数 最直接的命令当属show status like %connect%,这个命令可以一次性…...

遗传算法与偏最小二乘结合的化学光谱变量选择方法

一、方法原理与优势 1. 核心思想 遗传算法(GA)通过模拟自然选择的全局搜索能力,优化偏最小二乘(PLS)模型的变量选择与参数配置,解决以下问题:高维数据降维:从数万波长点中筛选关键特征 多重共线性消除:避免相邻波长点的冗余信息 模型稳定性提升:通过进化策略避免局部…...

云剪贴板

消える飛行機雲 僕たちは見送った Ki e ru hi kō ki gu mo bo ku ta chi wa mi o ku tta 眩しくて逃げた いつだって弱くて Ma bu shi ku te ni ge ta i tsu da tte yo wa ku te あの日から変わらず いつまでも変わらずに A no hi ka ra ka wa ra zu i tsu ma de mo ka wa ra …...

读书笔记:Oracle数据库的水位线秘密:为什么空表查询还很慢?

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学习《Expert Oracle Database Architecture Techniques and…...

AI测试平台自动遍历:低代码也能玩转全链路测试

在日常测试工作中,大家一定遇到过这样的情况: 功能点很多,想快速做一遍稳定性验证,却苦于用例编写耗时; 页面结构复杂,手工点来点去容易遗漏; 系统频繁迭代,每次都要重复回归,工作量翻倍。 如果能有一种方式,不用写脚本,只要提供一个入口地址或安装包,就能把系统从…...

0代码5分钟一键生成Springboot+Vue后台管理系统

0代码5分钟一键生成Springboot+Vue后台管理系统​0代码5分钟一键生成Springboot+Vue后台管理系统 1 项目概述 今天给大家介绍一款基于Spring Boot和Vue的前后端分离脚手架项目,内置高效代码生成器,可快速生成基础增删改查功能。本文将完整演示如何使用该脚手架快速构建一个商…...

nvm与node.js的安装指南

UNIX类操作系统(Linux和macOS) 安装NVM打开终端。使用curl或wget安装NVM。访问NVM的GitHub仓库页面(https://github.com/nvm-sh/nvm)以获取最新的安装脚本。例如,使用curl执行以下命令: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bas…...

故障处理:2分钟处理Oracle RAC中OCR磁盘组丢失磁盘的故障

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。故障背景 近期,为备考 Oracle ADG (Active Data Guard) 相关认证,我与…...

Saga分布式事务框架执行逻辑

Saga分布式事务框架执行逻辑 📋 目录框架概述 核心组件架构 数据库表设计 完整执行流程 节点发现与调用机制 精简补偿策略设计 总结框架概述 这是一个基于数据库驱动的Saga分布式事务框架,专门用于解决跨服务间数据同步的一致性问题。框架采用了混合编排模式,结合了集中式任…...

在Android开发中实现两个Intent跳转及数据交换的方法

在Android开发中,两个活动(Activity)之间的Intent跳转及数据交换是一项基本而重要的功能。这通常涉及两个步骤:从一个活动发送数据,并在另一个活动中接收数据。 一、发起活动 — 发送数据 首先是初始化一个Intent对象,并使用 putExtra()方法来传递数据。以下是具体的步骤…...

ARC188 做题记

训A () 题意 题解 \(\bf{record}\) B () 题意 题解 \(\bf{record}\) C () 题意 题解 \(\bf{record}\) D () 题意 题解 \(\bf{record}\) E () 题意 题解 \(\bf{record}\)...

AT_arc145_d [ARC145D] Non Arithmetic Progression Set

在这个构造题上展示出了战犯级表现。 首先你先别想和的限制,\(x - y \ne y - z\) 就已经是一个很强的限制了,先想想这个怎么做。 在我看来一个很无厘头的想法是,将 \(3\) 进制下分配数字,如果只有 \(0/1\) 必然合法,想想就会觉得很妙,但是很无厘头。 然后如何满足和的限制…...

Microsoft AI Genius | 第三集实战课正式开启:用 Copilot Studio 定制你的专属智能体

想为团队快速定制专业级 AI 智能体,却担心增加工程负担或陷入复杂流程? 我们在前两期已解锁 GitHub Copilot Agent Mode、Azure AI Foundry Agent Service(国际版)的开发秘籍,本期将带你直达智能体定制最前线——Microsoft AI Genius 2.0系列第三集实战课来了!请锁定9月2…...

C# 多线程编程核心要点:不只是Thread和lock

聊到C#多线程,很多人第一反应就是Thread和lock。没错,它们是基石,但如果你只停留在它们,那就像只会用菜刀切菜,永远做不出满汉全席。现代C#多线程的核心思想是 “高效地利用计算资源,并安全地处理并发”。下面我跟你捋几个最核心的点,保证接地气。1. 为什么要用多线程?…...

基于MATLAB的图像融合拼接GUI系统设计

一、GUI架构设计(基于App Designer) % 创建GUI组件 fig = uifigure(Name,图像融合拼接系统,Position,[100,100,800,600]);% 控件布局 btnLoad = uibutton(fig,Text,加载图像,Position,[20,500,100,30],...ButtonPushedFcn,@(btn,event) loadImageCallback());btnPreprocess =…...

Python使用多线程和异步调用

概述 在 Python 中,多线程和异步调用是处理并发任务的两种常用方式,适用于不同场景。 多线程(threading 模块) 多线程适合处理 I/O 密集型任务(如网络请求、文件读写),因为这类任务大部分时间在等待,线程可以在等待时切换到其他任务。 import threading import timedef…...

研究生学术英语读写教程(中国科学院大学出版) Unit10 TextA 原文以及翻译(仅供学习)

本文全程使用kimi助手识别原书文字并翻译,无人工校准,没有参考任何其他翻译文章,仅供学习使用,如有侵权请联系我,会及时删除。 The Doctors Dilemma: Is It Ever Good to Do Harm? 原文1 Medical knowledge changes swiftly, and technological changes make new and exp…...

基于Python+Vue开发的蛋糕商城管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的蛋糕商城管理系统项目,大学生可以在实践中学习和…...

某运营商智慧协同平台——构建高效、敏捷的运营管理新模式

项目背景 在某运营商数字化运营战略的指引下,我司携手该运营商,共同打造智慧协同运营平台。该平台旨在实现省市协作,赋能一线,通过引入君南信息的技术和服务支持,提升业务支撑效率、加强系统安全防护、增强平台功能与服务,以满足全省21个地市独立配置、维护和管理数据展示…...

go使用反射获取http.Request参数到结构体 - 实践

go使用反射获取http.Request参数到结构体 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace …...

基于MATLAB/Simulink的TI2000系列DSP模型设计

一、开发环境配置工具安装安装MATLAB R2023a + Simulink 安装TI C2000 Support Package(通过Add-On Explorer) 安装Code Composer Studio (CCS) v7.5+硬件连接将TI2000系列DSP开发板(如C28069)通过USB连接至PC 在CCS中完成设备驱动配置二、模型设计流程 1. 创建Simulink模型…...

nginx 常用参数

...

Python常见函数和代码示例

内置函数 print() - 输出信息到控制台 name = "Alice" age = 30 print("姓名:", name, "年龄:", age) # 输出多个值 print(f"姓名: {name}, 年龄: {age}") # 使用f-string格式化输出 print("姓名: {}, 年龄: {}".format(na…...

69-SQLite应用 - 详解

69-SQLite应用 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14…...

mysql 源码下载,从获取到安装的完整指南

你是否曾想过亲手剖析MySQL这个影响了整个互联网时代的数据库?本文将带你一步步获取MySQL源码,让你不仅能安装使用,更能深入探索其内部机制。 MySQL作为最流行的开源关系型数据库之一,其发展历程堪称传奇。从最初的免费开源到被Oracle收购,MySQL始终保持着强大的生命力。它…...

docker中centos7配置

拉取centos7镜像: docker pull centos:7 启动容器: docker run -d -it --privileged --name=test centos:7 /usr/sbin/init 进入容器: docker exec -it test /bin/sh centos7安装: #设置时区 timedatectl set-timezone Asia/Shanghai #安装crontab服务 yum install -y rsy…...

centos7虚拟机下系统环境配置

​1. 网络配置 网卡: nmcli d 网络查看: ip addr 网络配置文件: /etc/sysconfig/network-scripts/ifcfg-enoXXX BOOTPROTO=static;IPADDR=;GATEWAY=;NETMASK=255.255.255.0;ONBOOT=yes 重启网络服务: systemctl restart network.service 或:service network restart 配置D…...

CefSharp高版本问题

​最近做一个PC端功能,打算用CefSharp+vue3来做,但在设置cookie时,出现了怎么也设置不上的问题。以前用CefSharp+vue2做过PC端,思路是差不多的。开始觉得是vue3哪里的设置问题,没找到,那就将cookie打印出来,打印出来是空的。那么问题就出在CefSharp上了,由于安装新的Ce…...

前缀和pre,如何求总和:pre(r) - pre(l)(1 = l = r = n),以及|pre(r) - pre(l)|

前缀和pre,如何求总和:pre(r) - pre(l)(1 <= l <= r <= n),以及|pre(r) - pre(l)|我们假设 pre[i]: 数组前i个数的之和,这就是前缀和 计算所有下标对 (1 <= l <= r <= n) pre[r] - pre[l] 之和 如果数据量是 n <= 1e5,直接两个for循环暴力求解的话,时…...

P11537 [NOISG 2023 Finals] Toxic Gene 题解

先考虑如果所有的 T 已被排除,剩下的位置怎么判断是 R 还是 S。 注意到每种细菌可以在样本中放入任意多个,容易想到经典的套路:将 \(8\) 个位置一起处理,第 \(i\) 个在样本中出现 \(2^{i-1}\) 次,再加入一个 T。若结果 \(\land 2^{i-1}=2^{i-1}\),则第 \(i\) 个对应的位置…...

keil5中stm32相关记录

在Keil 5中如何建立一个STM32项目_keil cmsis-CSDN博客 keil中怎么使用中文语言_keil怎么设置中文-CSDN博客 STM32入门开发-详解GPIO口的配置与控制方式(以LED灯为例) - 知乎...

centos7中mysql环境配置

​mysql源: rpm -ivh http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm yum install mysql-server mysql-client libmysqlclient-dev mysql-devel MySQL-python远程连接: GRANT ALL PRIVILEGES ON *.* TO root@% IDENTIFIED BY 123456 ; flush privileges; 记…...

centos7中php环境配置

​php7源: rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm yum -y install php72w php72w-cli php72w-fpm php72w-common php72w-devel php72w-embedded php72w-gd ph…...

Symfony学习笔记 - 利用Doctrine开发一个学生信息的增删查改

现在在学习Symfony,Doctrine作为官方重点推荐的数库库Bundle,必须要试试! 1、创建Symfony的Demo的Web应用 symfony new symfony_webapp --webapp 正确安装后,目录应该是这样的:如果你的目录仅仅只有config和vendor目录,那就表明你没有安装完整。原因是symfony时,需要从h…...

如何在Nginx服务器配置https以及强制跳转https

...

centos7中安装protobuf-c

​前言 设备服务与设备端通讯,设备服务使用Go构建,使用protobuf格式与设备端通讯,设备端采用stm32系列mcu,使用C语言开发,所以要生成protobuf C语言版协议库。步骤1.准备 yum -y install autoconf automake libtool yum -y install gcc gcc-c++2.安装protobuf protobuf版本…...

赞助NYU-Poly女性网络安全研讨会:推动行业多元发展

本文介绍Trail of Bits公司赞助纽约大学理工学院女性网络安全研讨会的举措,包括活动目标、技术工作坊内容、职业发展指导以及往期参与记录,旨在促进网络安全领域的性别多元化。我们正在赞助NYU-Poly女性网络安全研讨会 Dan Guido 2014年9月29日 会议, 教育, 赞助 网络安全是一…...

MyEMS:开源能源管理的探索与实践

在当今社会,能源的有效管理与优化利用已成为企业、公共机构乃至全社会关注的核心议题。随着物联网(IoT)和大数据技术的成熟,相应的软件工具应运而生,旨在为解决能源挑战提供技术方案。MyEMS便是这一领域中的一个代表性开源项目。 什么是MyEMS? MyEMS是一个专为能源管理设…...