[原]C# 读取Word 表格数据(单元格纵合并)

本文介绍了Word文档中表格的单元格合并机制,包括行中单元格合并与列单元格合并的区别,并提供了一段用于读取包含列单元格合并的Word表格数据的C#代码示例。


2014-5-8阅读697 评论0

先介绍一个例子,来说明行中单元格合并(横合并) 与 列单元格合并(纵合并)的区别:

  

对于上面的表格,对Cells遍历的结果,True表示该行该列的单元格存在,False表示不存在。 

 

可以看到,word表格中行和列的合并单元格(Merge)机制是不一样的。

行中单元格的合并时,将合并单元格作为普通单元格格来依次存储。

列中单元格合并时,只将合并的第一个单元格的数据进行存储,其他的单元格只保留其指针。(就像相邻的两个小区,原先各有各的门牌号,现在两个小区合并了,只需要一个门牌号,只保留了一个门牌号,另一个门牌号暂时不用,则弃用的门牌号只是一个门牌,不指向任何一栋建筑物。)


对于列中单元格合并(纵合并)(如上图)的数据读取的代码如下:

读取table.Cell(rowIndex, columnIndex).Range.Text.Trim(),报错的时候,则说明是合并的单元格,则读取同列上一行的数据。

注意:Word 中Table 的行和列的开始索引是从1开始的。


  public static DataTable ReadSourceWordData(string filePath)
        {
            Word.ApplicationClass applicationClass = new Word.ApplicationClass();
            Word.Document document = null;
            object EmptyData = System.Reflection.Missing.Value;
            object path = filePath;
            DataTable dt = new DataTable();
            try
            {
                document = applicationClass.Documents.Open(ref path, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData
                , ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData
                , ref EmptyData, ref EmptyData, ref EmptyData);
                
                Word.Table table = document.Tables[1];
                if (table != null)
                {
                    #region 判断是否有横向合并项

                    try
                    {
                        Word.Column tempColumns = table.Columns[1];
                    }
                    catch (Exception ex)
                    {
                        throw new Exception("表格中有横合并项,无法读取数据。原因:" + ex.Message);
                    } 

                    #endregion

                    #region 读取表格的数据

                    for (int columnIndex = 1; columnIndex <= table.Columns.Count; columnIndex++) //将第一行数据作为列标题
                    {
                        string valueString = table.Cell(1, columnIndex).Range.Text.Trim();
                        dt.Columns.Add(valueString.Substring(0, valueString.Length - 2));
                    }

                    for (int rowIndex = 2; rowIndex <= table.Rows.Count; rowIndex++)
                    {
                        List<object> rowDatas = new List<object>();

                        for (int columnIndex = 1; columnIndex <= table.Columns.Count; columnIndex++)
                        {
                            try
                            {
                                string valueString = table.Cell(rowIndex, columnIndex).Range.Text.Trim();
                                rowDatas.Add(valueString.Substring(0, valueString.Length - 2));
                            }
                            catch (Exception ex)
                            {
                                rowDatas.Add(dt.Rows[rowIndex - 3][columnIndex - 1]);
                            }
                        }
                        dt.Rows.Add(rowDatas.ToArray());
                    } 

                    #endregion
                }

                document.Close(ref EmptyData, ref EmptyData, ref EmptyData);
                applicationClass.Quit(ref EmptyData, ref EmptyData, ref EmptyData);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(applicationClass);
              
            }
            catch (Exception ex)
            {
                if (document != null)
                {
                    document.Close(ref EmptyData, ref EmptyData, ref EmptyData);
                }

                if (applicationClass != null)
                {
                    applicationClass.Quit(ref EmptyData, ref EmptyData, ref EmptyData);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(applicationClass);
                }

                dt = null;

                throw ex;
            }

            return dt;
        }

2014-5-8阅读697 评论0

先介绍一个例子,来说明行中单元格合并(横合并) 与 列单元格合并(纵合并)的区别:

  

对于上面的表格,对Cells遍历的结果,True表示该行该列的单元格存在,False表示不存在。 

 

可以看到,word表格中行和列的合并单元格(Merge)机制是不一样的。

行中单元格的合并时,将合并单元格作为普通单元格格来依次存储。

列中单元格合并时,只将合并的第一个单元格的数据进行存储,其他的单元格只保留其指针。(就像相邻的两个小区,原先各有各的门牌号,现在两个小区合并了,只需要一个门牌号,只保留了一个门牌号,另一个门牌号暂时不用,则弃用的门牌号只是一个门牌,不指向任何一栋建筑物。)


对于列中单元格合并(纵合并)(如上图)的数据读取的代码如下:

读取table.Cell(rowIndex, columnIndex).Range.Text.Trim(),报错的时候,则说明是合并的单元格,则读取同列上一行的数据。

注意:Word 中Table 的行和列的开始索引是从1开始的。


  public static DataTable ReadSourceWordData(string filePath)
        {
            Word.ApplicationClass applicationClass = new Word.ApplicationClass();
            Word.Document document = null;
            object EmptyData = System.Reflection.Missing.Value;
            object path = filePath;
            DataTable dt = new DataTable();
            try
            {
                document = applicationClass.Documents.Open(ref path, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData
                , ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData, ref EmptyData
                , ref EmptyData, ref EmptyData, ref EmptyData);
                
                Word.Table table = document.Tables[1];
                if (table != null)
                {
                    #region 判断是否有横向合并项

                    try
                    {
                        Word.Column tempColumns = table.Columns[1];
                    }
                    catch (Exception ex)
                    {
                        throw new Exception("表格中有横合并项,无法读取数据。原因:" + ex.Message);
                    } 

                    #endregion

                    #region 读取表格的数据

                    for (int columnIndex = 1; columnIndex <= table.Columns.Count; columnIndex++) //将第一行数据作为列标题
                    {
                        string valueString = table.Cell(1, columnIndex).Range.Text.Trim();
                        dt.Columns.Add(valueString.Substring(0, valueString.Length - 2));
                    }

                    for (int rowIndex = 2; rowIndex <= table.Rows.Count; rowIndex++)
                    {
                        List<object> rowDatas = new List<object>();

                        for (int columnIndex = 1; columnIndex <= table.Columns.Count; columnIndex++)
                        {
                            try
                            {
                                string valueString = table.Cell(rowIndex, columnIndex).Range.Text.Trim();
                                rowDatas.Add(valueString.Substring(0, valueString.Length - 2));
                            }
                            catch (Exception ex)
                            {
                                rowDatas.Add(dt.Rows[rowIndex - 3][columnIndex - 1]);
                            }
                        }
                        dt.Rows.Add(rowDatas.ToArray());
                    } 

                    #endregion
                }

                document.Close(ref EmptyData, ref EmptyData, ref EmptyData);
                applicationClass.Quit(ref EmptyData, ref EmptyData, ref EmptyData);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(applicationClass);
              
            }
            catch (Exception ex)
            {
                if (document != null)
                {
                    document.Close(ref EmptyData, ref EmptyData, ref EmptyData);
                }

                if (applicationClass != null)
                {
                    applicationClass.Quit(ref EmptyData, ref EmptyData, ref EmptyData);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(applicationClass);
                }

                dt = null;

                throw ex;
            }

            return dt;
        }
【激光质量检测】利用丝杆与步进电机的组合装置带动光源的移动,完成对光源使用切片法测量其光束质量的目的研究(Matlab代码实现)内容概要:本文研究了利用丝杆与步进电机的组合装置带动光源移动,结合切片法实现对激光光源光束质量的精确测量方法,并提供了基于Matlab的代码实现方案。该系统通过机械装置精确控制光源位置,采集不同截面的光强分布数据,进而分析光束的聚焦特性、发散角、光斑尺寸等关键质量参数,适用于高精度光学检测场景。研究重点在于硬件控制与图像处理算法的协同设计,实现了自动化、高重复性的光束质量评估流程。; 适合人群:具备一定光学基础知识和Matlab编程能力的科研人员或工程技术人员,尤其适合从事激光应用、光电检测、精密仪器开发等相关领域的研究生及研发工程师。; 使用场景及目标:①实现对连续或脉冲激光器输出光束的质量评估;②为激光加工、医疗激光、通信激光等应用场景提供可靠的光束分析手段;③通过Matlab仿真与实际控制对接,验证切片法测量方案的有效性与精度。; 阅读建议:建议读者结合机械控制原理与光学测量理论同步理解文档内容,重点关注步进电机控制逻辑与切片数据处理算法的衔接部分,实际应用时需校准装置并优化采样间距以提高测量精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值