在整理来自其他系统的 Word 文档时,正文中常会残留不再使用的说明段落,也会因为复制粘贴与多次换行而出现大量空白段落。这类内容既占用篇幅,也影响文档的规范性与可读性。逐段手工删除需要有人反复操作,难以接入批量处理的 Web 流程;放到服务端处理,则意味着文档需要上传到服务器。
本文用 Spire.Doc for JavaScript 在浏览器中删除 Word 文档中的段落。文档通过虚拟文件系统(VFS)加载,删除完成后保存并直接下载,整个过程基于 WebAssembly 在浏览器端运行,无需安装 Office,也不依赖后端服务。
本文介绍三个功能点:
有关安装和项目配置,请参考 React 项目中集成 Spire.Doc for JavaScript。下面的示例假定 Spire.Doc 已安装、WebAssembly 模块已初始化。
删除 Word 文档中的指定段落
Word 文档中的一个节由若干正文对象组成,其中的段落由 Section.Paragraphs 集合管理。Spire.Doc for JavaScript 为该集合提供两种删除方式:
| 方法 | 依据 |
|---|---|
Paragraphs.RemoveAt(index) |
段落的位置(0 基索引) |
Paragraphs.Remove(paragraph) |
段落对象本身 |
索引从 0 开始,第 1 段对应索引 0。每删除一段,其后段落的索引都会前移一位。示例文档共 11 个段落,其中第 6 段(索引 5)是 2019 版遗留的说明文字,正式发布前需要删除。
具体操作步骤如下:
- 获取 Spire.Doc 的 WASM 模块,确认已就绪。
- 载入字体,把示例文档读入 VFS 并加载为
Document。 - 取第一个节,调用
Section.Paragraphs.RemoveAt()删除索引为 5 的段落。 - 使用
SaveToFile()保存结果文件。 - 从 VFS 读出结果文件并触发浏览器下载。
删除 Word 文档中指定段落的代码如下:
function App() {
const removeParagraph = async () => {
// 获取 Spire.Doc 的 WASM 模块
const wasmModule = window.wasmModule?.spiredoc;
// 检查模块是否就绪
if (!wasmModule) {
alert('Spire.Doc is not ready yet');
return;
}
// 载入待处理的文档
await window.spire.FetchFileToVFS('Sample.docx', '', `${process.env.PUBLIC_URL}/data/`);
// 创建 Document 实例并加载文档
const doc = new wasmModule.Document();
doc.LoadFromFile('Sample.docx');
// 取第一个节
const section = doc.Sections.get_Item(0);
// 删除索引为 5 的段落,即正文中的第 6 段
section.Paragraphs.RemoveAt(5);
// 保存结果文件
const outputFileName = 'RemoveParagraph.docx';
doc.SaveToFile({ fileName: outputFileName, fileFormat: wasmModule.FileFormat.Docx2013 });
doc.Dispose();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>删除 Word 文档中的指定段落</h1>
<button onClick={removeParagraph}>
删除指定段落
</button>
</div>
);
}
export default App;
删除指定段落后的文档,原第 6 段已不在正文中:

按段落对象删除指定段落
Paragraphs.RemoveAt() 按位置删除,Paragraphs.Remove() 则直接接收一个段落对象。需要删除某一段时,先用 Paragraphs.get_Item(index) 取出该段,再交给 Remove() 删除:
// 按对象删除:先取出索引为 5 的段落,再删除它
const section = doc.Sections.get_Item(0);
const paragraph = section.Paragraphs.get_Item(5);
section.Paragraphs.Remove(paragraph);
两种写法的删除结果相同。已经持有段落引用、无需再关心其位置时,按对象删除更为直接。
删除 Word 文档中的空白段落
空白段落是正文中不含任何文字的段落,常见于从网页复制内容或经多次换行编辑的文档。判断一个段落是否为空白段落,可以读取其 Text 属性,去掉首尾空白后为空字符串即视为空白;仅包含空格的段落同样属于空白段落。
Section.Body.ChildObjects 是节正文的子对象集合,其中既有段落,也有表格等其他正文对象。遍历时通过 DocumentObjectType 属性区分对象类型,只处理段落。示例文档在正文段落之间夹有 6 处空白段落,其中两处仅含空格:

具体操作步骤如下:
- 获取 Spire.Doc 的 WASM 模块,确认已就绪。
- 载入字体,把示例文档读入 VFS 并加载为
Document。 - 遍历文档中的每个节,取得节正文的
Body.ChildObjects集合。 - 从后往前遍历集合,对
DocumentObjectType为DocumentObjectType.Paragraph、且Text去掉首尾空白后为空的对象,用ChildObjects.Remove()删除。 - 使用
SaveToFile()保存结果文件,并从 VFS 读出结果文件触发浏览器下载。
删除 Word 文档中空白段落的代码如下:
function App() {
const removeBlankParagraphs = async () => {
// 获取 Spire.Doc 的 WASM 模块
const wasmModule = window.wasmModule?.spiredoc;
// 检查模块是否就绪
if (!wasmModule) {
alert('Spire.Doc is not ready yet');
return;
}
// 载入待处理的文档
await window.spire.FetchFileToVFS('SampleWithBlankLines.docx', '', `${process.env.PUBLIC_URL}/data/`);
// 创建 Document 实例并加载文档
const doc = new wasmModule.Document();
doc.LoadFromFile('SampleWithBlankLines.docx');
// 逐个节处理,示例文档只有一个节
for (let s = 0; s < doc.Sections.Count; s++) {
const body = doc.Sections.get_Item(s).Body;
// 从后往前遍历,删除后不影响尚未处理的下标
for (let i = body.ChildObjects.Count - 1; i >= 0; i--) {
const item = body.ChildObjects.get_Item(i);
// 只处理段落,表格等其他正文对象保持不动
if (item.DocumentObjectType !== wasmModule.DocumentObjectType.Paragraph) {
continue;
}
// 去掉首尾空白后为空,即视为空白段落
if (item.Text.trim() === '') {
body.ChildObjects.Remove(item);
}
}
}
// 保存结果文件
const outputFileName = 'RemoveBlankParagraphs.docx';
doc.SaveToFile({ fileName: outputFileName, fileFormat: wasmModule.FileFormat.Docx2013 });
doc.Dispose();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>删除 Word 文档中的空白段落</h1>
<button onClick={removeBlankParagraphs}>
删除空白段落
</button>
</div>
);
}
export default App;
删除空白段落后的文档,正文各段依次紧接排列:

删除 Word 文档中的所有段落
需要清空整篇文档的正文时,可以对每个节调用 Section.Paragraphs.Clear()。该方法删除该节正文的全部段落,无须逐个计算索引:
| 方法 | 作用范围 |
|---|---|
Section.Paragraphs.Clear() |
该节正文的全部段落 |
Section.Paragraphs.RemoveAt(index) |
该节正文中指定位置的段落 |
多节文档需要逐节清空。表格不属于段落集合,清空段落后表格仍然保留。
具体操作步骤如下:
- 获取 Spire.Doc 的 WASM 模块,确认已就绪。
- 载入字体,把示例文档读入 VFS 并加载为
Document。 - 遍历文档中的所有节,对每一节的段落集合调用
Section.Paragraphs.Clear()。 - 使用
SaveToFile()保存结果文件。 - 从 VFS 读出结果文件并触发浏览器下载。
删除 Word 文档中所有段落的代码如下:
function App() {
const removeAllParagraphs = async () => {
// 获取 Spire.Doc 的 WASM 模块
const wasmModule = window.wasmModule?.spiredoc;
// 检查模块是否就绪
if (!wasmModule) {
alert('Spire.Doc is not ready yet');
return;
}
// 载入待处理的文档
await window.spire.FetchFileToVFS('Sample.docx', '', `${process.env.PUBLIC_URL}/data/`);
// 创建 Document 实例并加载文档
const doc = new wasmModule.Document();
doc.LoadFromFile('Sample.docx');
// 逐个节清空正文段落
for (let s = 0; s < doc.Sections.Count; s++) {
doc.Sections.get_Item(s).Paragraphs.Clear();
}
// 保存结果文件
const outputFileName = 'RemoveAllParagraphs.docx';
doc.SaveToFile({ fileName: outputFileName, fileFormat: wasmModule.FileFormat.Docx2013 });
doc.Dispose();
// 从 VFS 读取生成的文件,触发下载
const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
const blob = new Blob([fileArray], { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = outputFileName;
a.click();
URL.revokeObjectURL(url);
};
return (
<div style={{ textAlign: 'center', height: '300px' }}>
<h1>删除 Word 文档中的所有段落</h1>
<button onClick={removeAllParagraphs}>
删除所有段落
</button>
</div>
);
}
export default App;
常见问题
删除段落时,为什么删掉的不是预期的那一段
Section.Paragraphs 按位置索引,索引从 0 开始,正文中的空白段落也计入其中。同一位置的索引在不同文档里对应的段落通常并不相同:示例文档删掉了第 6 段,换一份文档后索引 5 可能就是别的内容。删除之前可以先遍历集合读取各段的 Text 确认位置;也可以按内容查找,定位到目标段落后改用 Paragraphs.Remove() 删除。
删除空白段落后,为什么段落之间仍然有间隙
段落之间的空隙有两个来源:空白段落本身,以及段落自身的段前间距、段后间距与行距。删除空白段落只去掉第一种来源;示例文档的正文段落段后间距为 6 磅,因此各段之间仍会留出间距。需要更紧凑的版面时,可以改为调整段落格式中的间距,例如将每个正文段落的段后间距设为 0:
// 将每个正文段落的段后间距设为 0,单位:磅
const paragraphs = doc.Sections.get_Item(0).Paragraphs;
for (let i = 0; i < paragraphs.Count; i++) {
paragraphs.get_Item(i).Format.AfterSpacing = 0;
}
文档中的表格会被一起删除吗
不会。Clear() 作用于 Section.Paragraphs,该集合中只有正文段落;表格是正文中的另一种对象,不在集合之内,清空段落后表格仍然保留。表格单元格里的段落同样不属于 Section.Paragraphs,遍历节正文对象删除空白段落时也不会进入表格内部。
一次删除多个段落时,为什么会出现下标越界
每删除一段,其后段落的索引前移一位,段落总数也随之减少。按递增的固定索引依次删除时,第二次删除的往往已不是原来那几段;索引超过 Paragraphs.Count - 1 后,RemoveAt() 会抛出 ArgumentOutOfRange_IndexMustBeLess。删除多段时可以从后往前删,也可以每次都删索引 0,或与遍历正文对象时一样在删除后调整下标。
保存后的文档为什么多出一段英文提示
使用评估版保存时,Spire.Doc 会向正文插入一段评估提示(Evaluation Warning: The document was created with Spire.Doc for JavaScript.),它与段落删除的代码逻辑无关。申请临时许可证或使用正式授权后,保存结果中不再出现该段落。
获取免费许可证
如果您希望删除结果文档中的评估消息,或者摆脱功能限制,请该Email地址已收到反垃圾邮件插件保护。要显示它您需要在浏览器中启用JavaScript。获取有效期 30 天的临时许可证。







