2015-10-06 61 views
2

我得到Excel超鏈接的xlsx文檔。 超鏈接都不會忽略和子地址(也就是這樣VBA調用HTML片斷,所有#符號後)Epplus閱讀HTML片段的超鏈接我

Epplus庫中有每個細胞超鏈接屬性,但它只有HTML地址的第一部分,所以不是

stackoverflow.com#footer 

我:

stackoverflow.com 

有沒有辦法讀取與這個庫中的HTML片段的一部分?

代碼通過epplus閱讀鏈接:

 FileInfo xlsxFile = new FileInfo(_filePath); 
     using (ExcelPackage pck = new ExcelPackage(xlsxFile)) 
     { 
      var wb = pck.Workbook; 
      if (wb == null) 
       return null; 

      var ws = wb.Worksheets.FirstOrDefault(); 
      ExcelRange er = ws.Cells[0,0]; 
      var hyperlink = er.Hyperlink; 
+1

你能張貼在你是如何得到一些代碼網址? – Ernie

回答

2

這似乎是與擅長的方式儲存超鏈接和Epplus讀取它們的方式的問題。 Excel將超鏈接存儲在工作表本身以及工作表的關係文件中,該文件存儲工作簿部分(工作表,樣式,字符串等)之間的任何類型的交叉引用。這一切都與一個xlsx文件的結構有關,這個文件是基於OpenOffice XML標準的xml:OpenOffice XML Info

所以問題是Epplus依賴於那個不包含片段的關係文件,而「超鏈接'工作表xml中的節點。如果通過重命名將xlsx文件作爲zip文件打開,您可以在其細節中看到所有這些內容。

所以,簡短的回答是你不得不使用單元格對象的`.Value'。不夠乾淨,但它會起作用。例如,如果我創建這樣的細胞:

Excel with URL+Fragment

與此代碼:

var fi = new FileInfo(@"c:\temp\Html_Fragment.xlsx"); 
using (var pck = new ExcelPackage(fi)) 
{ 
    var wb = pck.Workbook; 
    var ws = wb.Worksheets.FirstOrDefault(); 
    ExcelRange er = ws.Cells[1,1]; 
    var hyperlink = er.Hyperlink; 

    Console.WriteLine(er.Value); 
    Console.WriteLine("{{Value: {0}, Hyperlink: {1}}}", er.Value, er.Hyperlink.AbsoluteUri); 
} 

給出了這樣的:

{ 
Value: https://msdn.microsoft.com/en-us/library/aa982683(v=office.12).aspx#Anchor_3, 
Hyperlink: https://msdn.microsoft.com/en-us/library/aa982683(v=office.12).aspx 
}