如何用C#(Excel Interop)给Excel写入公式至最后一行及实现粘贴值?
Excel Interop 基础操作实现(RPA Invoke Code 场景)
一、修正初始化代码
你提供的初始化代码存在类型定义错误,Workbook和Worksheet不需要加Application.前缀,下面是修正后的完整初始化框架:
using Microsoft.Office.Interop.Excel; using System.IO; Application xlApp = new Application(); Workbook xlWorkbook = null; Worksheet xlWorksheet = null; try { // 先校验文件是否存在 if (!File.Exists(Path)) { throw new FileNotFoundException("指定的Excel文件不存在"); } xlWorkbook = xlApp.Workbooks.Open(Path); xlWorksheet = (Worksheet)xlWorkbook.Sheets["EXTR"]; // 激活工作表不是必须操作,多数场景下可以省略 // xlWorksheet.Activate();
二、写入公式到最后一行
先定位数据区域的最后一行,再给目标单元格赋值公式:
// 从A列底部往上找最后一个非空单元格,确定数据最后一行 int lastRow = xlWorksheet.Cells[xlWorksheet.Rows.Count, "A"].End(XlDirection.xlUp).Row; // 示例:在B列最后一行写入求和公式(求和A1到A[lastRow-1]) Range targetCell = xlWorksheet.Cells[lastRow, "B"]; // Excel公式用英文分隔符,用字符串插值拼接行号更灵活 targetCell.Formula = $"=SUM(A1:A{lastRow-1})"; // 手动触发计算(默认自动计算开启,若未生效可执行此句) xlApp.Calculate();
三、复制公式列值并仅粘贴值到另一列
通过PasteSpecial指定只粘贴值,忽略原单元格的公式:
// 定义要复制的源区域(B列第1行到最后一行) Range sourceRange = xlWorksheet.Range["B1:B" + lastRow]; // 定义目标区域的起始单元格(比如C1) Range targetRange = xlWorksheet.Range["C1"]; // 复制并选择性粘贴值 sourceRange.Copy(); targetRange.PasteSpecial(XlPasteType.xlPasteValues); // 关闭剪切复制模式,释放剪贴板 xlApp.CutCopyMode = false;
四、插入列操作
示例在C列位置插入一列,并设置表头:
// 指定要插入列的位置(C列) Range insertColumn = xlWorksheet.Range["C:C"]; // 插入列,右侧列向右偏移 insertColumn.Insert(XlInsertShiftDirection.xlShiftToRight); // 给新插入的列设置表头 xlWorksheet.Cells[1, "C"].Value = "计算结果";
五、收尾:释放Excel资源
注意:必须执行这部分代码,否则Excel进程会留在后台占用资源
} catch (Exception ex) { // RPA中可将错误信息写入日志,方便排查 Console.WriteLine($"操作失败:{ex.Message}"); } finally { // 关闭并释放工作簿 if (xlWorkbook != null) { xlWorkbook.Save(); // 不需要保存就改为 xlWorkbook.Close(false) xlWorkbook.Close(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook); } // 关闭并释放Excel应用 if (xlApp != null) { xlApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); } }
内容的提问来源于stack exchange,提问作者globlobi2003
相关产品推荐
相关产品推荐

