Excel c# 中锁定单元格有什么问题

What's wrong with locking cells in Excel c#

我用 Excel 365 尝试了下面的代码。 好吧,它不起作用。我尝试了几个变化。锁定似乎不起作用。 要么单元格根本没有锁定,要么它们不能被明显选中但仍然可以编辑。 这里似乎有什么东西坏了。 有人有解决办法吗? 我只是想锁定某些单元格而其他单元格不锁定,其实非常非常简单。

在下面的代码中,我的结果是我仍然可以编辑单元格。所有这些!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;     

namespace SampleVSTOAddIn
{
    public partial class ThisAddIn
    {

        private void WorkbookOpen(Microsoft.Office.Interop.Excel.Workbook wb)
        {
            Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Application.ActiveSheet);

            activeWorksheet.Protect(UserInterfaceOnly: true);
            activeWorksheet.EnableSelection = Excel.XlEnableSelection.xlUnlockedCells;

            activeWorksheet.get_Range("A1").Value2 = "Locked";
            activeWorksheet.get_Range("B1").Value2 = "Unlocked";
            activeWorksheet.get_Range("A1").Style.Locked = true;
            activeWorksheet.get_Range("B1").Style.Locked = false;
        }

        private void InternalStartup()
        {

            this.Application.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(WorkbookOpen);

        }
    }
}

天哪,我的坏蛋。 我设置了 Style.Locked 但需要设置 .Locked。 真是个愚蠢的错误。

此处完成:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;     

namespace SampleVSTOAddIn
{
    public partial class ThisAddIn
    {

        private void WorkbookOpen(Microsoft.Office.Interop.Excel.Workbook wb)
        {
            Excel.Worksheet activeWorksheet = ((Excel.Worksheet)Application.ActiveSheet);

            activeWorksheet.Protect(UserInterfaceOnly: true);
            activeWorksheet.EnableSelection = Excel.XlEnableSelection.xlUnlockedCells;

            activeWorksheet.get_Range("A1").Value2 = "Locked";
            activeWorksheet.get_Range("B1").Value2 = "Unlocked";
            activeWorksheet.get_Range("A1").Locked = true;
            activeWorksheet.get_Range("B1").Locked = false;
        }

        private void InternalStartup()
        {

            this.Application.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(WorkbookOpen);

        }
    }
}