将 Excel 单元格从 Visual Studio 设置为 Textbox.text,引用错误 C#

Setting Excel cell to Textbox.text from Visual Studio, Reference Error C#

    public Excel.Application xlapp = new Excel.Application();
    public Excel.Range range;
    public Excel.Workbook workbook;
    public Excel.Worksheet worksheet;
    public string file;
    private void button1_Click(object sender, EventArgs e)
    {            
        file = Path.Combine(Application.StartupPath, "Quote Sheet Template.xls");
        xlapp.Workbooks.Open(file);
        workbook = (Excel.Workbook)xlapp.ActiveWorkbook; 
        xlapp.Visible = true;
        range.get_Range("D6");
        range.Value2 = NameTake.Text;
        workbook.SaveAs(Path.Combine(Application.StartupPath, NameTake.Text + " Quote.xls"));
    }

事情是这样的...有人将信息(在本例中是他们的名字)放入文本框中。然后他们单击按钮 1 将他们的名字导出到 excel 模板,然后将其保存在他们自己的名字中。

问题是什么时候到达

    range.get_Range("D6"); /*and*/ range.Value2 = NameTake.Text;

它抛出异常说

Object reference not set to an instance of an object

当我尝试将其设置为一个实例时(即)

    range = new Excel.Range();

它抛出一个错误说

Cannot create an instance of the abstract class or interface 'Microsoft.Office.Interop.Excel.Range

可能是很明显的事情。你们能帮帮我吗:)

更新代码:

        private void button1_Click(object sender, EventArgs e)
    {

        file = Path.Combine(Application.StartupPath, "Quote Sheet Template.xls");
        xlapp.Workbooks.Open(file);
        workbook = (Excel.Workbook)xlapp.ActiveWorkbook; 
        xlapp.Visible = true;
        range = worksheet.Cells["D6"] as Excel.Range;
        if (range != null)
        {
            //range.Value2 = NameTake.Text;
            workbook.SaveAs(Path.Combine(Application.StartupPath, NameTake.Text + " Quote.xls"));
        }

    }

获取异常(针对范围):未将对象引用设置为对象的实例

您从未在代码中分配变量 range,因此它为 null,错误是适当的。

在 VSTO 中,我致力于从当前 sheet 获取目标范围,例如:

var range = theSheet.Cells[ 1, 4 ] as Excel.Range; // [ row, column ]

在工作时验证你所拥有的不为空;它只是很好的编程。比如在使用前检查上面代码中你的workbook是否不为null。比如在我上面的例子中,我会跟着这个

if (range != null) { ... do valid operation ... }

您不需要创建范围。尝试 range = worksheet.get_Range("D6","D6"); 而不是 range = new Excel.Range();

尝试用 range = worksheet.get_Range("D6"); 替换 range.get_Range("D6"); 这是因为您正在尝试访问 range 但它从未使用任何实际范围进行初始化。

如果您只是想设置 D6 Value2,您应该只使用 worksheet.Range("D6").Value2 = NameTake.Text;,甚至不需要 Excel.Range 变量。