WORD文档数据获取
WORD数据提取-C#
编写:林峰
日期:2011-09-12
序言
WORD是一个很普遍的文字处理软件,通过C#可以使用相应的COM组件来访问到其中的数据,从而达到数据提取的作用。本文中主要介绍的是关于:WORD图片抓取,WORD表格数据获取,WORD文本数据获取的内容。
一些介绍
在一些官方的文档中,主要的介绍其对于WORD对象的术语包括了:范围range对象、段落paragraph对象、句子sentences对象。这些都是比较常见和经常使用的对象。本文将主要以这些对象为基础来顺序获取数据。包括了项目的提取、图像获取、文本获取、表格数据获取。
项目获取
常见项目包括了:1.0,1.1,如此样式的标题可以通过如下代码:
//获取段落的列表值
private String AnalysisList(Paragraph p)
{
String result = null;
if (!String.IsNullOrEmpty(p.Range.ListFormat.ListString))
{
result = p.Range.ListFormat.ListString;
}
return result;
}
其中将段落这个对象的属性进行判断,如果其的项目列表名称不为空则表明这是一个项目,而段落中的内容则是标题。
图像获取
图像获取主要就是根据段落或者是全局的DOC对象中的InlineShapes属性来进行判断是否包含了图片。然后根据InlineShapes之中的InlineShape对象的Type来决定是什么类型的图片,常见的图片常量在WdInlineShapeType里面,一般都是WdInlineShapeType.wdInlineShapePicture也就是其图形图片。获取其中的内容通过如下代码:if (pp.Range.InlineShapes.Count> 0)
{
if (pp.Range.InlineShapes[1].Type == WdInlineShapeType.wdInlineShapePicture)
{
InlineShapess = pp.Range.InlineShapes[1];
WORDImagewi = new WORDImage();
wi.start = pp.Range.Start;
wi.byteContent = (byte[])ss.Range.EnhMetaFileBits;
currentListContent.wordImages.Add(wi);
}
}
其中pp为段落对象Paragraph。
文本获取
文本对象主要通过paragraph对象中的属性来获取详细的代码如下:
String content = TrimLine(pp.Range.Text);
if (!String.IsNullOrEmpty(content))
{
PlainTextpt = new PlainText();
pt.start = pp.Range.Start;
pt.content = TrimLine(content);
currentListContent.plainTexts.Add(pt);
}
其中TrimLine是一个函数内容为:
private String TrimLine(String old)
{
returnold.Replace("\r\a", "");
}
替换掉其中的不能正常显示的字符。
表格数据获取
表格数据获取是一个比较棘手的问题,因为如果你使用全局的对象来直接访问表格的话,你将很难定位表格出现在什么段落,什么项目列表的标题下,因此可以在遍历全局的段落paragraph时候,根据段落的开始位置一个叫做start的属性,来确定该段落是否在表格中。如果在表格中,具体定位都特定的表格后再解析。就能轻松的明白,这个表格的位置。解析表格中的数据就比较简单了,直接通过表格对象table就能获取其中的行和列的数据。代码如下:
//获取所有表格的开始和结束位置
privateint[,] GetAllTableStartEnd(Document doc)
{
int rows = doc.Tables.Count;
int[,] result = new int[rows, 2];
for (int i = 1; i <= rows; i++)
{
result[i - 1, 0] = doc.Tables[i].Range.Start;
result[i - 1, 1] = doc.Tables[i].Range.End;
}
return result;
}
//传入相应的表格的范围、段落、文档、需要填充的内容对象从而得到当前段落所在表格的最后位置如果没有就为-1
privateintAnalysisGrid(int[,] tableScale, Paragraph p, Document doc, ListContentlc)
{
intgridEnd = -1;
inttableIndex = -1;
for (int i = 0; i { if (p.Range.Start>= tableScale[i, 0] &&p.Range.End<= tableScale[i, 1]) { gridEnd = tableScale[i, 1]; tableIndex = i; break; } } //如果在表格中 if (gridEnd != -1) { //填充表格数据对象添加到列表中 GridDatagd = FillGridData(doc.Tables[tableIndex + 1]); lc.gridDatas.Add(gd); } returngridEnd; } 该方法的核心就是段落的遍历和基于位置来定位表格,之后解析表格数据。在跳过表格的末端的段落。 //解析列表中数据要在最新分析的表格之后的段落else if (currentListContent != null &&p.Range.Start>lastGridEnd) { //分析该段落是否在表格中是获取该表格最后位置lastGridEnd = AnalysisGrid(this.GetAllTableStartEnd(doc), p, doc, currentListContent); //如果不在表格中分析填充列表内容if (lastGridEnd == -1) { FillListContent(p, currentListContent); } } 总结 以上的内容简单的介绍了在WORD中获取所需要的数据的方法,其中有不少的问题。不过在实际应用中可以灵活的进行操作。主要围绕着段落,句子,范围。这些基本的对象就可以解决问题了。