NPOI的XWPFParagraph对象中,是无法直接读取段落编号的,然而可以读取的是编号的样式名称(GetNumFmt),编号分组ID(GetNumID),编号样式(NumLevelText)等。具体如下:

/*
* 若干格式信息
* GetNumFmt: decimal, GetNumID: 1, GetNumIlvl: 0, NumLevelText: %1. => 1.
* GetNumFmt: decimal, GetNumID: 4, GetNumIlvl: 0, NumLevelText: %1) => 1)
* GetNumFmt: chineseCountingThousand, GetNumID: 2, GetNumIlvl: 0, NumLevelText: (%1) => (一)
* GetNumFmt: chineseCountingThousand, GetNumID: 3, GetNumIlvl: 0, NumLevelText: %1、 => 一、
* GetNumFmt: upperLetter, GetNumID: 5, GetNumIlvl: 0, NumLevelText: %1. => A.
* GetNumFmt: decimal, GetNumID: 6, GetNumIlvl: 0, NumLevelText: %1、 => 1、
*/

若干格式信息

于是封装了段落编号的处理类,几个关键点:

1、考虑频繁调用,使用单例。

2、依照NumLevelText内容替换编号的样式

3、编号分组发生变化时,编号要重置为1,采用字典记录

4、汉字、字母统一处理为数字编号

5、读取一个新Word时,字典内容要清空

段落处理类:

     /// <summary>
/// 段落处理类
/// Author: Matsuyoi
/// </summary>
class ParagraphNumHandle
{
#region 封装为单例
private static ParagraphNumHandle singleton = null;
public static ParagraphNumHandle GetInstance()
{
if (singleton == null)
singleton = new ParagraphNumHandle();
//获取单例后重置一次变量
singleton.Reset();
return singleton;
}
#endregion
//Num字典
private Dictionary<string, int> _Count;
private ParagraphNumHandle()
{
_Count = new Dictionary<string, int>();
}
/// <summary>
/// 重置
/// </summary>
private void Reset()
{
//清空字典
_Count.Clear();
}
/// <summary>
/// 处理段落中的编号,汉字与字母编号统一转为数字编号
/// </summary>
/// <param name="paragraph"></param>
/// <returns></returns>
public string GetParagraphNum(XWPFParagraph paragraph)
{
string result = "";
//若无编号格式信息,则返回空
if (string.IsNullOrEmpty(paragraph.GetNumFmt()) ||
string.IsNullOrEmpty(paragraph.GetNumID()) ||
string.IsNullOrEmpty(paragraph.NumLevelText))
{
return result;
} string key = paragraph.GetNumID() ?? "";
if (!_Count.ContainsKey(key))
{
//编号从1开始
_Count.Add(key, );
}
else
{
_Count[key] += ;
} string fmt = paragraph.NumLevelText.Replace("%1", "{0}");
result = string.Format(fmt, _Count[key].ToString()) + " ";
return result;
}
}

调用方式:

//段落编号处理
ParagraphNumHandle pnc = ParagraphNumHandle.GetInstance();
//正文段落
foreach (XWPFParagraph paragraph in document.Paragraphs)
{
//获取段楼中的编号
string num = pnc.GetParagraphNum(paragraph); ... }

延续上一篇《NPOI处理Word文本中上下角标》的示例,完整代码如下:

/// <summary>
/// 读取Word,并识别文本中的上下角标
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static string ReadWordTextExWithSubscript(string fileName)
{ string fileText = string.Empty;
StringBuilder sbFileText = new StringBuilder(); #region 打开文档
XWPFDocument document = null;
try
{
using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
document = new XWPFDocument(file);
}
}
catch (Exception e)
{
throw e;
}
#endregion
//段落编号处理
ParagraphNumHandle pnc = ParagraphNumHandle.GetInstance();
//正文段落
foreach (XWPFParagraph paragraph in document.Paragraphs)
{
//获取段楼中的句列表
IList<XWPFRun> runsLists = paragraph.Runs;
//获取段楼中的编号
string num = pnc.GetParagraphNum(paragraph);
sbFileText.Append("<p>" + num);
foreach (XWPFRun run in runsLists)
{
switch (run.Subscript)
{
case VerticalAlign.BASELINE:
sbFileText.Append(run.Text);
break;
//上角标
case VerticalAlign.SUPERSCRIPT:
sbFileText.Append("<sup>" + run.Text + "</sup>");
break;
//下角标
case VerticalAlign.SUBSCRIPT:
sbFileText.Append("<sub>" + run.Text + "</sub>");
break;
default:
sbFileText.Append(run.Text);
break;
} }
sbFileText.AppendLine("</p>");
}
fileText = sbFileText.ToString(); return fileText;
}

测试:

Word文档:

输出:

<p>1. 第一段</p>
<p>2. 第二段</p>
<p>1) 第三段</p>
<p>(1) 第四段</p>
<p>(2) 第五段</p>
<p>1、 第六段</p>
<p>2、 第七段</p>
<p>1. 第八段</p>
<p>1、 第九段</p>
<p>2、 第十段</p>
<p>测试<sup>上</sup><sub>下</sub>ok。</p>
<p>CO<sub>2</sub></p>
<p>面积约6000km<sup>2</sup></p>

Html预览:

NPOI处理Word文本中段落编号的更多相关文章

  1. NPOI处理Word文本中上下角标

    读取Word文档,并将文本转成html标签,后面发现,经常有带上下角标的内容,于是一并处理了. 核心在于对XWPFRun对象中Subscript属性的处理. /// <summary> / ...

  2. Java 读取Word文本/段落格式属性

    本文介绍通过Java后端程序代码来读取Word文本和段落格式的方法. 本次测试环境如下: Word版本:2013 编译环境:IntelliJ IDEA2018 Work库:free spire.doc ...

  3. 使用SQLsever批量查询TXT文本中的值

    测试文档如下,需要查到case_no值为以下时,对应的单据信息分别是什么. 步骤如下: 在txt文本中 Ctrl+H,输入如下,点击“全部替换” 在word文本中,复制以上信息到word文本中,目的是 ...

  4. C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表

    调用word的com组件将400条数据导入word表格中耗时10分钟简直不能忍受,使用NPOI组件耗时4秒钟.但是NPOI中替换书签内容的功能不知道是不支持还是没找到. 辅助类 Excel表格数据与D ...

  5. Java 读取Word批注中的文本和图片

    本文将介绍读取Word批注的方法,包括读取Word批注中的文本及图片.关于操作Word批注的方法还可以参考这两篇文章:Java 添加.回复.修改.删除Word批注:Java 给Word指定字符串添加批 ...

  6. C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)

    [概述] Word中可插入文本框,在文本框中可添加文本.图片.表格等内容.本篇文章通过C#程序代码介绍如何来读取文本框中的文本.图片和表格等内容.附VB.NET代码,有需要可作参考. [程序环境] 程 ...

  7. Java 获取、删除Word文本框中的表格

    本文介绍如何来获取Word文本框中包含的表格,以及删除表格. 程序测试环境包括: IDEA JDK 1.8.0 Spire.Doc.jar 注:jar导入,可通过创建Maven程序项目,并在pom.x ...

  8. 二、spark入门之spark shell:文本中发现5个最常用的word

    scala> val textFile = sc.textFile("/Users/admin/spark-1.5.1-bin-hadoop2.4/README.md") s ...

  9. word 2010中设置默认粘贴为 只保留文本粘贴【visio也适用于快捷键方式】

    VISIO也适用如下方式: 3. 当然也可以直接是 Ctrl + Alt + V打开选择性粘贴选项卡 来选择其中某项来粘贴也是可以的 转: word 2010中设置默认粘贴为 只保留文本粘贴 2012 ...

随机推荐

  1. Maven下载与环境变量配置

    前言: Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK.如果还未安装 JDK,可以参考Win10下JDK下载与环境变量配置. 项目 要求 JDK Maven 3.3+ ...

  2. Python3环境搭建

    Python3环境搭建   Windows系统下安装Python3 Python3 下载 Python3 最新源码,二进制文档,新闻资讯等可以在 Python 的官网查看到: Python 官网:ht ...

  3. textarea跟随内容自动伸缩高度实现方案

    监听input事件,然后将textarea的style.height设置为最低高度(19px),进而获取到元素的scrollHeight,然后将scroolHeight设置为style.height

  4. web前端常见面试题

    转载自:https://www.cnblogs.com/jj-z/p/7999538.html 一.理论知识 1.1.讲讲输入完网址按下回车,到看到网页这个过程中发生了什么 a. 域名解析 b. 发起 ...

  5. 在Windows Server 2012下安装 php memcache模块

    一.环境描述 操作系统:Windows Server 2012 R2 Datacenter Web服务提供软件:Microsoft IIS 8.5.9600.16384 IIS调用PHP方法:增加处理 ...

  6. 汇编语言实验1 & macOS下DOSBox的安装

    一.macOS下DOSBox的安装 1.在官网下载DOSBox-0.74.dmg 打开,此时默认z盘 一番折腾,终于搞定debug 然后为了不用每次都执行mount,遂更改配置文件自动挂在目录 再次打 ...

  7. 15、TypeScript-函数

    1.参数和返回值可以指定类型 2.可选参数:在参数上加上?,表示可选的,可传可不传 3.默认参数:如果你不传参数,默认为20,如果你传参,就是你传的参数 4.剩余参数:会把传进来的实参变成一个数组,可 ...

  8. UIPath Level 2&3

    Level 3 走了很多弯路,但是学到了很多东西,贴一个Level3的吧,其他的省略了 认认真真独立做完Level3的两个POC,相信你对UIPath的理解会更深入一步 晚安,祝各位中秋节快乐!

  9. 用html和css制作奥运五环

    <html><head><meta charset="utf-8"> <style>.circle1,.circle2,.circl ...

  10. Chromedriver executable needs to be in path 解决办法

    执行webdriver.Chrome()时报错:Chromedriver executable needs to be in path. 原因可能是为有安装Chromedriver 可能是Chrome ...