我正在使用C#框架4.5,netoffice 1.6和sharpdevelop 4.4.1来操作一个位于网络共享中的Excel工作簿,并从Outlook内部进行操作。
在某些情况下,我需要像这样更改工作簿对象(ewb)的文件访问权限为读写:
在改变文件访问权限之前,我会检查服务器上的文件是否被锁定。如果文件被锁定,我会通知用户稍后再尝试操作。
现在,我想在通知中包含锁定Excel文件的用户名。我已经搜索了 msdn、NetOffice 论坛等等,但都没有找到解决方案。 我知道,如果你以读写方式打开 Excel 文件,它会在 xlsx 文件中存储用户的名称。如何通过 C# 访问这个特定的信息呢?
编辑: 最终,我做了这个:
我们使用的是Excel 2003和Excel 2007+文件格式(.xls和.xlsx)。 对于.xls,我必须查看.xls文件本身。 对于.xlsx,锁定用户存储在~$ temp文件中。 我知道,对于.xls文件,这是肮脏的代码,但我不知道.xls文件格式的结构。 因此,我只读取了一堆包括ASCII用户名的字节,并使用正则表达式提取该用户名。
在某些情况下,我需要像这样更改工作簿对象(ewb)的文件访问权限为读写:
ewb.ChangeFileAccess(Excel.Enums.XlFileAccess.xlReadWrite, System.Reflection.Missing.Value, true);
在改变文件访问权限之前,我会检查服务器上的文件是否被锁定。如果文件被锁定,我会通知用户稍后再尝试操作。
现在,我想在通知中包含锁定Excel文件的用户名。我已经搜索了 msdn、NetOffice 论坛等等,但都没有找到解决方案。 我知道,如果你以读写方式打开 Excel 文件,它会在 xlsx 文件中存储用户的名称。如何通过 C# 访问这个特定的信息呢?
编辑: 最终,我做了这个:
public string GetExcelFileOwner(string path, NetOffice.ExcelApi.Enums.XlFileFormat ffmt) {
string tempmark = "~$";
if(ffmt==NetOffice.ExcelApi.Enums.XlFileFormat.xlExcel8) {
tempmark = "";
}
string uspath = Path.Combine(Path.GetDirectoryName(path), tempmark + Path.GetFileName(path));
if (!File.Exists(uspath)) return "";
var sharing = FileShare.ReadWrite | FileShare.Delete;
using (var fs = new FileStream(uspath, FileMode.Open, FileAccess.Read, sharing))
using (var br = new BinaryReader(fs, Encoding.Default)) {
if(ffmt==NetOffice.ExcelApi.Enums.XlFileFormat.xlExcel8) {
byte[] ByteBuffer = new byte[500];
br.BaseStream.Seek(150, SeekOrigin.Begin);
br.Read(ByteBuffer, 0, 500);
return matchRegex(System.Text.Encoding.UTF8.GetString(ByteBuffer), @"(?=\w\w\w)([\w, ]+)").Trim();
}
else {
return br.ReadString();
}
}
}
private static string matchRegex(string txt, string rgx) {
Regex r;
Match m;
try {
r = new Regex(rgx, RegexOptions.IgnoreCase);
m = r.Match(txt);
if (m.Success) {
return m.Groups[1].Value.ToString();
}
else {
return "";
}
}
catch {
return "";
}
}
我们使用的是Excel 2003和Excel 2007+文件格式(.xls和.xlsx)。 对于.xls,我必须查看.xls文件本身。 对于.xlsx,锁定用户存储在~$ temp文件中。 我知道,对于.xls文件,这是肮脏的代码,但我不知道.xls文件格式的结构。 因此,我只读取了一堆包括ASCII用户名的字节,并使用正则表达式提取该用户名。