使用Azure应用服务从Excel文件读取数据的推荐方法?

时间:2018-11-07 12:38:13

标签: sql-server excel azure azure-web-sites

背景
我有一个旧站点,该站点允许授权用户上传产品数据等的Excel电子表格。然后该站点读取Excel工作表并将数据解压缩到SQL Server中。 这是一个旧站点,它使用OLE。老了,但是可以用。

问题
我最近将该网站发布到了Azure App Service ,但是从Excel读取的代码的现有部分不起作用(因为Azure没有正确的驱动程序)。

问题
我很高兴重写此部分代码,但是使用Azure App Service从Excel读取的正确或推荐方法是什么? 我不是在问MIGHT的工作方式,我只是对正确的方法感兴趣。

“推荐”是指:

  • 不是不必要的复杂。保持简单。
  • 将来可能会保留来自Microsoft的支持

我已经研究了此问题,但未能找到明确的最佳方法。如果您有不同方法的经验或知识,请与我们分享有关最佳方法的结论。

2 个答案:

答案 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软件包管理器安装最新版本ExcelDataReaderExcelDataReader.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。在选择实现之前,请考虑以下链接。

https://feedback.azure.com/forums/169385-web-apps/suggestions/19309957-allow-a-request-timeout-of-more-then-3-8-minutes

Azure ASP .net WebApp - 500 Error - The request timed out