背景
我有一个旧站点,该站点允许授权用户上传产品数据等的Excel电子表格。然后该站点读取Excel工作表并将数据解压缩到SQL Server中。
这是一个旧站点,它使用OLE。老了,但是可以用。
问题
我最近将该网站发布到了Azure App Service ,但是从Excel读取的代码的现有部分不起作用(因为Azure没有正确的驱动程序)。
问题
我很高兴重写此部分代码,但是使用Azure App Service从Excel读取的正确或推荐方法是什么?
我不是在问MIGHT的工作方式,我只是对正确的方法感兴趣。
“推荐”是指:
我已经研究了此问题,但未能找到明确的最佳方法。如果您有不同方法的经验或知识,请与我们分享有关最佳方法的结论。
答案 0 :(得分:2)
应该有很多方法可以实现这一目标,在这里我列出了2个,如下所示:
1。使用由MS发布的DocumentFormat.OpenXml,但这有点复杂。演示代码为here。
2。使用ExcelDataReader,它非常简单并同时支持.xls and .xlsx
。您可以参考此article来执行此操作(请注意,IsFirstRowAsColumnNames
属性已被放弃,您可以在下面看到我的代码进行此更改)。
然后我用第二种方法ExcelDataReader
编写了一个演示。出于测试目的,我将excel上载到了azure Web应用程序目录,如下所示:
以下是excel内容:
步骤1:创建一个asp.net MVC项目,然后通过nuget软件包管理器安装最新版本ExcelDataReader
和ExcelDataReader.DataSet
。
第2步:在您的项目中创建一个ExcelData.cs文件,该文件用于读取excel文件:
第3步:在ExcelData.cs中编写以下代码:
using ExcelDataReader;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
namespace WebApplication42
{
public class ExcelData
{
string _path;
public ExcelData(string path)
{
_path = path;
}
public IExcelDataReader GetExcelReader()
{
FileStream stream = File.Open(_path, FileMode.Open, FileAccess.Read);
IExcelDataReader reader = null;
try
{
if (_path.EndsWith(".xls"))
{
reader = ExcelReaderFactory.CreateBinaryReader(stream);
}
if (_path.EndsWith(".xlsx"))
{
reader = ExcelReaderFactory.CreateOpenXmlReader(stream);
}
return reader;
}
catch (Exception)
{
throw;
}
}
//read the sheets name if you need
public IEnumerable<string> GetWorksheetNames()
{
var reader = this.GetExcelReader();
var workbook = reader.AsDataSet();
var sheets = from DataTable sheet in workbook.Tables select sheet.TableName;
return sheets;
}
//read data in a specified sheet
public IEnumerable<DataRow> GetData(string sheet)
{
var reader = this.GetExcelReader();
var workSheet = reader.AsDataSet(new ExcelDataSetConfiguration()
{
ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
{
//indicates if use the header values
UseHeaderRow = true
}
}).Tables[sheet];
var rows = from DataRow a in workSheet.Rows select a;
return rows;
}
}
}
第4步:在控制器中,调用read excel方法:
public ActionResult Excels()
{
ViewBag.Message = "the data from excel:";
string data = "";
//your excel path after uploaded, here I hardcoded it for test only
string path = @"D:\home\site\wwwroot\Files\ddd.xls";
var excelData = new ExcelData(path);
var people = excelData.GetData("sheet1");
foreach (var p in people)
{
for (int i=0;i<=p.ItemArray.GetUpperBound(0);i++)
{
data += p[i].ToString()+",";
}
data += ";";
}
ViewBag.Message += data;
return View();
}
第5步:发布到天蓝色后,启动网站并查看结果->读取excel中的所有数据:
答案 1 :(得分:0)
因此,我正在使用https://github.com/dotnetcore/NPOI进行Excel导入,并且已经在Azure App Service上进行了测试,这真的很好。我已经通过成功导入50,000条记录进行了测试。但是请注意,如果要导入约10万条记录,则可能会因为长时间运行的任务而收到请求超时错误,而应该创建Web作业/功能。 请记住,Azure App Service的requestTimeout限制为230s。在选择实现之前,请考虑以下链接。