2012-06-23 3 views
2

Мне нужно прочитать Worksheet.CustomProperies. Есть ли способ прочитать эти свойства?Worksheet.CustomProperites OpenXML

Я также пытался получать XmlDocument из книги и листа с помощью

XmlDocument xlDoc = ws.WorksheetXml; 

Дает мне:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> 
<dimension ref="A3:K24" /> 
<sheetViews> 
<sheetView tabSelected="1" workbookViewId="0"><selection activeCell="H14" sqref="H14" /></sheetView> 
</sheetViews> 
<sheetFormatPr defaultRowHeight="15" /> 
<cols></cols><sheetData /> 
<pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3" /> 
<pageSetup orientation="portrait" horizontalDpi="4294967293" verticalDpi="4294967293" r:id="rId2" /> 
**<customProperties><customPr name="My_CustomProperty" r:id="rId3" /></customProperties>** 
</worksheet> 

Я вижу CustomProperty там, но не в состоянии увидеть значение CustomProperty. Когда я перехожу в файл bin CustomValty (Zip xlsx и извлекает содержимое), значение есть.

Я загрузил документ here

+0

Можете ли вы загрузить документ где-нибудь? – emd

+0

Загружено здесь: https://www.dropbox.com/s/ljph3nnbmddycyn/Users_Template_12_22_Template.xlsx – Cannon

ответ

1

Я не знаком с этими пользовательскими свойствами, но вот один из способов извлечь содержимое файла customProperty1.bin из вашего образца документа, используя последнюю версию EPPlus:

using (ExcelPackage p = new ExcelPackage(new FileInfo(@"C:\Users_Template_12_22_Template.xlsx"))) 
{ 
    var parts = p.Package.GetParts(); 
    foreach (var part in parts) 
    { 
     if (part.ContentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty") 
     { 
      using (var stream = part.GetStream()) 
      { 
       byte[] data = new byte[stream.Length]; 
       stream.Read(data, 0, (int)stream.Length); 
       stream.Close(); 

       string customPropertyInfo = System.Text.Encoding.Unicode.GetString(data); 
      } 
     } 
    } 
} 

Если вы знаете имя/расположение customProperty1.bin файла, который вы можете получить доступ к нему с помощью GETPART() вместо GetParts():

var u = new Uri("/xl/customProperty1.bin", UriKind.Relative); 
var part = p.Package.GetPart(u);    

Обратите внимание, что вам нужно добавить ссылку на WindowsBase.dll (на вкладке .NET в Add Reference), чтобы использовать связанные с упаковкой методы.

+0

Да. Решение, о котором вы упомянули, читает содержимое customProperty.bin, но затем я попал в проблему получения имени CustomProperty. Мне нужно получить CustomPropertyName и соответствующее значение. Есть ли какая-либо часть XML, которая имеет это отношение Name-Value, i.eustomProperty1.bin относится к имени X CustomProeprty? – Cannon

+0

В вашем примере файла я даже не уверен, какое значение вы бы ожидали для CA_Users_16, но, может быть, вы сможете получить значение как-то, если вы выясните, как содержимое делится. Вот то, что я увидел из вашего образца файла: Users - Users | 16 | 4 | False | True | False | CA_Users_16 | 20 | UserID: 0, FirstName: 3, RoleID: 5, RoleIDs: 6, IsActive: 8, IsRememberPassword: 10 – Gloopy

+0

В моем примере CA_Users_16 является именем CustomProperty. И '|' Разделяемая строка - это соответствующее значение. В VSTO на клиенте я могу перемещать CustomProperties по Worksheet и Получить объект CustomProperty, который дает мне имя и значение. Но я пытаюсь достичь Office Automation на сервере, где я не могу использовать VSTO. Подход грубой силы заключался бы в том, чтобы получить имена с тем, что я делаю. А затем получите все данные bin с помощью вашего метода. Сделайте еще один раунд для сопоставления имени со значениями, которые не будут решением. – Cannon