using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
{
//XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
if (fileExt == ".xlsx")
{
workbook = new XSSFWorkbook(fs);//此处会报错提示The hyperlink for cell I2 references relation rId1, but that didn't exist!(单元格引用的超链接关系不存在!)
}
else if (fileExt == ".xls")
{
workbook = new HSSFWorkbook(fs);
}
else
{
workbook = null;
Console.WriteLine(string.Format("未选择正确的xlsx文件-{0}", DateTime.Now));
}
if (workbook == null)
{
return null;
}
//得到excel的sheet数
for (int k = 0; k < workbook.NumberOfSheets; k++)
{
if (workbook.IsSheetHidden(k))
{
continue;
}
DataTable dt = new DataTable();
ISheet sheet = workbook.GetSheetAt(k);
//表头
IRow header = sheet.GetRow(sheet.FirstRowNum);
List<int> columns = new List<int>();
for (int i = 0; i < header.LastCellNum; i++)
{
object obj = GetValueType(header.GetCell(i), workbook);
if (obj == null || obj.ToString() == string.Empty)
{
dt.Columns.Add(new DataColumn("Columns" + (i + 1).ToString()));
Console.WriteLine(string.Format("Excel文件{0}中{1}列表头不存在", sheet.SheetName, (i + 1).ToString()));
}
else
{
if (dt.Columns.Contains(obj.ToString()))
{
obj = obj + i.ToString();
}
dt.Columns.Add(new DataColumn(obj.ToString()));
}
columns.Add(i);
}
//数据
for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
{
DataRow dr = dt.NewRow();
bool hasValue = false;
if (sheet.GetRow(i) != null)
{
foreach (int j in columns)
{
dr[j] = GetValueType(sheet.GetRow(i).GetCell(j), workbook);
if (dr[j] != null && dr[j].ToString() != string.Empty)
{
hasValue = true;
}
}
if (hasValue)
{
dt.Rows.Add(dr);
}
}
else
{
Console.WriteLine(string.Format("Excel文件{0}中{1}行数据为空", sheet.SheetName, i.ToString()));
}
}
dict.Add(sheet.SheetName, dt);
}
}
[(https://img2018.cnblogs.com/q/1244030/201910/1244030-20191023131850349-637510532.png)]
怎么去处理这个带有超链接格式的文本呢?求教求教
npoi 貌似没有办法解决,java版本 3.9以上fix了这个问题。
可以考虑从source code打一个包 fix。
https://github.com/tonyqus/npoi/blob/master/ooxml/XSSF/UserModel/XSSFHyperlink.cs#L77
你可以尝试使用Spire.XLS来读取
除了这个使用其他的组件,在NPOI上有没有解决方法呢
读取的内容 文字和链接用 && 拼接
有没有大佬遇到过这问题?有没有解决方案呢
– Mr_Height 5年前暂时的处理办法就是导入数据之前取消所有超链接文本的超链接。之后再导入数据了。哈哈谢谢啦各位
– Mr_Height 5年前@Mr_Height: 我前几天处理了 NPOI 读取execl的 File 超链接 和文本 ,我觉得 应该对你有帮助
– 烟雨画江南 5年前@烟雨画江南: 现在的问题是这样的 如果你导入的数据内容比如是 12345678@ 并且带着超链接下划线,而且编辑这个超链接的时候打开的那个页面也是@结尾,这时候IIWorkbook workbook = new XSSFWorkbook(stream); 这个里就是空的了,在这时候还没有开始循环读取数据
– Mr_Height 5年前@Mr_Height: 没处理过这种情况,我处理的是 某列单元格为文本超链接
– 烟雨画江南 5年前@烟雨画江南: 所以啊 现在的问题就是如果超链接地址的最后一个字符是@,那就没法创建IworkBook 对象了
– Mr_Height 5年前@Mr_Height: 你的超链接 是电子邮箱?地址
– 烟雨画江南 5年前@烟雨画江南: 对啊 公司的测试在测试的时候乱输入的。。就以@结尾了,很烦哈哈
– Mr_Height 5年前@Mr_Height: 看我下面截图 读取的内容 文字和链接用 && 拼接
– 烟雨画江南 5年前