VSTO C# 开发Excel单元格对象
单元格
对前两天的一篇文章重新整理了一下,并新增了些内容
属性
Range属性
// Range属性
Excelapp.Range["A3:F6, B1:C5"].Select();
Cells属性
// Cells属性
for (int icell = 1; icell <= 100; icell++)
Excelapp.ActiveSheet.cells[icell, 1].value = icell;
Offset属性
// Offset属性
Excelapp.Range["A1:A3"].Offset[3, 3].Select();
Resize属性
// Resize属性
Excelapp.Range["A1"].Resize[3, 3].Select();
Union属性
// Union属性
Excelapp.Application.Union(Excelapp.Range["A1:D4"], Excelapp.Range["E5:H8"]).Select();
UsedRange属性
// UsedRange属性
Excelapp.ActiveSheet.UsedRange.Select();
CurrentRegion属性
// CurrentRegion属性
Excelapp.Range["A5"].CurrentRegion.Select();
Address属性
// Address属性
result = Excelapp.Range["A1"].Address;
Column属性
// Column属性
result = Excelapp.Range["D8"].Column.ToString();
Row属性
// Row属性
result = Excelapp.Range["A8"].Row.ToString();
字体格式
// 字体格式
Excel.Font rng = Excelapp.Range["A1"].Font;
rng.Name = "宋体";
rng.FontStyle = "Bold";
rng.Size = 18;
rng.ColorIndex = 3;
rng.Underline = 2;
内部格式
// 内部格式
Excel.Interior rng = Excelapp.Range["A1"].Interior;
rng.ColorIndex = 3;
rng.Pattern = Excel.XlPattern.xlPatternCrissCross;
rng.PatternColorIndex = 6;
添加边框
// 添加边框
Excel.Borders rng = Excelapp.Range["B4:G10"].Borders;
rng.LineStyle = Excel.XlLineStyle.xlContinuous;
rng.Weight = Excel.XlBorderWeight.xlThin;
rng.ColorIndex = 5;
Excel.XlColorIndex col = (Excel.XlColorIndex)5;
Excelapp.Range["B4:G10"].BorderAround2(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlMedium, col);
多种边框格式
// 多种边框格式
Excel.XlColorIndex col = (Excel.XlColorIndex)5;
Excel.Border rng = Excelapp.Range["B4:G10"].Borders[Excel.XlBordersIndex.xlInsideHorizontal];
Excel.Border Rng = Excelapp.Range["B4:G10"].Borders[Excel.XlBordersIndex.xlInsideVertical];
rng.LineStyle = Excel.XlLineStyle.xlDot;
rng.Weight = Excel.XlBorderWeight.xlThin;
rng.ColorIndex = col;
Rng.LineStyle = Excel.XlLineStyle.xlContinuous;
Rng.Weight = Excel.XlBorderWeight.xlThin;
Rng.ColorIndex = col;
Excelapp.Range["B4:G10"].BorderAround2(Excel.XlLineStyle.xlContinuous, Excel.XlBorderWeight.xlMedium, col);
行高列宽
// 行高列宽
Excel.Range rng1 = Excelapp.Range["A1"];
Excel.Range rng2 = Excelapp.Range["B1"];
rng1.RowHeight = Excelapp.Application.CentimetersToPoints(2);
rng1.ColumnWidth = Excelapp.Application.CentimetersToPoints(1.5);
rng2.RowHeight = Excelapp.Application.CentimetersToPoints(1.2);
rng2.ColumnWidth = Excelapp.Application.CentimetersToPoints(0.3);
添加批注
// 添加批注
Excel.Range rng = Excelapp.Range["A1"];
if (rng.Comment == null)
rng.AddComment(rng.Text);
rng.Comment.Visible = true;
判断批注
// 判断批注
if (Excelapp.Range["A1"].Comment == null)
MessageBox.Show("A1单元格中没有批注");
MessageBox.Show("A1单元格中批注内容为:" + "\n" + Excelapp.Range["A1"].Comment.Text());
删除批注
// 删除批注
Excel.Range rng = Excelapp.Range["A1"];
if (rng.Comment != null)
rng.Comment.Delete();
方法
Select方法
// Select方法
Excelapp.Application.Worksheets[1].Activate();
Excelapp.Application.Worksheets[1].Range["A1:B10"].Select();
Activate方法
// Activate方法
Excelapp.Application.Worksheets[1].Activate();
Excelapp.Application.Worksheets[1].Range["A10:B20"].Activate();
Goto方法
// Goto方法
Excelapp.Application.Goto(Excelapp.Application.Worksheets[1].Range["A20:B30"], true);
Merge方法
// Merge方法 合并单元格
Excelapp.Application.DisplayAlerts = false;
Excelapp.Range["A1:B5"].Merge();
Excelapp.Application.DisplayAlerts = true;
判断合并单元格
// 判断合并单元格
Excel.Range rng = Excelapp.Application.Selection;
if (Convert.IsDBNull(rng.MergeCells))
MessageBox.Show("区域中包含合并单元格!");
else if (rng.MergeCells)
MessageBox.Show("区域中全部为合并单元格!");
MessageBox.Show("区域中没有合并单元格!");
合并单元格时连接文本
// 合并单元格时连接文本
Excel.Range rng = Excelapp.Application.Selection;
string s = string.Empty;
foreach (Excel.Range Rng in rng)
s = s + Rng.Text;
Excelapp.Application.DisplayAlerts = false;
rng.Merge();
rng.Value = s;
Excelapp.Application.DisplayAlerts = true;
合并内容相同的连续单元格
// 合并内容相同的连续单元格
int rEnd = Excelapp.Range["A65535"].End[Excel.XlDirection.xlUp].Row;
Excelapp.Application.DisplayAlerts = false;
for (int i = rEnd; i >= 2; i--)
Excel.Range rng = Excelapp.Cells[i, 1];
if (rng.Value == rng.Offset[-1, 0].Value)
Excelapp.Application.Union(rng, rng.Offset[-1, 0]).Merge();
取消合并单元格时在每个单元格中保留内容
// 取消合并单元格时在每个单元格中保留内容
int rEnd = Excelapp.Range["A65535"].End[Excel.XlDirection.xlUp].Row;
int m = Excelapp.Cells[rEnd, 1].MergeArea.Count - 1;
Excelapp.Range[Excelapp.Cells[1, 1], Excelapp.Cells[rEnd, 1]].UnMerge();
Excelapp.Application.DisplayAlerts = false;
for (int i = 1; i < rEnd + m; i++)
Excel.Range rng = Excelapp.Cells[i, 1];
if (rng.Offset[1, 0].Text == string.Empty)
rng.Offset[1, 0].Value = rng.Value;
数据有效性
// 数据有效性
Excel.Range rng = Excelapp.Range["A1:A10"];
rng.Validation.Delete();
rng.Validation.Add(
Excel.XlDVType.xlValidateList,
Excel.XlDVAlertStyle.xlValidAlertStop,
Excel.XlFormatConditionOperator.xlBetween, "1,2,3,4,5,6,7,8");
判断数据有效性
// 判断数据有效性
if (Excelapp.Range["A12"].Validation.Type >= 0)
MessageBox.Show("单元格中有数据有效性!");
catch
MessageBox.Show("单元格中没有数据有效性!");
动态数据有效性
void 工作表1_SelectionChange(Excel.Range Target)
if (Target.Column == 1 && Target.Count == 1 && Target.Row > 1)
Target.Validation.Delete();
Target.Validation.Add(
Excel.XlDVType.xlValidateList,
Excel.XlDVAlertStyle.xlValidAlertStop,
Excel.XlFormatConditionOperator.xlBetween,"主机,显示器");
自动展开数据有效性
// 自动展开数据有效性
Excelapp.Application.SendKeys("%{down}");
操作
直接赋值
// 直接赋值
Excelapp.Range["A1"].Value = "直接赋值";
Excel.Range rng = Excelapp.Application.Worksheets[1].Range["F1"];
Excel.Range Rng = Excelapp.Range["A1"].CurrentRegion;
rng.Resize[Rng.Rows.Count, Rng.Columns.Count].Value = Rng.Value;
将数组写入单元格
// 将数组写入单元格
string[] arr = new string[12] { "01月", "02月", "03月", "04月", "05月", "06月",
"07月", "08月", "09月", "10月", "11月", "12月" };
Excelapp.Range["B1"].Resize[1, arr.Length].Value = arr;
写入公式
// 写入公式
Excelapp.Range["C1:C10"].Formula = "=sum(A1,B1)";
数组公式
// 数组公式
Excelapp.Range["C1"].FormulaArray = "=A1:A2*B1:B2";
InputBox输入框0
application.inputbox(对话框显示内容,对话框标题,对话框默认值,X坐标,Y坐标,帮助文件,帮助文件ID,对话框内容类型)
注:对话框内容类型
type
为0 返回文本,1返回数字, 2返回公式,4 逻辑值, 8单元格引用, 16错误值 ,64数值数组。
// InputBox输入框0
result = Excelapp.Application.InputBox("请输入文本!", "返回文本", Type: 0);
Excelapp.Range["A1"].Value = result.Replace("=", "").Trim('"');
MessageBox.Show(result.Replace("=", "").Trim('"'));
InputBox输入框1
// InputBox输入框1
double str = Excelapp.Application.InputBox("请输入数字!", "返回数值", Type: 1);
Excelapp.Range["A1"].Value = str;
MessageBox.Show(str.ToString());
InputBox输入框8
// InputBox输入框8
Excel.Range rng = Excelapp.Application.InputBox("请选择区域!", Type: 8);
MessageBox.Show("已选择单元格区域第一列的列号为" + rng.Column.ToString() + "。共有" + rng.Columns.Count.ToString() + "列。");
MessageBox.Show("已选择单元格区域第一行的行号为" + rng.Row.ToString() + "。共有" + rng.Rows.Count.ToString() + "行。");
最后一个非空单元格
// 最后一个非空单元格
Excel.Range rng = Excelapp.Range["A65535"].End[Excel.XlDirection.xlUp];
MessageBox.Show("A列中最后一个非空单元格是" + rng.Address[0, 0] + ",行号" + rng.Row.ToString() + ",数值" + rng.Text);
定位单元格
// 定位单元格
Excelapp.Range["C1"].Formula = "=sum(A1,B1)";
Excel.Range rng = Excelapp.ActiveSheet.UsedRange.SpecialCells(Excel.XlCellType.xlCellTypeFormulas);
rng.Select();
MessageBox.Show("工作表中有公式的单元格为:" + rng.Address);
查找单元格
// 查找单元格
Excel.Range rng, Rng;
Rng = Excelapp.Range["A:A"];
string strFind = Excelapp.Application.InputBox("请输入查找的值", "查找单元格", "A", Type: 0);
strFind = strFind.Replace("=", "").Trim('"').Trim();
if (strFind != string.Empty)
rng = Rng.Find(strFind, Rng.Cells[Rng.Cells.Count], Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false);
if (rng != null)
Excelapp.Application.Goto(rng, true);
MessageBox.Show(rng.Address);
MessageBox.Show("没有找到单元格!");
查找单元格重复数据
// 查找单元格重复数据
Excel.Range rng, Rng;
string FindAddress = string.Empty;
Rng = Excelapp.Range["A:A"];
string strFind = Excelapp.Application.InputBox("请输入查找的值", "查找单元格重复数据", "A", Type: 0);
strFind = strFind.Replace("=", "").Trim('"').Trim();
if (strFind != string.Empty)
rng = Rng.Find(strFind, Rng.Cells[Rng.Cells.Count], Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlWhole, Excel.XlSearchOrder.xlByRows, Excel.XlSearchDirection.xlNext, false);
if (rng != null)
FindAddress = rng.Address;
rng.Interior.ColorIndex = 6;
rng = Rng.FindNext(rng);
} while (rng != null && rng.Address != FindAddress);
替换单元格内字符串
// 查找单元格重复数据
string[] arr = new string[12] { "通州1", "通州2", "通州3", "幽州4", "幽州", "幽州",
"通州", "通州", "南通10", "南通11", "南通12", "12月" };
Excelapp.Range["A1"].Resize[arr.Length, 1].Value = Excelapp.WorksheetFunction.Transpose(arr);
Excelapp.Range["A1:A12"].Replace("通州", "南通");
复制单元格区域
// 复制单元格区域
Excelapp.Range["A1"].CurrentRegion.Copy(Excelapp.Application.Worksheets[1].Range["E1"]);
复制列宽
// 复制列宽
Excelapp.Range["A1"].CurrentRegion.Copy();
Excel.Range rng = Excelapp.Application.Worksheets[1].Range["H1"];
rng.PasteSpecial(Excel.XlPasteType.xlPasteColumnWidths);
rng.PasteSpecial(Excel.XlPasteType.xlPasteAll);
Excelapp.Application.CutCopyMode = Excel.XlCutCopyMode.xlCut;