相关文章推荐
完美的脸盆  ·  Java ...·  1 月前    · 
微醺的凉茶  ·  vs ...·  5 月前    · 

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;