C# 如何从Excel单元格中提取链接url

C# 如何从Excel单元格中提取链接url,c#,asp.net,excel,dataset,exceldatareader,C#,Asp.net,Excel,Dataset,Exceldatareader,我有一个c#webjob,可以下载然后读取Excel文件。其中一列包含我希望保存在数据库中的链接。我目前正在使用ExcelDataReader将Excel文件转换为数据集,然后通过行循环获取数据。转换后,此时讨论的列只是一个包含链接文本的字符串 从其他一些阅读资料来看,这听起来像是在Excel中,超链接存储在其他地方,并且在将Excel文件转换为数据集时不会保留这些信息 我不打算使用ExcelDataReader,但我想找到一个解决方案来提取这些链接URL,而不必为某些第三方软件付费 以下是我迄

我有一个c#webjob,可以下载然后读取Excel文件。其中一列包含我希望保存在数据库中的链接。我目前正在使用ExcelDataReader将Excel文件转换为数据集,然后通过行循环获取数据。转换后,此时讨论的列只是一个包含链接文本的字符串

从其他一些阅读资料来看,这听起来像是在Excel中,超链接存储在其他地方,并且在将Excel文件转换为数据集时不会保留这些信息

我不打算使用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;
}

我最终能够使用EPPLUS读取excel文件来获取超链接数据

代码:

var pck=新的ExcelPackage(excelFileStream);
Excel工作表ws=pck.Workbook.Worksheets.First();
DataTable dt=新的DataTable(ws.Name);
int totalCols=ws.Dimension.End.Column;
int totalRows=ws.Dimension.End.Row;
int startRow=3;
ExcelRange wsRow;
数据行dr;
foreach(ws.Cells[2,1,2,totalCols]中的var firstRowCell)
{
dt.Columns.Add(firstRowCell.Text);
}

对于(int rowNum=startRow;rowNum我不明白,您有一个字符串,您想将其转换为URL?在Excel文件中,它是一个超链接。当以字符串形式读取单元格时,它只提取链接文本,而不是链接指向的URL。在VBA中,附加到单元格的超链接的address属性将返回URL。hyperli连接到单元格的nk对象将是超链接集合中的第一项。因此,在VBA中,它看起来类似于URL的
Range(“A1”)。超链接(1)。address
。您可以在C#中执行类似的操作吗?Ron,看起来我只需要使用一个插件来访问该数据,谢谢。
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;