先介绍一个例子,来说明行中单元格合并(横合并) 与 列单元格合并(纵合并)的区别:
对于上面的表格,对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;
}
对于 横合并 或者 横纵合并并存 的表格暂时和没有找到解决的方法。