Так что я думаю, что ваша проблема в Workbooks.Add (). Посмотрите, что Microsoft говорит об этом:
[Workbooks.Add ()] Определяет, как создается новая книга. Если этот аргумент является строкой, указывающей имя существующего файла Microsoft Excel, новая книга создается с указанным файлом в качестве шаблона.
blockquote>Я считаю, что создаваемая книга - это точная копия того, что есть на сервере sharepoint, включая разрешения. Тот факт, что он работает локально, является еще одним признаком того, что sharepoint может возиться с разрешениями.
Я предлагаю попробовать сохранить копию файла локально. Вы даже можете использовать объект
SaveFileDialog
, чтобы предоставить пользователю графический интерфейс для сохранения его новой копии.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
в качестве пути к файлу.
РЕДАКТИРОВАНИЕ: список ниже относится к анонимным типам C#. VB.NET имеет различные правила - в частности, это может генерировать изменяемые анонимные типы (и делает по умолчанию). Jared указал в комментарии, что стиль именования отличается, также. В основном это все довольно хрупко...
Вы не можете определить его в универсальном ограничении, но:
object
, который Очень мало этого гарантируется спецификацией, однако - таким образом, это могло все измениться в следующей версии компилятора, или если Вы используете Моно и т.д.
Как я вспоминаю, существует [CompilerGenerated]
маркер... 2 secs
Плюс имя будут причудливы, и это будет универсальный тип;-p
На самом деле, для того, "чтобы получать" и т.д. я, вероятно, просто использовал бы статический (недополнительный) метод.
, Если Вы просто хотите способ получить значение от экземпляра скоро-типа (позже), лямбда является, вероятно, наилучшим вариантом - отмечают, что Вам нужны несколько приемов для осуществления этого:
static void Main()
{
var foo = new { name = "John", age = 25 };
var func = Get(foo, x => x.age);
var bar = new { name = "Marc", age = 30 };
int age = func(bar);
}
// template here is just for type inference...
static Func<TSource, TValue> Get<TSource, TValue>(
TSource template, Func<TSource, TValue> lambda)
{
return lambda;
}
(ре редактирования комментарий) Там определенно этот атрибут:
var foo = new { A = "B" };
Type type = foo.GetType();
CompilerGeneratedAttribute attrib = (CompilerGeneratedAttribute) Attribute.GetCustomAttribute(
type, typeof(CompilerGeneratedAttribute)); // non-null, therefore is compiler-generated
В целях дополнительных методов нет никакого способа отличить анонимный тип. Дополнительные методы работают путем определения метода в течение времени компиляции nameable тип. Анонимные типы являются un-namable и поэтому не видимые во время компиляции. Это делает их несовместимыми с дополнительными методами.