Search code examples
c#winformscomoffice-interopexcel-interop

Block Excel Column using C#


I am developing a windows form application using C#. In this application the user will click a button then the program will copy some columns and rows from the clipboard and past them on a new excel workbook where user can edit the information. In Excel, I want to block one column only which is the ID such that the user can edit all cells except that column because this column is system generated. I am not able to get it working. below is my code

        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);

My problem is that after running this code and then unprotecting the sheet, the user can still edit column A. Is there a way I can protect only column A from editing? I am using Microsoft.Office.Interop.Excel version 15. and .Net Framework 4.5.1

Any help is really appreciated.


Solution

  • Here try this. I don't exactly know where the issue is occurring but this might help.

            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);
    

    This is in no way a perfect solution to all your problems. Especially since I don't quite know how many other columns you plan to use, but this code will leave column A locked and then leave B through Z unlocked. If you have any others questions toss them in the comments.