NPOI处理Word文本中段落编号
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文本中段落编号的更多相关文章
- NPOI处理Word文本中上下角标
读取Word文档,并将文本转成html标签,后面发现,经常有带上下角标的内容,于是一并处理了. 核心在于对XWPFRun对象中Subscript属性的处理. /// <summary> / ...
- Java 读取Word文本/段落格式属性
本文介绍通过Java后端程序代码来读取Word文本和段落格式的方法. 本次测试环境如下: Word版本:2013 编译环境:IntelliJ IDEA2018 Work库:free spire.doc ...
- 使用SQLsever批量查询TXT文本中的值
测试文档如下,需要查到case_no值为以下时,对应的单据信息分别是什么. 步骤如下: 在txt文本中 Ctrl+H,输入如下,点击“全部替换” 在word文本中,复制以上信息到word文本中,目的是 ...
- C#调用NPOI组件读取excel表格数据转为datatable写入word表格中并向word中插入图片/文字/书签 获得书签列表
调用word的com组件将400条数据导入word表格中耗时10分钟简直不能忍受,使用NPOI组件耗时4秒钟.但是NPOI中替换书签内容的功能不知道是不支持还是没找到. 辅助类 Excel表格数据与D ...
- Java 读取Word批注中的文本和图片
本文将介绍读取Word批注的方法,包括读取Word批注中的文本及图片.关于操作Word批注的方法还可以参考这两篇文章:Java 添加.回复.修改.删除Word批注:Java 给Word指定字符串添加批 ...
- C# 读取Word文本框中的文本、图片和表格(附VB.NET代码)
[概述] Word中可插入文本框,在文本框中可添加文本.图片.表格等内容.本篇文章通过C#程序代码介绍如何来读取文本框中的文本.图片和表格等内容.附VB.NET代码,有需要可作参考. [程序环境] 程 ...
- Java 获取、删除Word文本框中的表格
本文介绍如何来获取Word文本框中包含的表格,以及删除表格. 程序测试环境包括: IDEA JDK 1.8.0 Spire.Doc.jar 注:jar导入,可通过创建Maven程序项目,并在pom.x ...
- 二、spark入门之spark shell:文本中发现5个最常用的word
scala> val textFile = sc.textFile("/Users/admin/spark-1.5.1-bin-hadoop2.4/README.md") s ...
- word 2010中设置默认粘贴为 只保留文本粘贴【visio也适用于快捷键方式】
VISIO也适用如下方式: 3. 当然也可以直接是 Ctrl + Alt + V打开选择性粘贴选项卡 来选择其中某项来粘贴也是可以的 转: word 2010中设置默认粘贴为 只保留文本粘贴 2012 ...
随机推荐
- C++ 获取Unix时间戳
什么是Unix时间戳? Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970 ...
- 让小乌龟可以唱歌——对Python turtle进行拓展
在Scratch中,小猫是可以唱歌的,而且Scratch的声音木块有着丰富的功能,在这方面Python turtle略有欠缺,今天我们就来完善一下. Python声音模块 Python处理声音的模块很 ...
- poj1676
保存不完整数字可能对应的数字,注意小时<24,分钟小于59. AC代码 #include <stdio.h> #include <vector> using namesp ...
- stylus入门学习笔记
title: stylus入门学习笔记 date: 2018-09-06 17:35:28 tags: [stylus] description: 学习到 vue, 有人推荐使用 stylus 这个 ...
- 本地连接属性:Internet协议版本4(TCP/IPv4)打开闪退解决办法
1.命令窗口配置网络连接指定IP netsh interface ip set address "本地连接" static IP地址 子网掩码 默认网关 例:netsh inter ...
- java笔记 -- 输入输出
读取输入: 如果想通过控制台进行输入, 首先需要构造一个Scanner对象.并与'标准输入流'System.in关联. 代码见下文代码块. Sanner (InputStream in) 用给定的输入 ...
- python中的mysql数据库like模糊查询
%在python中是个特殊的符号,如%s,%d分别代表了字符串占位符和数字占位符. 大家知道,mysql的模糊查询也需要用到%. 所以,可以先把需要查的字符串抽出来,再以参数方式传入. args = ...
- PyQt5——高级控件
PyQt5高级控件使用方法详见:https://blog.csdn.net/jia666666/article/list/4?t=1& PyQt5高级控件汇总: 1.QTableView 2. ...
- python+selenium的web自动化测试之二(Jenkins自动执行)
上一篇需要手工去到cmd下执行脚本,不符合自动化测试的终极目标.现我们集成到Jenkins上,通过Jenkins一键执行或定时任务执行. 参考: https://www.cnblogs.com/ces ...
- cowboy源码分析(三)
上接 cowboy源码分析(二) 我们接着分析cowboy_protocol.erl的request/7模块 -module(cowboy_protocol). %% API.-export([sta ...