从 Azure Excel blob 文件将数据导入 SQL Server

Posted

技术标签:

【中文标题】从 Azure Excel blob 文件将数据导入 SQL Server【英文标题】:Import data into SQL Server from an Azure Excel blob file 【发布时间】:2015-10-15 12:02:12 【问题描述】:

我有一个 MVC Web 应用程序,它允许用户将 Excel 文件上传到 Azure 云存储,然后该应用程序使用该 Azure 存储的 Excel blob 文件将数据导入 SQL Server。

我关注网站 http://www.codeproject.com/Tips/752981/Import-Data-from-Excel-File-to-Database-Table-in-A

Upload Excel File and Extract Data from it and put that data in database using MVC asp.net

做我的申请。但是,来自站点 http://www.codeproject.com/Tips/752981/Import-Data-from-Excel-File-to-Database-Table-in-A 的示例允许用户将文件上传到 部署应用程序而不是 Azure 存储的 Web 服务器,并且“fileLocation”变量的内容(请参见下面的代码)看起来像(相对于网络服务器托管的应用程序路径 C 或任何驱动器)"C:\MyWebApplicationFolder\MyApplicatioName\Content\Excel_blob.xlsx"

我的问题:对于 Azure 存储 Excel blob 文件,如何指定“fileLocation”和“excelConnectionString”变量的值?请查看我的以短语“// *** 如何使用 Azure 存储代码执行此操作?”开头的代码 cmets?下面。

来自http://www.codeproject.com/Tips/752981/Import-Data-from-Excel-File-to-Database-Table-in-A的代码

[HttpPost]
public ActionResult Upload(HttpPostedFileBase file)

    DataSet ds = new DataSet();
    if (Request.Files["file"].ContentLength > 0)
    
        string fileExtension =  System.IO.Path.GetExtension(Request.Files["file"].FileName);

        if (fileExtension == ".xls" || fileExtension == ".xlsx")
        
            string fileLocation = Server.MapPath("~/Content/") + Request.Files["file"].FileName;  // *** How can I can do this with Azure storage codes?

        if (System.IO.File.Exists(fileLocation))
        
            System.IO.File.Delete(fileLocation);
        
        Request.Files["file"].SaveAs(fileLocation);
        string excelConnectionString = string.Empty;

        excelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +     fileLocation + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";  // *** How can I can do this with Azure storage codes?


        //connection String for xls file format.
        if (fileExtension == ".xls")
        
            excelConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +   fileLocation + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";     // *** How can I can do this with Azure storage codes?
        
        //connection String for xlsx file format.
        else if (fileExtension == ".xlsx")
        
            excelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +   fileLocation + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";     // *** How can I can do this with Azure storage codes?
          

        ...  

【问题讨论】:

我和你在同一个球场,问题领域。我认为这里更大的问题是上面连接字符串中引用的 OLEDB 驱动程序在 Azure 网站环境中不存在 - 没有安装 Office 应用程序/驱动程序。 因此,即使您的文件位置正确(在 Azure 上,您对应用程序文件夹的根目录及以下('~/' 及以下)具有写访问权限),那么更大的问题是实际司机自己。 【参考方案1】:

也许您可以先将 blob 文件从 Azure 下载到您的服务器磁盘,然后再将其导入您的数据库。您可以下载完整的项目here。

正在下载:

container.CreateIfNotExists();
CloudBlockBlob blob = container.GetBlockBlobReference(excelName);
blob.DownloadToFile(filePath, FileMode.Create);

读取文件到数据表:

DataTable dt = new DataTable();
using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(filePath, false))

    //Get sheet data
    WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
    IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
    string relationshipId = sheets.First().Id.Value;
    WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
    Worksheet workSheet = worksheetPart.Worksheet;
    SheetData sheetData = workSheet.GetFirstChild<SheetData>();
    IEnumerable<Row> rows = sheetData.Descendants<Row>();

    // Set columns
    foreach (Cell cell in rows.ElementAt(0))
    
        dt.Columns.Add(cell.CellValue.InnerXml);
    

    //Write data to datatable
    foreach (Row row in rows.Skip(1))
    
        DataRow newRow = dt.NewRow();
        for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
        
            if (row.Descendants<Cell>().ElementAt(i).CellValue != null)
            
                newRow[i] = row.Descendants<Cell>().ElementAt(i).CellValue.InnerXml;
            
            else
            
                newRow[i] = DBNull.Value;
            
        
        dt.Rows.Add(newRow);
    

使用批量复制将数据插入数据库

 //Bulk copy datatable to DB
 SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionStr);
 try
 
     columns.ForEach(col =>  bulkCopy.ColumnMappings.Add(col, col); );
     bulkCopy.DestinationTableName = tableName;
     bulkCopy.WriteToServer(dt);
 
 catch (Exception ex)
 
     throw ex;
 
 finally
 
     bulkCopy.Close();
 

【讨论】:

以上是关于从 Azure Excel blob 文件将数据导入 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

需要通过oledb连接从azure存储blob容器中读取excel文件

如何在 Python 中将 Azure Blob 文件 CSV 转换为 Excel

使用 openxml 将行追加到 azure blob 存储中的 excel

Azure Blob 存储:从 Excel 工作簿中删除密码

如何将所有格式的excel文件上传/下载到azure blob存储Nodejs服务器端

Azure 逻辑应用可以从存储帐户中读取 excel 文件吗?