Excel 文件创建为只读

Excel File created as read only

我在 C# 中使用 VSTO 创建了一个 Excel 加载项。我想从位于 SharePoint 网站上的模板创建一个新的 Excel 文件。使用文件选择器对话框,以便用户可以选择要用作模板的文件。一切正常,但新工作簿创建为只读。如果我在我的计算机上复制模板文件,并使用相同的程序选择该文件作为模板,则新工作簿不会创建为只读。

创建新文件时,sharePoint 上的文件未被其他软件打开。有没有办法指定 sharePoint 库是安全源?或者将新创建的工作簿设置为 readonly 属性 为 false?

{

string pathSP= @”\Business.sharepoint.com@SSL\teams\group\NDC\”;

if (System.IO.Directory.Exists(pathSP))
{
    Excel.Application excelObj = Globals.ThisAddIn.Application;
    Office.FileDialog fileDialog = excelObj.FileDialog[Office.MsoFileDialogType.msoFileDialogFilePicker];
    fileDialog.InitialFileName = initialPath;
    fileDialog.AllowMultiSelect = false;
    fileDialog.InitialView = Office.MsoFileDialogView.msoFileDialogViewDetails;
    fileDialog.Title = "Create Excel file from template";
    fileDialog.Filters.Clear();
    fileDialog.Filters.Add("Excel template", "*.xls; *.xlsx; *.xlsm; *.xltx; *.xltm; *.xlt", 1);
    string TemplatePath;

    if (fileDialog.Show() == -1)
    {
        templatePath = fileDialog.SelectedItems.Item(1);
        fileDialog = null; 
    }
    else
    {
        templatePath=""
        fileDialog = null;
    }


    if (templatePath != "")
    {
        Excel.Workbook ws= excelObj.Workbooks.Add(templatePath);
    }

}     
else
{
    MessageBox.Show("SharePoint site is not available", "Create Excel file from template", MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
}

}

所以我认为你的问题是 Workbooks.Add()。看看微软是怎么说的:

[Workbooks.Add()] Determines how the new workbook is created. If this argument is a string specifying the name of an existing Microsoft Excel file, the new workbook is created with the specified file as a template.

我相信您正在创建的工作簿是 Sharepoint 服务器拥有的任何内容(包括权限)的副本。它在本地工作的事实是另一个线索,表明 Sharepoint 可能在摆弄权限。

我建议尝试在本地保存一份文件副本。您甚至可以使用 SaveFileDialog 对象为用户提供一个 GUI 来保存他们的新副本。

SaveFileDialog userSaveFileDialog = new SaveFileDialog();  
userSaveFileDialog.Filter = "Excel 2007 and later | *.xlsx, Excel Macro Enabled Worksheet | *.xlsm, I'm guessing this is a 2007 template | *.xltx, Template Macro maybe | *.xltm, I almost definitely think this is a template file | *.xlt";  
userSaveFileDialog.Title = "Save an Excel File";  
userSaveFileDialog.ShowDialog();  
this.Application.ActiveWorkbook.SaveCopyAs(@userSaveFileDialog.FileName);

完成后,您可以使用 userSaveFileDialog.FileName 作为文件路径以编程方式打开新保存的工作簿。

对于您提到的两种方式:

  1. 将共享点库设置为安全源 - 这可以通过设置 excel 设置来实现:选项 -> 信任中心 -> 信任中心设置 -> 受信任的位置 ->添加共享点位置

  2. 在进程结束时设置文件访问权限 (readonly=false)

实际上作为处理模板文件的一般做法(不限于excel),系统应该将模板文件复制到本地临时位置(最好是运行用户的TEMP文件夹) , 使用它然后删除它。这样可以避免各种问题,例如 file-lock-by-other-user/process 问题。