Ich benutze C# Framework 4.5, NetOffice 1.6 und SharpDevelop 4.4.1, um eine Excel-Arbeitsmappe zu bearbeiten, die sich auf einer Netzwerkfreigabe in Outlook befindet.Programmatisch erhalten Benutzer, der eine Excel-Arbeitsmappe sperrt
An einem gewissen Punkt muß ich die Datei Zugriff des Arbeitsobjekts (EWB) ändern, wie dies zu readwrite:
ewb.ChangeFileAccess(Excel.Enums.XlFileAccess.xlReadWrite, System.Reflection.Missing.Value, true);
Bevor ich den Dateizugriff ändern, überprüfe ich, ob die Datei auf dem Server gesperrt ist . Wenn die Datei gesperrt ist, benachrichtige ich den Benutzer, die Aktion zu einem späteren Zeitpunkt erneut zu versuchen.
Jetzt möchte ich den Benutzernamen einschließen, der die Excel-Datei in der Benachrichtigung sperrt. Ich habe msdn, netoffice forum, usw. gesucht und habe keine Lösung gefunden. Ich weiß, dass wenn Sie die Excel-Datei readwrite öffnen, wird der Name des Benutzers in der XLSX-Datei gespeichert. Wie kann ich über C# auf diese bestimmte Information zugreifen?
EDIT: landete ich dies zu tun:
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 "";
}
}
Wir verwenden Excel 2003 und Excel 2007 + Dateiformat (.xls und .xlsx). Für .xls musste ich in der .xls Datei selbst suchen. Für .xlsx wird der Benutzer mit Sperrfunktion in der Datei ~ $ temp gespeichert. Ich weiß, für die .xls-Datei ist es schmutziger Code, aber ich habe keine Ahnung, wie das .xls-Dateiformat strukturiert ist. Daher lese ich gerade eine Reihe von Bytes, die den Ascii-Benutzernamen enthalten und eine Regex ausführen, um diesen Benutzernamen zu extrahieren.
haben Sie versucht, Win32_ConnectionShare und WMIC zu betrachten? –