2017-01-18 102 views
0

我有一個可以下載並讀取Excel文件的c#webjob。其中一列包含我想要保存在數據庫中的鏈接。我目前使用ExcelDataReader將Excel文件轉換爲DataSet,然後遍歷行來獲取數據。轉換之後,此時所涉及的列僅爲包含鏈接文本的字符串。如何從Excel單元格中提取鏈接url

從其他閱讀中聽起來像在Excel中,超鏈接存儲在別處,並且在將Excel文件轉換爲DataSet時不會保留該信息。

我沒有設置使用ExcelDataReader,但希望找到解決方案來提取這些鏈接URL,而無需支付一些第三方軟件。

下面是簡單的代碼,我到目前爲止作爲參考:

FileStream stream = File.Open(fileLocation, FileMode.Open, FileAccess.Read); 
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); 
excelReader.IsFirstRowAsColumnNames = true; 

DataSet result = excelReader.AsDataSet(); 

int count = 0; 

foreach (DataRow row in result.Tables["WorkSheetName"].DataTable.Rows) 
{ 
    var item = new myObject(); 

    item.Prop1 = long.Parse(row["Column3"].ToString()); 
    item.Prop2 = row["Column7"].ToString(); //The link, currently only seeing link text 

    this.myDbContext.myTable.Add(item); 
    await this.myDbContext.SaveChangesAsync(); 

    count += 1; 
} 
+0

我不明白,你有一個字符串,並且希望將其轉換成一個URL? –

+0

在Excel文件中,它是一個超鏈接。將單元格作爲字符串讀取時,它只會提取鏈接文本,而不是鏈接導向的URL。 –

+0

在VBA中,連接到單元的超鏈接的地址屬性將返回URL。附加到單元格的超鏈接對象將是超鏈接集合中的第一個項目。所以在VBA中,它將看起來像'Range(「A1」)。超鏈接(1).address'的URL。你可以在C#中做類似的事嗎? –

回答

1

我最終能夠使用EPPLUS讀我的excel文件,以獲得超鏈接數據。

代碼:

var pck = new ExcelPackage(excelFileStream); 
ExcelWorksheet ws = pck.Workbook.Worksheets.First(); 

DataTable dt = new DataTable(ws.Name); 
int totalCols = ws.Dimension.End.Column; 
int totalRows = ws.Dimension.End.Row; 
int startRow = 3; 
ExcelRange wsRow; 
DataRow dr; 
foreach (var firstRowCell in ws.Cells[2, 1, 2, totalCols]) 
{ 
    dt.Columns.Add(firstRowCell.Text); 
} 

for (int rowNum = startRow; rowNum <= totalRows; rowNum++) 
{ 
    wsRow = ws.Cells[rowNum, 1, rowNum, totalCols]; 
    dr = dt.NewRow(); 
    int rowCnt = 0; 
    foreach (var cell in wsRow) 
    { 
     if (rowCnt == 7) 
     { 
      if (cell.Hyperlink != null) 
      { 
       dr[cell.Start.Column - 1] = cell.Hyperlink.AbsoluteUri; 
      } 
     } 
     else 
     { 
      dr[cell.Start.Column - 1] = cell.Text; 
     } 

     rowCnt++; 
    } 

    if (!String.IsNullOrEmpty(dr[7].ToString())) 
    { 
     dt.Rows.Add(dr); 
    } 
} 

return dt;