从C#将Excel工作表保存为共享的不受保护的只读模式 - c#

我正在保存使用Workbook.SaveAs方法在C#中创建的工作表。 XlSaveAsAccessMode参数给了我一些问题。

xlShared将工作表保存在保护模式下,因此用户无法随意使用图表并仔细检查它们。它基本上显示为无法参考数据的死图。

xlExclusive允许用户保存图书的不受保护的访问权限,但不允许其他人访问。其他用户仍然看到无效的图表。

我需要将工作表保存为一种模式,使每个人都可以查看和检查它,并能够使用图表,将系列与数据点连接等。但是,与此同时,他们不应保存所做的更改覆盖文件。如何使用C#COM Excel API实现此目的?

参考-

http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.workbook.saveas(v=vs.80).aspx

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.xlsaveasaccessmode.aspx

参考方案

首先,使用密码进行修改以保存文件-在保存文件时,您可以在“另存为”对话框(在对话框底部的“工具”下拉菜单下)中执行此操作。还要选中“建议只读”复选框,以在文件上强制采用只读模式。

当用户打开文件时,Excel会要求输入写密码,但是没有该密码的用户将被迫进入只读模式。在只读mdoe中,用户可以对文件进行任何更改,但不能保存在原始文件上(无论文件系统中的只读属性如何)-他们只能将文件的新副本保存在新名称(或不同文件夹中的相同名称)。

若要以编程方式保存这些属性的工作簿,可以执行以下操作:

oWorkbook.SaveAs ( oWorkbook.Path + @"\Workbook.xls",
    Excel.XlFileFormat.xlWorkbookDefault,
    missing,
    "WritePassword",  // password against modification
    true,             // read-only recommended
    false,
    Excel.XlSaveAsAccessMode.xlNoChange,
    missing,
    missing,
    missing,
    missing,
    missing );

您还可以处理WorkBookBeforeSave事件,并使用跟踪信息更新工作簿以标识原始工作簿的副本。这将有助于以原始文件名保存在其他文件夹中的副本。 (我对这个特定事件不熟悉,但是您甚至可以在处理它时取消保存操作。)

除非您完全控制文件(仅使用Excel几乎是不可能的),否则用户将能够制作文件的副本,但是以上设置至少会迫使他们在原始文件完好无损的情况下保存新副本。这样可以解决您的问题吗?

从C#背景学习Java - c#

                    由于复杂的原因(不是C#的错,我非常喜欢该语言),我必须学习Java。我讨厌学习新的语言,而且我也不想学习我已经从C#了解的知识。有哪些资源可以在不学习所有内容的情况下教授不同之处? 参考方案 我意识到这不是一个非常具体的答案,但是我能给您的最好建议是不要以“我讨厌学习新语言”的心态来研究它。如果您熟悉C#,Java将…

从C#分配一个JavaScript变量 - c#

我有一些JavaScript,例如:<script type="text/javascript"> flashvars.myval = "blah"; //get this from c# ..etc </script> 我需要从C#中分配变量我怎样才能做到这一点?我可以调用C#方法吗?即时通讯…

Microsoft Excel 2010和Python中的受保护视图 - python

这里没有代码示例。刚遇到Microsoft Excel 2010的问题,我在linux上有一个python脚本,可从csv文件中提取数据,将数据推送到excel,然后将该文件作为附件通过电子邮件发送到特定的电子邮件地址。我的问题是我在excel文件中使用公式,并且在它第一次打开时进入“ Protected View”。在单击“启用编辑”后,我的公式才会加载。…

从C++调用Python函数 - c++

我正在尝试从C++实现调用Python函数。我以为可以通过函数指针来实现,但是似乎不可能。我一直在使用boost.python完成此操作。假设在Python中定义了一个函数:def callback(arg1, arg2): #do something return something 现在,我需要将此函数传递给C++,以便可以从那里调用它。如何使用boos…

从C++创建的二进制文件中读取Int64值失败 - c#

我正在开发一个C#CE应用程序,以从由C ++ progam创建的二进制文件中读取数据以进行项目验证。下面是C ++程序的编码。 // File Name: Ean2an.bin which is created by struct struct EAN2AN_TYPE { __int64 ean:40; // 5 bytes, up to 12 digit…