粘贴到Excel锁定的单元格中

时间:2017-01-23 19:29:10

标签: excel paste protected

我正在为用户输入数据创建一个模板。我希望他们能够做的就是从他们的来源复制他们的数据并将其放入单元格A21-D21。粘贴后,他们无法删除或更改任何内容,excel仅用于打印。重播很好,因为这将是一个模板。理想情况下,用户可以直接导出到此受保护的工作表中并使用它完成,但是仪器软件只需要excel而不是特定的数据库位置。

简而言之,用户从仪器获取数据并以不能操作的格式保存,但除了与仪器连接的设备外,它都不能在任何计算机上显示。我需要将这些数据放入excel但不能更改。如果他们选择,审核员可以将原始数据与excel进行比较。

有没有办法让工作表受到保护并选择一个未锁定的单元格(格式单元格),A1,然后填充/粘贴整个A21-D21范围?

我们的想法是人们会操纵原始数据以获得他们想要的答案,但这会限制用户只能粘贴。

所以我想,简单地说,我希望找到一种方法来允许用户复制/粘贴,这就是它! ?

1 个答案:

答案 0 :(得分:0)

我不知道是否有办法在Excel中执行您想要的操作,但可以以编程方式完成。

// Note: need to add reference to Microsoft.Office.Interop.Excel to get these namespaces
// In Visual Studio, choose Project > Add Reference > COM > Type Libraries >
//   Microsoft Excel 16.0 Object Library
using Microsoft.Office.Interop.Excel;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileName = @"c:\users\eric.sundquist\desktop\book1.xlsx";
            int worksheetNumber = 1;
            List<string> contents = new List<string> { "1", "2", "3", "4" };

            PasteIntoProtectedSheet(fileName, worksheetNumber, contents);
        }

        static void PasteIntoProtectedSheet(string fileName, int worksheetNumber,
                List<string> contents)
        {
            Application excel = new Application();
            Workbook workbook = excel.Workbooks.Open(fileName);

            workbook.Sheets[worksheetNumber].Unprotect(); 
                // Can pass in password as parameter if needed

            Range range = workbook.Sheets[1].Range("A21:D21");

            for (int column = 0; column < contents.Count; column++)
            {
                range.Cells[1, column + 1] = contents[column];
            }

            workbook.Sheets[worksheetNumber].Protect();

            workbook.Save();
            workbook.Close();
            Marshal.ReleaseComObject(range);
            Marshal.ReleaseComObject(workbook);
            Marshal.ReleaseComObject(excel);
        }
    }
}