Excel对象模型的一些使用心得(C#)
最近在做一个很小的项目,做Excel的导出。用到了Excel 10.0 (用户要求),对应的Office版本是2002(XP).在某篇文章中找到了一个操作Excel对象的基础类,里面的方法比较全了,我这里只记录我所做项目中用到的几个特殊的用法。
Excel.Application myExcel;
Excel.Workbook myWorkBook;
- 单元格查找功能,即实现Excel中的(Ctrl+F)功能。
Excel.Range newRange = range.Find(conditions, rangeAfter, Excel.XlFindLookIn.xlFormulas, Excel.XlLookAt.xlPart, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false, false, false);其中conditions为查找的条件,rangeafter为从哪个单元格之后开始查找。Find()方法返回类型也为Range。 - 插入空行,插入空列。public void InsertRow(int startRow, int endRow)
{
Excel.Worksheet worksheet = (Excel.Worksheet)myExcel.ActiveSheet;//获取当前工作表
Excel.Range range = (Excel.Range)worksheet.Rows[startRow.ToString() + ":" + endRow.ToString(),System.Type.Missing];
range.Insert(Excel.XlInsertShiftDirection.xlShiftDown, Type.Missing);
}
public void InsertColumn(int startColumn, int endColumn)
{
Excel.Worksheet worksheet = (Excel.Worksheet)myExcel.ActiveSheet;//获取当前工作表
Excel.Range range = (Excel.Range)worksheet.Columns[Type.Missing, startColumn.ToString() + ":" + endColumn.ToString()];
range.Insert(Excel.XlInsertShiftDirection.xlShiftToRight, Type.Missing);
} - 向单元格添加批注。/// <summary>
/// 添加批注
/// </summary>
/// <param name="coment">批注</param>
/// <param name="row">行</param>
/// <param name="column">列</param>
/// <returns></returns>
public bool AddComent(object coment, int row, int column)
{
try
{
Excel.Range range = myExcel.get_Range(myExcel.Cells[row, column], myExcel.Cells[row, column]);
range.AddComment(coment);
return true;
}
catch
{
return false;
}
} - 设置行高。/// <summary>
/// 设置行高
/// </summary>
/// <param name="startRow">起始行</param>
/// <param name="endRow">结束行</param>
/// <param name="height">行高</param>
public void SetRowHeight(int startRow, int endRow, int height)
{
//获取当前正在使用的工作表
Excel.Worksheet worksheet = (Excel.Worksheet)myExcel.ActiveSheet;
Excel.Range range = (Excel.Range)worksheet.Rows[startRow.ToString() + ":" + endRow.ToString(), System.Type.Missing];
range.RowHeight = height;
} - 实现Copy格式功能,即格式刷功能。newRange.PasteSpecial(Excel.XlPasteType.xlPasteFormats, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
- 在代码中对原先是合并的单元格使用上面的PasteSpecial方法后,可能会把原先合并的单元格拆分开,我在项目中解决的办法是,在查找的时候,把原先合并的单元格Range对象保存到数组中,然后PasteSpecial,在代码最后再对数组中的单元格进行合并。
Excel.Range[] mergeDataRange = new Excel.Range[2048];//用于保存原模板中单元格合并状态的数组
//查找newRange
if((bool)newRange.MergeCells== true)
{
mergeDataRange[i] = newRange.MergeArea;
}
//对所有原来是合并的单元格进行重新合并
foreach (Excel.Range range1 in mergeDataRange)
{
if (range1 != null && range1.Count !=1)
{
range1.Merge(Type.Missing);
}
else
{
break;
}
} - 以上列出的功能很少,仅仅是为了给自己的工作做一下小结,回顾一下自己写的代码,同时也期待各位朋友的指正和讨论。另外,在做Office开发用到COM组件的时候,遇到不熟悉的功能,可以在Office中录制宏,把自己需要解决的问题用VBA记录下来,然后查看,对自己编写代码会有很大启发。
- 另外MSDN对Excel对象模型有个比较详细的介绍:http://msdn.microsoft.com/zh-cn/library/aa168292(office.11,printer).aspx