Я использую C# framework 4.5, netoffice 1.6 и SharpDevelop 4.4.1 для управления книгой Excel, расположенной на сетевом ресурсе, из Outlook.
В какой-то момент мне нужно изменить доступ к файлу объекта книги (ewb) для чтения и записи следующим образом:
ewb.ChangeFileAccess(Excel.Enums.XlFileAccess.xlReadWrite, System.Reflection.Missing.Value, true);
Прежде чем изменить доступ к файлу, я проверяю, не заблокирован ли файл на сервере. Если файл заблокирован, я уведомлю пользователя о повторной попытке позже.
Теперь я хочу включить в уведомление имя пользователя, которое блокирует файл Excel. Я искал msdn, форум netoffice и так далее... и не нашел решения. Я знаю, что если вы откроете файл excel для чтения, он сохранит имя пользователя в файле xlsx. Как я могу получить доступ к этой конкретной части информации через С#?
РЕДАКТИРОВАТЬ: я сделал это:
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 пользователь блокировки хранится во временном файле ~$. Я знаю, что для файла .xls это грязный код, но я понятия не имею, как устроен формат файла .xls. Поэтому я просто читаю кучу байтов, которые включают имя пользователя ascii, и делаю регулярное выражение для извлечения этого имени пользователя.