使用 C# 阻止 Excel 列

Block Excel Column using C#

我正在使用 C# 开发 windows 表单应用程序。在此应用程序中,用户将单击一个按钮,然后程序将从剪贴板复制一些列和行,并将它们粘贴到新的 excel 工作簿中,用户可以在其中编辑信息。 在 Excel 中,我只想屏蔽一列 ID,以便用户可以编辑除此之外的所有单元格 该列,因为该列是系统生成的。我无法让它工作。下面是我的代码

        DataObject dataObj = null;
        dataGridView1.SelectAll(); // copying data to clipboard
        dataObj = dataGridView1.GetClipboardContent(); // 

        if (dataObj != null)
            Clipboard.SetDataObject(dataObj);

        object misValue = System.Reflection.Missing.Value;
        xlexcel = new Microsoft.Office.Interop.Excel.Application();
        xlexcel.DisplayFullScreen = true;

        Microsoft.Office.Interop.Excel.Range CR = xlWorkSheet.get_Range("A1", "A1");
        CR.Select();
        xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, 
        Type.Missing, Type.Missing, false);

        // for example block column A only
        xlWorkSheet.Range["A1"].EntireColumn.Style.Locked = true; 
         
        // protect the sheet
        xlWorkSheet.Protect(Type.Missing, true, true, true,
             Type.Missing, Type.Missing, true, true, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing);

我的问题是,在 运行 这段代码然后取消对 sheet 的保护后,用户仍然可以编辑 A 列。有没有办法只保护 A 列不被编辑? 我正在使用 Microsoft.Office.Interop.Excel 版本 15. 和 .Net Framework 4.5.1

非常感谢任何帮助。

在这里试试这个。我不完全知道问题出在哪里,但这可能会有所帮助。

        DataObject dataObj = null;
        dataGridView1.SelectAll(); // copying data to clipboard
        dataObj = dataGridView1.GetClipboardContent(); // 

        if (dataObj != null)
            Clipboard.SetDataObject(dataObj);

        object misValue = System.Reflection.Missing.Value;
        xlexcel = new Microsoft.Office.Interop.Excel.Application();
        xlexcel.DisplayFullScreen = true;

        Microsoft.Office.Interop.Excel.Range CR = xlWorkSheet.get_Range("A1", "A1");
        CR.Select();
        xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, 
        Type.Missing, Type.Missing, false);

        // for example unblock columns B - Z only
        xlWorkSheet.Range("B1", "Z1").EntireColumn.Locked = false;
         
        // protect the sheet
        xlWorkSheet.Protect(Type.Missing, true, true, true,
             Type.Missing, Type.Missing, true, true, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing);

这绝不是您所有问题的完美解决方案。特别是因为我不太清楚您打算使用多少其他列,但此代码将使列 A 处于锁定状态,然后使 B 到 Z 处于解锁状态。如果还有其他问题可以在评论中提出。