Запрос и обновление данных Excel с помощью ADO из ASP

Сводка

В этой статье показано, как запрашивать и обновлять сведения в электронной таблице Excel с помощью объектов данных ActiveX (ADO) со страницы Active Server Pages (ASP). В этой статье также описываются ограничения, связанные с этим типом приложений.

Важно!

Хотя приложения ASP/ADO поддерживают многопользовательский доступ, электронная таблица Excel этого не делает. Таким образом, этот метод запроса и обновления сведений не поддерживает одновременный доступ для нескольких пользователей.

Дополнительные сведения

Чтобы получить доступ к данным в электронной таблице Excel для этого примера, используйте Microsoft ODBC Driver for Excel. Создайте таблицу для доступа к данным, создав именованный диапазон в электронной таблице Excel.

Действия по созданию примера приложения

  • Создайте файл Excel ADOtest.xls со следующими данными на листе 1:

    column1 column2 column3
    Rr Это 15
    Bb test 20
    Ee Работает 25

    Примечание.

    Если столбец в электронной таблице Excel содержит как текст, так и цифры, драйвер ODBC для Excel не может правильно интерпретировать тип данных, который должен быть в столбце. Убедитесь, что все ячейки в столбце имеют один тип данных. Следующие три ошибки могут возникнуть, если каждая ячейка в столбце не относится к одному типу или типы смешаны между "text" и "general":

    1. Ошибка поставщика Microsoft OLE DB для драйверов ODBC "80040e21" Свойства запроса не поддерживаются этим драйвером ODBC.
    2. Ошибка поставщика Microsoft OLE DB для драйверов ODBC "80004005" Запрос не может быть обновлен, так как он не содержит столбцов с возможностью поиска для использования в качестве ключа надежды.
    3. Ошибка поставщика Microsoft OLE DB для драйверов ODBC "80004005" сбой обновления на основе запроса. Не удалось найти обновляемую строку.
  • Создайте именованный диапазон myRange1 в электронной таблице:

    1. Выделите области строк и столбцов, в которых находятся данные.
    2. В меню Вставка наведите указатель мыши на пункт Имя и нажмите кнопку Определить.
    3. Введите имя myRange1 в поле Имя именованного диапазона.
    4. Нажмите кнопку ОК.

    Именованный диапазон myRange1 содержит следующие данные:

    column1 column2 column3
    Rr Это 15
    Bb test 20
    Ee Работает 25

    Примечание.

    • ADO предполагает, что первая строка запроса Excel содержит заголовки столбцов. Таким образом, именованный диапазон должен включать заголовки столбцов. Это поведение отличается от DAO.
    • Заголовки столбцов не могут быть числами. Драйвер Excel не может интерпретировать их и вместо этого возвращает ссылку на ячейку. Например, заголовок столбца "F1" будет неправильно истолкованы.
  • Создайте имя системного источника данных ODBC (DSN), указывающее на файл ADOTest.xls.

    1. В панель управления откройте администратора ODBC.
    2. На вкладке Системный DSN нажмите кнопку Добавить.
    3. Выберите Драйвер Microsoft Excel (*.xls) и нажмите кнопку Готово. Если этот параметр не существует, необходимо установить драйвер Microsoft ODBC для Excel из программы установки Excel.
    4. Выберите ADOExcel в качестве имени источника данных.
    5. Убедитесь, что для значения Version задана правильная версия Excel.
    6. Щелкните "Выбрать книгу...", перейдите к файлу ADOTest.xls и нажмите кнопку ОК.
    7. Нажмите кнопку "Параметры>>" и снимите флажок "Только для чтения" проверка.
    8. Нажмите кнопку ОК, а затем снова нажмите кнопку ОК.
  • Задайте разрешения для файла ADOTest.xls.

Если доступ к странице активного сервера осуществляется анонимно, необходимо убедиться, что анонимная учетная запись (IUSR_<MachineName>) имеет по крайней мере доступ на чтение и запись (RW) к электронной таблице. Если вы хотите удалить сведения из электронной таблицы, необходимо предоставить соответствующие разрешения.

При проверке подлинности доступа к странице активного сервера необходимо убедиться, что все пользователи, обращаюющиеся к приложению, имеют соответствующие разрешения.

Если вы не задали соответствующие разрешения на электронную таблицу, появится сообщение об ошибке следующего вида:

Microsoft OLE DB Provider for ODBC Drivers error '80004005'

[Microsoft][ODBC Excel Driver] The Microsoft Jet database engine cannot open the file '(unknown)'. It is already opened exclusively by another user, or you need permission to view its data.
  1. Создайте страницу ASP и вставьте следующий код:

       <!-- Begin ASP Source Code -->
       <%@ LANGUAGE="VBSCRIPT" %>
       <%
         Set objConn = Server.CreateObject("ADODB.Connection")
         objConn.Open "ADOExcel"
    
    Set objRS = Server.CreateObject("ADODB.Recordset")
         objRS.ActiveConnection = objConn
         objRS.CursorType = 3                    'Static cursor.
         objRS.LockType = 2                      'Pessimistic Lock.
         objRS.Source = "Select * from myRange1"
         objRS.Open
    %>
    <br>
    <%
       Response.Write("Original Data")
    
    'Printing out original spreadsheet headings and values.
    
    'Note that the first recordset does not have a "value" property
       'just a "name" property.  This will spit out the column headings.
    
    Response.Write("<TABLE><TR>")
       For X = 0 To objRS.Fields.Count - 1
          Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>")
       Next
       Response.Write("</TR>")
       objRS.MoveFirst
    
    While Not objRS.EOF
          Response.Write("<TR>")
          For X = 0 To objRS.Fields.Count - 1
             Response.write("<TD>" & objRS.Fields.Item(X).Value)
          Next
          objRS.MoveNext
          Response.Write("</TR>")
       Wend
       Response.Write("</TABLE>")
    
    'The update is made here
    
    objRS.MoveFirst
       objRS.Fields(0).Value = "change"
       objRS.Fields(1).Value = "look"
       objRS.Fields(2).Value = "30"
       objRS.Update
    
    'Printing out spreadsheet headings and values after update.
    
    Response.Write("<br>Data after the update")
       Response.Write("<TABLE><TR>")
       For X = 0 To objRS.Fields.Count - 1
          Response.Write("<TD>" & objRS.Fields.Item(X).Name & "</TD>")
       Next
       Response.Write("</TR>")
       objRS.MoveFirst
    
    While Not objRS.EOF
          Response.Write("<TR>")
          For X = 0 To objRS.Fields.Count - 1
             Response.write("<TD>" & objRS.Fields.Item(X).Value)
          Next
          objRS.MoveNext
          Response.Write("</TR>")
       Wend
       Response.Write("</TABLE>")
    
    'ADO Object clean up.
    
    objRS.Close
       Set objRS = Nothing
    
    objConn.Close
       Set objConn = Nothing
    %>
    <!-- End ASP Source Code -->
    
  2. Сохраните и присвойте имя странице Active Server и просмотрите ее в браузере. Отобразится следующее:

    Original Data:
    
    |column1|column2|column3|
    |------------|------------|------------|
    |rr|this|30|
    |bb|test|20|
    |tt|works|25|
    
    Data after the update:
    
    |column1|column2|column3|
    |------------|------------|------------|
    |change|look|30|
    |bb|test|20|
    |tt|works|25|
    

Примечание.

Обновление было выполнено в первой строке именованного диапазона (после заголовков).