Azure Функция чтения файла excel (xlsx) - PullRequest
0 голосов
/ 03 марта 2020

Мне нужно импортировать файл Excel в Azure SQL. Это довольно частое занятие, поэтому нельзя использовать мастер или ручной процесс. Файл содержит 8000 строк и 95 столбцов. Я думаю использовать Azure функции, но чтение Excel с использованием open xml отнимает слишком много времени (локальный вечер). Есть ли у меня какая-либо другая опция, кроме open xml и оптимизации нижеприведенного кода?

Код:

using (SpreadsheetDocument workbook =
                         SpreadsheetDocument.Open(uploadedFile, false))
{
    var sheet = ExcelUtilities.GetFirstSheet(workbook);
    var workSheet = sheet.Worksheet;
    var sheetData = workSheet.GetFirstChild<SheetData>();
    IEnumerable<Row> rows = sheetData.Descendants<Row>();

    foreach (Cell cell in rows.ElementAt(0))
    {
        dt.Columns.Add(ExcelUtilities.GetCellValue(workbook, cell));
    }

    for (int rowIndex = 1; rowIndex < rows.Count(); rowIndex++)
    {
        var row = rows.ElementAt(rowIndex);
        DataRow tempRow = dt.NewRow();

        for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
        {
            tempRow[i] = ExcelUtilities.GetCellValue(workbook, row.Descendants<Cell>().ElementAt(i));
        }

        dt.Rows.Add(tempRow);
    }
}

Ограничения :

  • Я думаю, что interop.excel или OLEDB нельзя использовать в Azure функциях (в соответствии с этим { ссылка } Microsoft.Ace провайдеры недоступны)
  • OPENROWSET также не вариант

1 Ответ

0 голосов
/ 03 марта 2020

Если вы можете поместить / загрузить этот файл Excel в учетную запись хранения, вы можете использовать BULK INSERT для Azure SQL База данных.

В следующем примере используется внешний источник данных, указывающий на контейнер ( имени недели3) в учетной записи хранения Azure.

CREATE EXTERNAL DATA SOURCE MyAzureInvoicesContainer
    WITH (
        TYPE = BLOB_STORAGE,
        LOCATION = 'https://newinvoices.blob.core.windows.net/week3',
        CREDENTIAL = UploadInvoices
    );

Используя BULK INSERT, не используйте имя контейнера в описании файла:

BULK INSERT Colors2
FROM 'inv-2017-01-19.csv'
WITH (DATA_SOURCE = 'MyAzureInvoicesContainer',
      FORMAT = 'CSV');

Если вы все еще хотите использовать Azure Функция для этой задачи, здесь вы найдете полный пример.

...