由于word表格的特殊性,其本身中的数据本来就不够完善,不能够很好的知道其具体的合并、跨行的相关属性,表格的单位可能是PT或者是百分比,并且是共存的,为处理带来了一定的负担,本代码实现了一个将Word表格解析为XMLTable。

 由于没找到上传附件的位置,仅提供部分代码,有需要的可email我(提供联系方式)或进群:490571636,我会提供全部代码。

/// <summary>         /// 分析表格通过位置跨度         /// </summary>         /// <param name="table">word表格对象</param>         /// <returns>自定义的表格对象</returns>         public static WordTable ParserTableByPositionSpan(Word.Table table)         {             List<double> positionList = new List<double>();             WordTable wordTable = new WordTable();

wordTable.RowCount = table.Rows.Count;             wordTable.ColCount = table.Columns.Count;             positionList.Add(0);             double tableWidth = 0;             //获取所有行中的单元格及位置列表 如果有的列没有获取,说明没有或被上边的单元格合并(只有上边被合并的列才会)             for (var row = 1; row <= table.Rows.Count; row++)             {                 WTRow currRow = wordTable.AddRow();                 currRow.RowIndex = row;                 double leftPosition = 0;                 for (var col = 1; col <= table.Columns.Count; col++)                 {                     Word.Cell cell = null;                     try                     {                         //获取指定位置的单元格,如果没有会触发异常                         cell = table.Cell(row, col);                     }                     catch (Exception e)                     {                         //System.Diagnostics.Trace.                     }                                         //指定的位置有单元格则直接添加到当前行                     if (cell != null)                     {                         //第一行的宽度肯定会有值不会了现9999999的情况                         if (row == 1)                         {                             tableWidth += cell.Width;                         }                                                                         WTCol wTCol = currRow.AddCol();                         wTCol.Value = GetRangeParagraphs(cell.Range);

double width = cell.Width;                                                 //cell的宽度有三种形式                         //按内容展示(磅值)Word.WdPreferredWidthType.wdPreferredWidthAuto 属性width有值 PreferredWidth为0                         //固定宽度(磅值) Word.WdPreferredWidthType.wdPreferredWidthPoints 属性width有值 PreferredWidth有时为9999999                         //匹配窗口(百分比)Word.WdPreferredWidthType.wdPreferredWidthPercent 属性width有时为9999999 PreferredWidth为百分比                         switch (cell.PreferredWidthType)                         {                             case Word.WdPreferredWidthType.wdPreferredWidthAuto:                                 width = cell.Width;                                 break;                             case Word.WdPreferredWidthType.wdPreferredWidthPoints:                                 ///9999999为百分比或磅值时  取PreferredWidth的宽度                                 if (width == 9999999)                                 {                                     width = cell.PreferredWidth;                                 }                                 break;                             case Word.WdPreferredWidthType.wdPreferredWidthPercent:                                 ///9999999为百分比或磅值时  width和PreferredWidth所对应的宽度                                 if (width == 9999999)                                 {                                     width = GetPercentWidth(tableWidth, cell.PreferredWidth);                                 }                                 break;                         }                                                 wTCol.Width = width;                         wTCol.RealCol = col;                         wTCol.Left = leftPosition;                         leftPosition += width;                         AddNewPosition(positionList, leftPosition);                         continue;                     }

//WTCol prevRowWTCol1 = wordTable.GetPreviousRowRefCol(row, col);                     //WTCol prevRowWTCol2 = wordTable.GetPreviousRowRefColByLeft(row, leftPosition);                     WTCol prevRowWTCol1 = wordTable.GetPreviousRowRefColByLeft(row, leftPosition);                                         //第一列 如果没有单元格说明被上边的行给合并了                     if (prevRowWTCol1 != null)                     {                         //if (prevRowWTCol1.Left + prevRowWTCol1.Width > leftPosition)                         {                             prevRowWTCol1.RowSpan += 1;                         }                         leftPosition += prevRowWTCol1.Width;                         continue;                     }                                        //if (prevRowWTCol2 != null)                     //{

//}                     //else                 }             }

wordTable.ColCount = positionList.Count - 1;

//矫正列合并处理 由于列合并不会产生空的单元格,以列宽判断列合并情况(默认均为合并1列)             foreach (var row in wordTable.Rows)             {                 //int realColCount = 1;                 foreach (var col in row.Cols)                 {                     int colSpan = GetPositionSpan(positionList, col.Left, col.Left + col.Width);

col.ColSpan = colSpan;                     col.RealCol = GetRealColByPositionList(positionList, col.Left); //realColCount;                     //realColCount += colSpan;                     //realColCount                 }             }

return wordTable;         }

解析word中的表格的更多相关文章

  1. Delphi读取不Word中不规则表格数据并转换成标准表格

    程序需要,需要将word中不规则的表格数据转换为标准的表格,即合并的单元格按正常格式解析,word中的表格格式如下: 解析后数据如下: 借鉴了网上代码,如下处理: procedure TfrmMain ...

  2. word模板导出的几种方式:第一种:占位符替换模板导出(只适用于word中含有表格形式的)

    1.占位符替换模板导出(只适用于word中含有表格形式的): /// <summary> /// 使用替换模板进行到处word文件 /// </summary> public ...

  3. 【转】一张图解析FastAdmin中的表格列表的功能

     一张图解析FastAdmin中的表格列表的功能 功能描述请根据图片上的数字索引查看对应功能说明. 1.时间筛选器如果想在搜索栏使用时间区间进行搜索,则可以在JS中修改修改字段属性,如 {field: ...

  4. 教你如何将word中的表格完美粘贴到ppt中

    经常操作办公软件的人一定有一个困惑,ppt本身表格编辑能力似乎很弱,如果从word里直接将一个编辑好的表格复制粘贴到ppt中,整个表格一定会发生让你没有预料的变化,还得重新花老大的劲去重新编辑,有人屛 ...

  5. C# 在Word中添加表格的方法

    表格是组织整理数据的一种重要手段,应在生活中的方方面面.在Word文档中将繁杂的文字表述内容表格化,能快速.直接地获取关键内容信息.那么,通过C#,我们也可以在Word文档中添加表格,这里将介绍两种不 ...

  6. python简单爬虫 用lxml解析页面中的表格

    目标:爬取湖南大学2018年在各省的录取分数线,存储在txt文件中 部分表格如图: 部分html代码: <table cellspacing="0" cellpadding= ...

  7. Java使用POI读取Word中的表格

    个人博客 地址:https://www.wenhaofan.com/a/20190627135921 代码 package live.autu.word; import java.io.FileInp ...

  8. 外部应用复制 表格 到word中 设置表格自适应

    word 批量设置表格宽度自适应 描述 : 我们经常从 外部 如 excel,html 等其他文件 中复制的表格到word 文档 经常会出现在 word 中显示不全的问题 主要是源格式的表格 宽度比 ...

  9. 关于Word中复杂表格转完美的Markdown格式的技巧

    背景 我们都知道有很多工具能做到Word转Markdown格式,但是在某些复杂的需求下,比如带合并单元格的表格,就会出现错乱,效果非常不理想. 那我们今天来学习和探讨下怎么实现完美转换. 转换 如果想 ...

随机推荐

  1. SignalR with ASP.NET MVC5 可用于倒计时同步

    原文地址:http://www.codeproject.com/Articles/806919/SignalR-with-ASP-NET-MVC

  2. 【LeetCode练习题】Evaluate Reverse Polish Notation

    Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...

  3. [SQL]一个删选数据的例子,使用GROUP、DISTINCT

    今天遇到的问题,纠结了一上午,终于解决了.在此记录下来,自我认为还有很多类似的问题都可以套用这段代码. 需求描述: 一个表MyImage,列有:号码ID,路径PATH 如: ID  PATH 1  C ...

  4. wait函数返回值总结,孤儿进程与僵尸进程[总结]

    http://blog.csdn.net/astrotycoon/article/details/41172389 wait函数返回值总结 http://www.cnblogs.com/Anker/p ...

  5. mode(思维,注意内存)

    mode Time Limit:1000MS     Memory Limit:1024KB     64bit IO Format:%lld & %llu Submit Status Pra ...

  6. 国内外DNS服务器地址列表

    DNS(Domain Name System)是域名解析服务器的意思,它在互联网的作用是把域名转换成为网络可以识别的IP地址.目前国内电信运营商通过使用DNS劫持的方法,干扰用户正常上网,使得用户无法 ...

  7. 谈谈 css 的各种居中——读编写高质量代码有感

    css 的居中有水平居中和垂直居中,这两种居中又分为行内元素居中和块级元素居中,不同的居中用不同方法. 水平居中 1.行内元素水平居中(文本,图片) 给父层设置 text-align:center; ...

  8. (原)前端知识杂烩(meta系列)

    更新于 20160831 1. meta 移动端头文件设置 (一般情况下,逐条复制放在头部就可以了) 1.1 强制让文档的宽度与设备的宽度保持1:1,并且文档最大的宽度比例是1.0,且不允许用户点击屏 ...

  9. 2015.01.06 JQuery

    jQuery是一个兼容多浏览器的javascript库.开发出来的JavaScript的脚本包.非侵入性的脚本. 下载地址:http://jquery.com/          (打不开网页需要翻* ...

  10. 使用UTL_SMTP发送中文电子邮件

    就是在原有TOM源码的基础上修改utl_smtp.write_data中,将输出内容进行一下数据转换,这样可以保证中文输出不会出现乱码 ----------------------------- cr ...