【问题标题】:How to extract link url from Excel cell如何从 Excel 单元格中提取链接 url
【发布时间】:2017-06-03 07:29:09
【问题描述】:

我有一个下载然后读取 Excel 文件的 c# webjob。其中一列包含我想保存在我的数据库中的链接。我目前正在使用 ExcelDataReader 将 Excel 文件转换为 DataSet,然后遍历行以获取数据。转换后,此时有问题的列只是一个包含链接文本的字符串。

从其他读物看来,在 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;
}

【问题讨论】:

  • 我不明白,你有一个字符串,你想把它转换成一个 URL?
  • 在 Excel 文件中它是一个超链接。将单元格作为字符串读取时,它只会提取链接文本,而不是链接指向的 URL。
  • 在 VBA 中,附加到单元格的超链接的地址属性将返回 URL。附加到单元格的超链接对象将是 Hyperlinks 集合中的第一项。因此,在 VBA 中,URL 看起来类似于 Range("A1").Hyperlinks(1).address。你能在 C# 中做类似的事情吗?
  • Ron,看来我只需要使用一个插件,让我可以访问该数据,谢谢。

标签: c# asp.net excel dataset exceldatareader


【解决方案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;

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    相关资源
    最近更新 更多