Spire.Presentation for C++ 10.8.2 现已正式发布。最新版本修复了特定场景下,多产品同时使用的兼容性问题。更多详情请查阅下方内容。
问题修复:
https://www.e-iceblue.cn/Downloads/Spire-Presentation-CPP.html
Spire.Doc for C++ 13.8.2 现已发布,此次更新解决了在特定场景下同时使用多个 Spire 产品时出现的兼容性问题。
问题修复:
Spire.Presentation for Java 10.8.0 现已发布,该版本优化了转换PPTX到PDF的内存占用和耗时,并修复了一些已知问题。具体更新信息如下。
优化:
问题修复:
https://www.e-iceblue.cn/Downloads/Spire-Presentation-JAVA.html

二维码如今已成为现代 Web 应用中的标配功能,广泛应用于用户身份验证、无接触式交易、链接分享、名片信息传递等场景。对于 ASP.NET 开发者来说,使用 C# 实现二维码生成功能,已是众多实际项目中的常见需求。
本文将演示如何使用 Spire.Barcode for .NET 在 ASP.NET 应用中用 C# 生成二维码。我们将以一个 Razor Pages 项目为例,完整展示后端逻辑与前端页面,其他 ASP.NET 框架如 MVC、Web API、Web Forms 也可轻松使用相同方法。
文章目录
前提条件:
确保你的开发环境已安装以下内容:
安装 Spire.Barcode
通过 NuGet 包管理器控制台安装库:
Install-Package Spire.Barcode
Spire.Barcode 是一款完全独立的 .NET 条码组件,可在内存中生成二维码,无需调用外部 API。对于轻量项目,也可使用免费版 Free Spire.Barcode for .NET。
本节将展示如何在 ASP.NET Core Razor Pages 项目中实现二维码生成功能,示例包括后端 C# 处理逻辑以及简单的 Razor 页面用户界面。
二维码的生成逻辑写在 Index.cshtml.cs 文件中,处理用户输入后使用 Spire.Barcode 生成二维码,并将其以 Base64 字符串形式返回,便于嵌入到 HTML 页面中展示。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Spire.Barcode;
public class IndexModel : PageModel
{
[BindProperty]
public string InputData { get; set; }
public string QrCodeBase64 { get; set; }
public void OnPost()
{
if (!string.IsNullOrWhiteSpace(InputData))
{
QrCodeBase64 = GenerateQrCodeBase64(InputData);
}
}
private string GenerateQrCodeBase64(string input)
{
var settings = new BarcodeSettings
{
Type = BarCodeType.QRCode, // 二维码类型
Data = input, // 主编码数据
Data2D = input, // 二维码所需数据,通常与Data相同
QRCodeDataMode = QRCodeDataMode.Byte, // 字节模式(支持多语言内容)
QRCodeECL = QRCodeECL.M, // 中等级别的纠错能力(15%)
X = 3, // 模块大小(影响二维码图片尺寸)
ShowText = false, // 不显示默认条码文本
ShowBottomText = true, // 显示自定义底部文本
BottomText = input // 二维码下方显示的文本
};
var generator = new BarCodeGenerator(settings);
using var ms = new MemoryStream();
var qrImage = generator.GenerateImage();
qrImage.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return Convert.ToBase64String(ms.ToArray());
}
}
关键点说明:
BarcodeSettings:配置二维码的编码数据、容错级别、大小与底部文字显示等属性。BarCodeGenerator:通过 GenerateImage() 方法生成二维码图像对象。该方式完全基于内存操作,无需文件读写,适用于云部署或无状态服务场景。
前端页面(Index.cshtml)包含一个表单输入框和用于显示二维码及下载链接的区域:
@page
@model IndexModel
@{
ViewData["Title"] = "二维码生成器";
}
<h2>二维码生成器</h2>
<form method="post">
<label for="InputData">请输入文本或网址:</label>
<input type="text" id="InputData" name="InputData" style="width:300px;" required />
<button type="submit">生成二维码</button>
</form>
@if (!string.IsNullOrEmpty(Model.QrCodeBase64))
{
<div style="margin-top:20px">
<img src="data:image/png;base64,@Model.QrCodeBase64" alt="QR Code" />
<br />
<a href="data:image/png;base64,@Model.QrCodeBase64" download="qrcode.png"
style="
display: inline-block;
margin-top: 10px;
padding: 8px 16px;
background-color: #0078D7;
color: white;
text-decoration: none;
border-radius: 4px;
font-weight: 600;
cursor: pointer;
">
下载二维码
</a>
</div>
}
二维码图像使用 data: URI 方式直接嵌入网页,无需保存成文件,加载速度快,下载操作简便。
生成结果示意图如下:

如需扫描二维码功能,请参考:如何用 C# 识别二维码
通过 BarcodeSettings 可自定义二维码的多项属性,包括尺寸、颜色、容错级别、是否显示文字等:
| 属性 | 功能说明 | 示例 |
|---|---|---|
| QRCodeDataMode | 字符编码方式 | QRCodeDataMode.Byte |
| QRCodeECL | 容错级别(L/M/Q/H) | QRCodeECL.H |
| X | 模块大小(决定图像分辨率) | settings.X = 6 |
| ImageWidth/Height | 图像宽高尺寸设置 | settings.ImageWidth = 300 |
| ForeColor | 设置二维码颜色 | settings.ForeColor = Color.Blue |
| ShowText | 是否显示默认条码文本 | settings.ShowText = false |
| BottomText | 自定义底部说明文字 | settings.BottomText = "扫码访问" |
| ShowBottomText | 是否显示底部文字 | settings.ShowBottomText = true |
| QRCodeLogoImage | 设置嵌入 logo 图像(居中) | settings.QRCodeLogoImage = Image.FromFile("logo.png") |
更多属性请参阅 BarcodeSettings API 文档。
二维码生成逻辑可轻松迁移到 ASP.NET 的其他类型项目中,如 MVC、Web API 和 Web Forms。
在 MVC 项目中,可在控制器添加一个 Generate 方法返回二维码图像:
public class QrController : Controller
{
public ActionResult Generate(string data)
{
var settings = new BarcodeSettings
{
Type = BarCodeType.QRCode,
Data = data,
QRCodeDataMode = QRCodeDataMode.Byte,
QRCodeECL = QRCodeECL.M,
X = 5
};
var generator = new BarCodeGenerator(settings);
using var ms = new MemoryStream();
generator.GenerateImage().Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return File(ms.ToArray(), "image/png");
}
}
该方法直接返回 PNG 图像,适合在页面中嵌入或下载使用。
对于 Web API,可定义一个 GET 接口用于生成二维码图像流:
[ApiController]
[Route("api/[controller]")]
public class QrApiController : ControllerBase
{
[HttpGet("generate")]
public IActionResult GetQr(string data)
{
var settings = new BarcodeSettings
{
Type = BarCodeType.QRCode,
Data = data
};
var generator = new BarCodeGenerator(settings);
using var ms = new MemoryStream();
generator.GenerateImage().Save(ms, System.Drawing.Imaging.ImageFormat.Png);
return File(ms.ToArray(), "image/png");
}
}
适用于 React、Vue、Angular 等前端框架通过 API 请求获取二维码图像。
Web Forms 项目可在后台代码中处理二维码生成,并使用 Base64 形式展示:
protected void btnGenerate_Click(object sender, EventArgs e)
{
var settings = new BarcodeSettings
{
Type = BarCodeType.QRCode,
Data = txtInput.Text
};
var generator = new BarCodeGenerator(settings);
using var ms = new MemoryStream();
generator.GenerateImage().Save(ms, System.Drawing.Imaging.ImageFormat.Png);
imgQR.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(ms.ToArray());
}
将图像绑定到 <asp:Image> 控件中,即可在前端显示二维码。
借助 Spire.Barcode for .NET,你可以使用 C# 在 ASP.NET 的多种框架中快速实现二维码生成,包括 Razor Pages、MVC、Web API 与 Web Forms。该方案无需依赖外部服务,支持本地离线运行,图像输出灵活,适合用于身份验证、票务系统、名片分享等场景。
返回 Base64 字符串使得部署更简单,也无需进行文件存储管理。是一种稳定、实用且易于维护的二维码解决方案。
如需解锁Spire.Barcode for .NET 的完整功能,请联系我们申请免费License。
问:Spire.Barcode 是否支持中文、阿拉伯语等多语言字符?
答:支持。请使用 QRCodeDataMode.Byte 模式来确保字符兼容性。
问:二维码颜色、大小是否可以调整?
答:可以。可通过 X、ForeColor、ImageWidth 等属性灵活控制。
问:二维码生成是否完全离线? 答:是的。无需调用任何第三方 API,可在本地独立运行。
问:能否将二维码生成接口公开为 API? 答:完全可以。通过 ASP.NET Web API 可对前端或其他服务提供图像访问能力。

在企业应用开发中,Excel 通常被用作在技术人员与业务人员之间传递结构化数据的桥梁,因其格式灵活、易于共享且用户普遍熟悉。而将数据库数据导出为 Excel 文件,也因此成为实现报表生成、审计追踪、数据迁移和临时分析等需求时的一种高频操作。
本文将介绍如何使用 Spire.XLS for .NET 通过 C# 将数据库记录高效导出到 Excel 文件。示例以 SQL Server 数据库为基础,但相同方法也适用于 SQLite、MySQL、Oracle 等其他关系型数据库,只需调整连接方式即可。
文章目录
在开始编码之前,请先确认开发环境已就绪:
Install-Package Spire.XLS)示例数据库
以下 SQL 脚本在 SQL Server Express 中创建一个 Employees 表并插入测试数据:
CREATE TABLE Employees (
Id INT PRIMARY KEY IDENTITY,
Name NVARCHAR(100) NOT NULL,
Department NVARCHAR(50) NOT NULL,
Position NVARCHAR(50),
HireDate DATE NOT NULL,
Salary DECIMAL(10, 2) NOT NULL,
IsFullTime BIT NOT NULL
);
INSERT INTO Employees (Name, Department, Position, HireDate, Salary, IsFullTime) VALUES
(N'张伟', N'人力资源部', N'人事经理', '2018-05-01', 5500.00, 1),
(N'李强', N'信息技术部', N'软件工程师', '2020-09-15', 7200.50, 1),
(N'王芳', N'财务部', N'会计', '2019-11-20', 6300.75, 0),
(N'陈丽', N'市场部', N'内容专员', '2021-02-10', 4800.00, 1);
如果使用 MySQL 或 SQLite,只需调整 SQL 语法与连接字符串,整体导出逻辑不变。
以 SQL Server Express 为例,使用 SqlConnection 建立连接:
string connectionString = @"Data Source=YourServer\SQLEXPRESS;Initial Catalog=YourDatabaseName;Integrated Security=True;";
Integrated Security=TrueUser ID=yourUsername;Password=yourPassword;Encrypt=True;TrustServerCertificate=True使用 SqlDataAdapter 执行查询并填充 DataTable:
using System.Data;
using Microsoft.Data.SqlClient;
DataTable dataTable = new DataTable();
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
string query = "SELECT * FROM Employees";
using (SqlDataAdapter adapter = new SqlDataAdapter(query, conn))
{
adapter.Fill(dataTable);
}
}
using Spire.Xls;
Workbook workbook = new Workbook();
workbook.Worksheets.Clear();
Worksheet sheet = workbook.Worksheets.Add("Employees");
// 从第 1 行第 1 列插入 DataTable 数据,并包含列标题
sheet.InsertDataTable(dataTable, true, 1, 1);
// 保存为 Excel 2013 格式
workbook.SaveToFile("Employees.xlsx", ExcelVersion.Version2013);
核心方法:
InsertDataTable(DataTable table, bool columnHeaders, int firstRow, int firstColumn)
columnHeaders=true 表示将列名写入第一行firstRow / firstColumn 定义数据起始位置(基于 1 索引)SaveToFile:可保存为 .xlsx、.xls、.csv 等格式,也可保存到流中

导出数据后,可以通过以下方式提高可读性:
// 表头样式
sheet.Rows[0].Style.Font.IsBold = true;
sheet.Rows[0].Style.Font.Size = 14;
sheet.Rows[0].Style.HorizontalAlignment = HorizontalAlignType.Center;
sheet.Rows[0].Style.Color = System.Drawing.Color.LightGray;
// 数据行样式
for (int i = 1; i < sheet.Rows.Count(); i++)
{
var dataRow = sheet.Rows[i];
dataRow.Style.Font.Size = 12;
dataRow.Style.HorizontalAlignment = HorizontalAlignType.Left;
}
// 设置全局字体
sheet.AllocatedRange.Style.Font.FontName = "微软雅黑";
// 添加边框
sheet.AllocatedRange.BorderAround(LineStyleType.Thin, System.Drawing.Color.Black);
sheet.AllocatedRange.BorderInside(LineStyleType.Medium, System.Drawing.Color.Black);
// 自动调整列宽
sheet.AllocatedRange.AutoFitColumns();

更多数字格式设置可参考:在 C# 中设置 Excel 数字格式。
除了 DataTable 之外,你还可以:
使用 Entity Framework
var employees = dbContext.Employees.ToList();
然后将集合转换为 DataTable 或逐行写入 Excel。
调用存储过程
SqlCommand cmd = new SqlCommand("GetEmployees", conn);
cmd.CommandType = CommandType.StoredProcedure;
读取 SQLite / MySQL / Oracle
只需更换连接类型和驱动(Microsoft.Data.Sqlite、MySql.Data 等),其余导出逻辑相同。
如需导入 Excel 数据到数据库中,可参考:Excel 与数据库之间的数据导入导出。
| 问题 | 可能原因与解决方案 |
|---|---|
| Excel 文件为空 | 检查 DataTable 是否在导出前已正确填充 |
| 文件无法保存 | 确认保存路径存在且有写入权限 |
| 无法连接数据库 | 检查服务器是否启动、连接字符串是否正确 |
| 特殊字符乱码 | 数据库列类型应使用 NVARCHAR,Excel 需使用支持 Unicode 的字体 |
| 身份验证失败 | Windows 身份验证用 Integrated Security=True,SQL 身份验证需提供用户名与密码 |
通过 Spire.XLS for .NET,我们可以在 C# 中快速将数据库数据导出为 Excel,无需安装 Microsoft Office,且支持批量数据、格式设置和多种文件格式。 此方案可用于定时任务、后台服务或 Web 应用,实现数据的自动化导出与分发。
如需体验完整功能,可联系我们申请免费临时授权;对于小型项目,免费版 Free Spire.XLS for .NET 也能满足基本需求。
Q:如何在 C# 中将 SQL 数据导出到 Excel?
A:使用 SqlConnection 读取数据到 DataTable,再调用 Spire.XLS 的 InsertDataTable() 方法即可。
Q:支持导出 SQLite 或 MySQL 数据吗? A:支持,只需更换数据库驱动与连接字符串。
Q:需要安装 Excel 吗? A:不需要,Spire.XLS 是独立的 Excel 处理库。
Q:能否将多个表导出到同一个 Excel 文件? A:可以,创建多个工作表并分别插入数据即可。
你是否正为如何统计 Word 文档中的词频而苦恼?别担心,无论是为了提取关键词、分析内容结构,还是构建自动化文档工具,Python 都能轻松帮你搞定。你不仅可以统计某个词在整个文档中的总出现次数,还能精确到每一章甚至每一段。本文将带你一步步掌握如何用 Python 高效准确地完成词频统计,帮助你从 Word 文件中快速提取有价值的信息,省去手动查找的麻烦。

在本教程中,我们将使用 Spire.Doc for Python —— 一款功能强大且易于上手的 Python Word 文档处理库。它支持读取、编辑和分析 DOCX 文件的多种功能,而且不依赖于 Microsoft Office 环境。
你可以通过 pip 安装它:
pip install spire.doc
或下载 Spire.Doc 安装包,进行自定义安装。
首先我们来看一个最常见的需求:统计某个词或短语在整个 Word 文档中的出现频率。比如你正在审阅一份 50 页的合同文档,想知道“合同”这个词出现了多少次。
使用 Spire.Doc for Python 提供的 FindAllString() 方法,你可以快速扫描整份文档,并准确获取关键词的出现次数,只需几行代码就能搞定。
统计词频的基本步骤如下:
下面的代码展示了如何统计关键词 "AI绘画" 在整个 Word 文档中出现的次数:
from spire.doc import *
from spire.doc.common import *
# 创建一个 Document 对象
document = Document()
# 加载 Word 文档
document.LoadFromFile("/input/AI绘画的利弊及法律应对.docx")
# 设置需要查找的关键词
keyword = "AI绘画"
# 查找所有的匹配项(False:区分大小写,True:全文搜索)
textSelections = document.FindAllString(keyword, False, True)
# 计算出匹配项的个数
count = len(textSelections)
# 打印结果
print(f'"{keyword}" 在文章中出现了 {count} 次。')
document.Close()
下方是使用该段代码查找 Word 文档中关键词出现频率的结果预览:

Word 文档通常被划分为多个节(Section),每个节可以包含自己的段落、表格和其他内容。有时候,你可能并不只想统计整个文档中关键词出现的总次数,还想着知道它在每个节中分别出现了多少次。
为了实现这一点,我们可以遍历文档中的所有节,并在每个节内部查找目标关键词。下面我们就来看一下如何使用 Python 来实现按节统计词频。
实现步骤如下:
下面的示例代码演示了如何统计关键词 "AI绘画" 在 Word 文档每个节中的出现次数:
import re
from spire.doc import *
from spire.doc.common import *
# 创建一个 Document 对象并加载 Word 文件
document = Document()
document.LoadFromFile("/input/AI绘画的利弊及法律应对.docx")
# 指定要查找的关键词
keyword = "AI绘画"
# 关键词出现的总次数
total_count = 0
# 获取所有节(Section)
sections = document.Sections
# 遍历每一节
for i in range(sections.Count):
section = sections.get_Item(i)
paragraphs = section.Paragraphs
section_count = 0
print(f"\n=== 第 {i + 1} 节 ===")
# 遍历该节中的每个段落
for j in range(paragraphs.Count):
paragraph = paragraphs.get_Item(j)
text = paragraph.Text
# 使用正则表达式查找所有匹配项
count = len(re.findall(re.escape(keyword), text, flags=re.IGNORECASE))
section_count += count
total_count += count
print(f'第 {i + 1} 节中共出现:{section_count} 次')
print(f'\n=== 所有节中总共出现:{total_count} 次 ===')
document.Close()
下方图片展示了使用 Python 按节统计关键词出现频率的结果:

在进行敏感词检测或内容审查等任务时,往往需要更细致的词频分析。这一节我们就来看看如何按段落统计 Word 文档中某个关键词的出现频率,帮助你更深入了解特定文本在文档中的分布情况。
按段落统计关键词出现频率的步骤如下:
下面的代码演示了如何统计关键词 "AI绘画" 在 Word 文档各段落中的出现频率:
import re
from spire.doc import *
from spire.doc.common import *
# 创建一个 Document 对象
document = Document()
# 加载 Word 文档
document.LoadFromFile("/input/AI绘画的利弊及法律应对.docx")
# 自定义要查找的关键词
keyword = "AI绘画"
# 初始化变量
total_count = 0
paragraph_index = 1
# 遍历每一节和其中的段落
sections = document.Sections
for i in range(sections.Count):
section = sections.get_Item(i)
paragraphs = section.Paragraphs
for j in range(paragraphs.Count):
paragraph = paragraphs.get_Item(j)
text = paragraph.Text
# 忽略大小写查找关键词的所有出现次数
count = len(re.findall(re.escape(keyword), text, flags=re.IGNORECASE))
# 如果找到关键词,则输出结果
if count > 0:
print(f'第 {paragraph_index} 段:"{keyword}" 出现了 {count} 次')
total_count += count
paragraph_index += 1
# 输出总共出现的次数
print(f'\n所有段落中总共出现:{total_count} 次')
document.Close()
下方为按段落统计关键词出现频率的结果预览:

本文介绍了如何使用 Python 按全文、按节、按段落统计 Word 文档中关键词的出现频率。无论你是在处理长篇报告、筛查敏感词,还是开发智能文档工具,通过 Spire.Doc for Python 实现自动化操作,既高效又准确。想亲自试试这些功能?Spire.Doc 提供 该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。,欢迎体验。
Q1:如何统计某个词在 Word 文档中出现了多少次?
你可以使用 Word 自带的查找功能手动统计,也可以使用 Python 搭配 Spire.Doc 等库进行自动统计。后者可以更灵活地处理整个文档,或者只针对特定节或段落进行分析。
Q2:可以分析多个 Word 文件中的词频吗?
当然可以。你可以在 Python 中编写循环,批量加载多个 Word 文档,并对每个文件应用相同的词频统计逻辑。这种方式特别适合用于批量文档处理或内容审计场景。
Spire.Doc 13.8.1 现已发布。该版本支持比较两个列表级别是否一致,以及设置或删除图片项目符号。此外,它还调整了 Word 中与列表相关的部分属性和方法。详情如下。
新功能:
// 创建 Document 对象
Document document = new Document();
// 创建列表样式
ListStyle listStyle_1 = document.Styles.Add(ListType.Bulleted, "bulletList");
ListLevelCollection Levels_1 = listStyle_1.ListRef.Levels;
ListLevel L0 = Levels_1[0];
ListLevel L1 = Levels_1[1];
ListLevel L2 = Levels_1[2];
ListStyle listStyle_2 = document.Styles.Add(ListType.Bulleted, "bulletList");
ListLevelCollection Levels_2 = listStyle_2.ListRef.Levels;
ListLevel l0 = Levels_2[0];
ListLevel l1 = Levels_2[1];
ListLevel l2 = Levels_2[2];
// 设置列表样式
L0.ParagraphFormat.LineSpacing = 10 * 1.5f;
L1.CharacterFormat.FontSize = 9;
L1.IsLegalStyleNumbering = true;
L1.PatternType = ListPatternType.Arabic;
L1.FollowCharacter = FollowCharacterType.Nothing;
L1.BulletCharacter = "\x006e";
L1.NumberAlignment = ListNumberAlignment.Left;
L1.NumberPosition = -10;
L1.TabSpaceAfter = 0.5f;
L1.TextPosition = 0.5f;
L1.StartAt = 4;
L1.NumberSufix = "章";
L1.NumberPrefix = "第";
L1.NoRestartByHigher = false;
L1.UsePrevLevelPattern = false;
L2.CharacterFormat.FontName = "黑体";
// 创建列表样式2
l0.ParagraphFormat.LineSpacing = 10 * 1.5f;
l1.CharacterFormat.FontSize = 9;
l1.IsLegalStyleNumbering = true;
l1.PatternType = ListPatternType.Arabic;
l1.FollowCharacter = FollowCharacterType.Nothing;
l1.BulletCharacter = "\x006e";
l1.NumberAlignment = ListNumberAlignment.Left;
l1.NumberPosition = -10;
l1.TabSpaceAfter = 0.5f;
l1.TextPosition = 0.5f;
l1.StartAt = 4;
l1.NumberSufix = "章节";
l1.NumberPrefix = "第";
l1.NoRestartByHigher = false;
l1.UsePrevLevelPattern = false;
l1.CreatePictureBullet();
l2.CharacterFormat.FontName = "黑体";
// 比较两个列表级别是否一致
bool r0 = L0.Equals(l0);
bool r1 = L1.Equals(l1);
bool r2 = L2.Equals(l2);
// 创建 Document 对象
Document document = new Document();
// 添加一节
Section sec = document.AddSection();
Spire.Doc.Documents.Paragraph paragraph = sec.AddParagraph();
// 创建列表样式
ListStyle listStyle = document.Styles.Add(ListType.Bulleted, "bulletList");
ListLevelCollection Levels = listStyle.ListRef.Levels;
Levels[0].CreatePictureBullet();
Levels[0].PictureBullet.LoadImage(@"logo.jpg");
Levels[1].CreatePictureBullet();
Levels[1].PictureBullet.LoadImage(@"py.jpg");
// 添加段落并应用段落样式
paragraph = sec.AddParagraph();
paragraph.AppendText("项目 1");
paragraph.ListFormat.ApplyStyle(listStyle);
paragraph = sec.AddParagraph();
paragraph.AppendText("项目 1.1");
paragraph.ListFormat.ApplyStyle(listStyle);
paragraph.ListFormat.ListLevelNumber = 1;
// 删除图片项目符号
Levels[0].DeletePictureBullet();
// 保存文件
document.SaveToFile(@"out.docx", FileFormat.Docx);
document.Close();
调整:
// 创建 Document 对象
Document document = new Document();
// 添加一节
Section sec = document.AddSection();
Spire.Doc.Documents.Paragraph paragraph = sec.AddParagraph();
// 创建列表模板1
ListTemplate template = ListTemplate.BulletDefault;
ListDefinitionReference listRef = document.ListReferences.Add(template);
// 创建列表模板2
ListTemplate template1 = ListTemplate.NumberDefault;
ListDefinitionReference listRef1 = document.ListReferences.Add(template1);
listRef1.Levels[2].StartAt = 4;
int levelcount = listRef.Levels.Count;
// 添加段落并应用样式
paragraph = sec.AddParagraph();
paragraph.AppendText("项目 1");
paragraph.ListFormat.ApplyListRef(listRef, 1);
paragraph = sec.AddParagraph();
paragraph.AppendText("项目 2");
paragraph.ListFormat.ApplyListRef(listRef, 2);
paragraph = sec.AddParagraph();
paragraph.AppendText("项目3");
paragraph.ListFormat.ApplyListRef(listRef1, 1);
paragraph = sec.AddParagraph();
paragraph.AppendText("项目 4");
paragraph.ListFormat.ApplyListRef(listRef1, 2);
// 保存文件
document.SaveToFile("out.docx", FileFormat.Docx);
document.Close();
ListStyle listStyle = document.Styles.Add(ListType.Numbered, "levelstyle");
listStyle.IsCustomStyle = true;
listStyle.CharacterFormat.FontName = "Trebuchet MS";
ListLevelCollection levels = listStyle.ListRef.Levels;
levels[0].PatternType = ListPatternType.Arabic;
levels[0].StartAt = 1;
levels[0].CharacterFormat.FontName = "Trebuchet MS";
ListStyle numberList2 = document.Styles.Add(ListType.Numbered, "Numbered2");
ListLevelCollection Levels = numberList2.ListRef.Levels;
Levels[0].StartAt = 10;

PowerPoint(PPT 和 PPTX)文档通常包含文本、图像、表格、图表、形状及元数据等多种内容类型。通过编程方式提取这些元素,不仅能简化重复性工作,还能支持内容迁移与数据分析等高级应用。本文将以专业的 PPT 操作库 Spire.Presentation for Python 为基础,系统介绍如何高效、精准地提取 PowerPoint 文档中的各类信息 。
目录:
在 Python 中处理 PowerPoint 文件,我们将使用 Spire.Presentation for Python。这个功能丰富的库能让开发者高效地创建、编辑和读取 PowerPoint 演示文稿内容,只需少量代码即可提取文本、图像、表格、SmartArt 和元数据。
开始之前,请通过 pip 安装该库:
pip install spire.presentation
接下来,我们将深入探讨从 PowerPoint 文件中提取内容的不同方法。
PowerPoint幻灯片中的文本可能存在于多种元素中——形状、表格、SmartArt等。下面我们将分别介绍如何从这些元素中提取文本内容。
幻灯片中的文本主要存储在形状对象(如文本框、标签等)中。以下是具体提取方法:
操作步骤指南
代码示例
from spire.presentation import *
from spire.presentation.common import *
# 创建 Presentation 类的对象
presentation = Presentation()
# 加载 PowerPoint 演示文稿
presentation.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pptx")
# 创建一个列表
text = []
# 遍历文档中的幻灯片
for slide_index, slide in enumerate(presentation.Slides):
# 添加幻灯片标记
text.append(f"====幻灯片 {slide_index + 1}====")
# 遍历幻灯片中的形状
for shape in slide.Shapes:
# 检查形状是否为 IAutoShape 对象
if isinstance(shape, IAutoShape):
# 遍历形状中的段落
for paragraph in shape.TextFrame.Paragraphs:
# 获取段落文本并添加到列表
text.append(paragraph.Text)
# 将文本写入 txt 文件
with open("output/ExtractAllText.txt", "w", encoding='utf-8') as f:
for s in text:
f.write(s + "\n")
# 释放资源
presentation.Dispose()
效果图:

PowerPoint 表格以结构化形式存储数据,提取时需要遍历行及行中的单元格以保持原有表格结构。
操作步骤指南
代码示例
from spire.presentation import *
from spire.presentation.common import *
# 创建一个 Presentation 对象
presentation = Presentation()
# 加载 PowerPoint 文件
presentation.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pptx")
# 创建一个列表用于存储表格
tables = []
# 遍历幻灯片
for slide in presentation.Slides:
# 遍历幻灯片中的形状
for shape in slide.Shapes:
# 检查形状是否为表格
if isinstance(shape, ITable):
tableData = ""
# 遍历表格中的行
for row in shape.TableRows:
rowData = ""
# 遍历行中的单元格
for i in range(row.Count):
# 获取单元格值
cellValue = row[i].TextFrame.Text
# 添加单元格值并加上空格以提高可读性
rowData += (cellValue + " | " if i < row.Count - 1 else cellValue)
tableData += (rowData + "\n")
tables.append(tableData)
# 将表格写入文本文件
for idx, table in enumerate(tables, start=1):
fileName = f"output/Table-{idx}.txt"
with open(fileName, "w", encoding='utf-8') as f:
f.write(table)
# 释放资源
presentation.Dispose()
效果图:

SmartArt 是 PowerPoint 中用于创建图表的特色功能,提取其文本需要访问节点并获取每个节点的文本内容。
操作步骤指南
代码示例
from spire.presentation.common import *
from spire.presentation import *
# 创建一个 Presentation 对象
presentation = Presentation()
# 加载 PowerPoint 文件
presentation.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pptx")
# 遍历演示文稿中的每一张幻灯片
for slide_index, slide in enumerate(presentation.Slides):
# 创建一个列表以存储当前幻灯片提取的文本
extracted_text = []
# 遍历幻灯片上的形状并寻找 SmartArt 形状
for shape in slide.Shapes:
if isinstance(shape, ISmartArt):
smartArt = shape
# 从 SmartArt 节点中提取文本并添加到列表
for node in smartArt.Nodes:
extracted_text.append(node.TextFrame.Text)
# 将提取的文本写入每张幻灯片的单独文本文件
if extracted_text: # 只有在提取到文本时才创建文件
file_name = f"output/SmartArt-from-slide-{slide_index + 1}.txt"
with open(file_name, "w", encoding="utf-8") as text_file:
for text in extracted_text:
text_file.write(text + "\n")
# 释放资源
presentation.Dispose()
效果图:

您可能感兴趣: Python 读取 PowerPoint 中的演讲者备注
除了文本内容,幻灯片中的图片元素同样可能是重要分析素材。本节将演示如何提取并保存幻灯片中的图片资源。
操作步骤指南
代码示例
from spire.presentation.common import *
from spire.presentation import *
# 创建一个 Presentation 对象
presentation = Presentation()
# 加载 PowerPoint 文档
presentation.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pptx")
# 获取文档中的图像
images = presentation.Images
# 遍历文档中的图像
for i, image in enumerate(images):
# 将特定图像保存到指定路径
ImageName = "Output/Images_" + str(i) + ".png"
image.Image.Save(ImageName)
# 释放资源
presentation.Dispose()
效果图:

提取元数据可以获取演示文稿的关键信息,包括标题、作者、关键词等。本节将指导您如何访问并保存这些元数据。
操作步骤指南
from spire.presentation.common import *
from spire.presentation import *
# 创建一个 Presentation 对象
presentation = Presentation()
# 加载 PowerPoint 文档
presentation.LoadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pptx")
# 获取 DocumentProperty 对象
documentProperty = presentation.DocumentProperty
# 准备文本文件的内容
properties = [
f"标题: {documentProperty.Title}",
f"主题: {documentProperty.Subject}",
f"作者: {documentProperty.Author}",
f"经理: {documentProperty.Manager}",
f"公司: {documentProperty.Company}",
f"类别: {documentProperty.Category}",
f"关键词: {documentProperty.Keywords}",
f"评论: {documentProperty.Comments}",
]
# 将属性写入文本文件
with open("output/DocumentProperties.txt", "w", encoding="utf-8") as text_file:
for line in properties:
text_file.write(line + "\n")
# 释放资源
presentation.Dispose()
效果图:

您可能感兴趣: Python 为 PowerPoint 文件添加文档属性
Spire.Presentation for Python为开发者提供了一套强大的API工具集,能够精准高效地提取PowerPoint文档中的各类结构化内容。无论是文字信息、可视化元素还是元数据,都能通过简洁的代码实现自动化获取和处理。
借助该库的强大功能,您可以轻松应对企业级PPT文档处理需求,从批量内容分析到智能报表生成,从自动化文档转换到深度数据挖掘,为各类业务场景提供可靠的技术支持。其稳定流畅的性能表现,让大规模PPT文件处理变得简单高效。
可以。Spire.Presentation 能够打开和处理受密码保护的 PowerPoint 文件。要访问加密文件,请使用带密码参数的 LoadFromFile() 方法:
presentation.LoadFromFile("encrypted.pptx", "yourpassword")
您可以使用 Spire.Presentation 库读取幻灯片中的批注。方法如下:
from spire.presentation import Presentation
presentation = Presentation()
presentation.LoadFromFile("Input.pptx")
with open("PowerPoint_Comments.txt", "w", encoding="utf-8") as file:
for slide_idx, slide in enumerate(presentation.Slides):
if len(slide.Comments) > 0:
for comment_idx, comment in enumerate(slide.Comments):
file.write(f"Comment {comment_idx + 1} from Slide {slide_idx + 1}: {comment.Text}\n")
基础文本提取仅获取原始文本内容。如需获取格式化文本(字体、颜色等),您需要访问其他属性,如 TextRange.LatinFont 和 TextRange.Fill。
虽然 Spire.Presentation 能处理大多数标准演示文稿,但对于超大文件(数百MB),可能需要优化以获得更好的性能。
可以。Spire.Presentation 允许您创建 PowerPoint 文档并修改现有文档。该库提供了一系列功能,包括添加新幻灯片、插入文本、图片、表格和形状,以及编辑现有内容。
如果您需要去除生成文档中的评估提示或解除功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。
Spire.Cloud 10.7.10 现已正式发布。最新版本支持了针对 Excel 文档的文档保护功能。更多详情请查阅下面的内容。
新功能:


在 C# 中将 DataTable 导出为 Excel 文件,是 .NET 开发中常见的任务,广泛应用于报表生成、日志导出、系统间数据共享等场景。通过使用独立的组件库,开发者可以轻松将 DataTable 数据写入 Excel 文件,并应用格式设置,生成专业、可直接使用的文档,无需复杂配置或依赖第三方办公软件。
本文将介绍如何使用 Spire.XLS for .NET 将 DataTable 导出为 Excel(.xlsx/.xls)文件,包含数据创建、导出保存、格式设置等实用步骤。
文章目录:
开始之前,请确保你的项目中已添加 Spire.XLS for .NET。
通过 NuGet 安装 Spire.XLS:
Install-Package Spire.XLS
Spire.XLS 支持 .NET Framework、.NET Core、.NET 6/7+ 以及 ASP.NET 项目,且无需安装 Microsoft Office。
下面的步骤将演示如何使用 Spire.XLS 将 DataTable 导出为 Excel 文件,包含数据准备、文件保存、网页流导出以及格式设置等内容。
先创建一个包含多列的 DataTable:
// 创建数据表
DataTable dt = new DataTable("员工信息");
// 添加列
dt.Columns.Add("员工编号", typeof(int));
dt.Columns.Add("姓名", typeof(string));
dt.Columns.Add("部门", typeof(string));
dt.Columns.Add("入职日期", typeof(DateTime));
dt.Columns.Add("工资", typeof(double));
dt.Columns.Add("是否全职", typeof(bool));
dt.Columns.Add("奖金系数", typeof(decimal));
// 添加数据行
dt.Rows.Add(1001, "张伟", "人事部", new DateTime(2021, 5, 10), 55000.5, true, 0.05m);
dt.Rows.Add(1002, "李娜", "技术部", new DateTime(2020, 11, 23), 72000.0, false, 0.03m);
dt.Rows.Add(1003, "王强", "财务部", new DateTime(2019, 8, 15), 63000.75, true, 0.07m);
dt.Rows.Add(1004, "赵敏", "市场部", new DateTime(2022, 3, 8), 48800.0, true, 0.06m);
此处为演示用示例数据,实际使用中可绑定任意业务生成的 DataTable。
将 DataTable 导入到工作表中,并保存为 Excel 文件:
Workbook workbook = new Workbook();
workbook.Worksheets.Clear();
Worksheet sheet = workbook.Worksheets.Add(dt.TableName);
// 从 A1 单元格开始插入数据表
sheet.InsertDataTable(dt, true, 1, 1);
// 保存为 .xlsx 文件(推荐)
workbook.SaveToFile("员工信息.xlsx", FileFormat.Version2016);
// 保存为 .xls 文件(旧格式)
workbook.SaveToFile("员工信息.xls", FileFormat.Version97to2003);
说明:
导出效果示意图:

在 Web 项目中,通常需要将 Excel 文件直接以下载流的方式返回:
MemoryStream stream = new MemoryStream();
workbook.SaveToStream(stream, FileFormat.Version2013);
stream.Position = 0;
将此 MemoryStream 返回到 ASP.NET 控制器中,即可触发浏览器下载。
更多 Excel 文件操作技巧可参考:如何在 C# 中创建与操作 Excel 文件
若希望导出的 Excel 文件更具可读性和专业感,可以对内容进行格式化:
// 设置表头样式
CellRange header = sheet.Rows[0];
header.Style.Font.IsBold = true;
header.Style.Font.FontName = "微软雅黑";
header.Style.Font.Size = 13;
header.Style.Color = Color.LightGray;
header.Style.Borders[BordersLineType.EdgeBottom].LineStyle = LineStyleType.Thick;
// 设置数据行样式
for (int i = 1; i < sheet.Rows.Length; i++)
{
CellRange dataRow = sheet.Rows[i];
dataRow.Style.Font.FontName = "黑体";
dataRow.Style.Font.Size = 11;
dataRow.BorderInside();
}
// 设置日期列的显示格式
CellRange dateColumn = sheet.Range[2, 4, sheet.Rows.Length + 1, 4];
dateColumn.Style.NumberFormat = "yyyy-mm-dd";
// 自动调整列宽
sheet.AllocatedRange.AutoFitColumns();
关键方法说明:
格式化效果示意图:

更多数字格式设置技巧请参阅:在 C# 中设置 Excel 单元格数字格式
| 问题描述 | 解决方法 |
|---|---|
| 文件无法打开或提示损坏 | 检查是否正确关闭流,且文件后缀与格式匹配 |
| 特殊字符或中文乱码 | 确保字符串为 UTF-8 编码,字体设置支持目标语言 |
| 列宽过窄导致显示不全 | 使用 AutoFitColumns() 自动调整,或手动设置 ColumnWidth |
借助 Spire.XLS,开发者可轻松地将 C# 中的 DataTable 导出为 Excel 文件,支持 .xls 和 .xlsx 两种格式,且无需依赖 Office 环境。无论是桌面应用还是 Web 系统,该方法都能快速生成格式良好的 Excel 报表。
如需评估完整版功能,可申请免费临时授权。
使用 sheet.InsertDataTable() 将 DataTable 写入工作表,然后调用 workbook.SaveToFile() 保存文件。
有,Free Spire.XLS for .NET 是一个独立库,可在无需安装 Office 的前提下创建与导出 Excel 文件。
可以,在 ASP.NET 控制器中生成工作簿,并以流的方式返回,实现下载功能。
.xlsx 是较新的格式,兼容 Excel 2007 及更高版本;.xls 为旧版格式(Excel 97-2003),行数限制为 65536 行。