ice world

There is nothing too difficult if you put your heart into it.
posts - 104, comments - 103, trackbacks - 0, articles - 0

C#操作word总结

Posted on 2011-04-16 13:38 IceWee 阅读(1161) 评论(0)  编辑  收藏 所属分类: Others
最近有个小项目中自己负责word报表的生成,开发语言是C#,我是做JAVA的,临时用一下而已。发现微软的在线MSDN是个好东西,很强大,基本需要的东西都在里面可以找到,比如word的创建、打开、关闭等等一系列的操作DEMO代码。

我主要是将现有的模板填入数据保存文档即可。主题是TABLE填值,检索TABLE主要是通过下标,如:

WordDoc.Tables[6]

其中WordDoc的类型是Word.Document,就是当前操作的word文档,上面的代码是获取当前文档中的第六个表格,这里要注意一下, 我们惯性会认为是第七个表格,但这就是微软的不同,没有采用数组索引的方式,如果当初数组也这么设计,下标从1开始,我们学习的时候不知道省多少事。

开发过程中遇到了一个小难题就是合并单元格(纵向),没有设计横向的合并,现将合并的代码贴出来备用:

/// <summary>
/// 纵向单元格合并 
/// 说明:如合并了第一行第一列和第二行第一列两个单元格,则单元格cell(2, 1)已经不存在,继续操作会有异常, 
/// 只有通过cell(1, 1)来获取合并后的单元格 
/// /<summary>
/// <param name="table"></param>
/// <param name="startRowIndex"></param>
/// <param name="columnIndex"></param>

private static void verticalCellMerge(Word.Table table, int startRowIndex, int columnIndex)
{    
    
string previousText = table.Cell(startRowIndex++, columnIndex).Range.Text;    // 保存对比文字    
    int previousRowIndex = startRowIndex - 1;    // 因刚已经+1了,所以再减回去    
    for (int i = startRowIndex; i <= table.Rows.Count; ++i) // 遍历所有行的columnIndex列,发现相同的合并,从起始行的下一行开始对比    
    {        
        
string currentText = table.Cell(i, columnIndex).Range.Text;        
        
if (previousText.Equals(currentText))        
        
{            
            table.Cell(previousRowIndex, columnIndex).Merge(table.Cell(i, columnIndex)); 
// 合并先前单元格和当前单元格            
            table.Cell(previousRowIndex, columnIndex).Range.Text = currentText;    // 因为合并后并没有将单元格内容去除,需要手动修改            
            table.Cell(previousRowIndex, columnIndex).Select();            
            WordApp.Selection.ParagraphFormat.Alignment 
= WdParagraphAlignment.wdAlignParagraphCenter;    // 水平居中显示            
            table.Cell(previousRowIndex, columnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中        
        }
        
        
else        
        
{            
            previousText 
= currentText; // 将对比文字替换为当前的内容            
            previousRowIndex = i;   // 检索到不同的内容,将当前行下标置为先前行下标,用于合并        
        }
    
    }

}


/// <summary>
/// 横向单元格合并
/// 注意:在合并单元格后必须将纵列数减去1
/// 如第一行第一列和第一行第二列合并后,原第一行第三列将变成第一行第二列,这就是在合并后i不加1的原因
/// </summary>
/// <param name="WordApp"></param>
/// <param name="table"></param>
/// <param name="startColumnIndex"></param>
/// <param name="rowIndex"></param>

private static void horizontalCellMerge(Word.Application WordApp, Word.Table table, int startColumnIndex, int rowIndex)
{    
    
string previousText = table.Cell(rowIndex, startColumnIndex).Range.Text;    // 保存对比文字    
    int previousColumnIndex = startColumnIndex++;    // 保存先前对比列下标    
    int colCount = table.Columns.Count;    
    
for (int i = startColumnIndex; i <= colCount;) // 遍历所有行的columnIndex列,发现相同的合并,从起始行的下一行开始对比    
    {        
        
string currentText = table.Cell(rowIndex, i).Range.Text;        
        
if (previousText.Equals(currentText))        
        
{            
            table.Cell(rowIndex, previousColumnIndex).Merge(table.Cell(rowIndex, i)); 
// 合并先前单元格和当前单元格            
            table.Cell(rowIndex, previousColumnIndex).Range.Text = currentText;    // 因为合并后并没有将单元格内容去除,需要手动修改            
            table.Cell(rowIndex, previousColumnIndex).Select();            
            WordApp.Selection.ParagraphFormat.Alignment 
= WdParagraphAlignment.wdAlignParagraphCenter;    // 水平居中显示            
            table.Cell(rowIndex, previousColumnIndex).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter; // 垂直居中            
            --colCount;        
        }
        
        
else        
        
{            
            previousText 
= currentText; // 将对比文字替换为当前的内容            
            previousColumnIndex = i++;   // 检索到不同的内容,将当前行下标置为先前行下标,用于合并        
        }
    
    }

}

方法注释已经很详细就不再赘述。

最后遇到的问题是无格式的段落检索,因为在生成报告的时候需要在某些段落后填写测试的结论,这下又把我难住了,最终终于发现了bookmark这个东东,起始我对word并不熟悉,都不知道它有书签的功能。顺便就爱你个检索书签的方法贴出来:

/// <summary>
/// 在整个文档中根据书签名检索书签对象
/// </summary>
/// <param name="name"></param>

private static Word.Bookmark getBookmarkByName(string name)  
{      
    
foreach (Word.Bookmark bm in WordDoc.Bookmarks)      
    
{          
        
if (bm.Name.Equals(name))              
            
return bm;          
        }
          
        
return null;      
    }
  


例:

Word.Bookmark bm = getBookmarkByName(bookmarkName);  
bm.Range.Text 
= "你好"// 将检索到书签的内容替换为“你好”

这就是这次用C#做word报表的全部问题,貌似都是小问题。

最后需要看具体的word操作demo代码请访问MSDN,贴个网址:

http://msdn.microsoft.com/zh-cn/library/78whx7s6(VS.80).aspx


只有注册用户登录后才能发表评论。


网站导航: