Как извлечь ссылку URL из ячейки Excel
У меня есть aC# webjob, который загружает, а затем читает файл Excel. Один из столбцов содержит ссылки, которые я хотел бы сохранить в своей базе данных. В настоящее время я использую ExcelDataReader для преобразования файла Excel в набор данных, а затем циклически перебираю строки, чтобы получить данные. После преобразования рассматриваемый столбец на данный момент представляет собой только строку, содержащую текст ссылки.
Из какого-то другого чтения это звучит как в 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;
}
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;