Невозможно импортировать файл Excel в vbscript из-за ошибки: внешняя таблица не в ожидаемом формате - PullRequest
0 голосов
/ 05 января 2011

Я не могу импортировать лист Excel, который был экспортирован:

Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader "content-disposition", "attachment; filename="example.xls"

Я получаю следующую ошибку:

"Microsoft JET Database Engine error '80004005'

External table is not in the expected format."

Пожалуйста, помогите, спасибо!

Ответы [ 2 ]

0 голосов
/ 12 мая 2011

Это будет во многом зависеть от того, как вы экспортируете файл, а также от того, как вы пытаетесь импортировать файл. В отсутствие опубликованного кода для экспорта я включу обе стороны, используемые в проекте, который у нас здесь работает.

Для контекста эти фрагменты относятся к файлам VBScript, которые запускаются локально и импортируют / экспортируют файлы на сервер.

Сценарий экспорта

Помимо использования типа содержимого / заголовков, которые вы разместили, в HTML есть несколько особых требований, которые должны быть распознаны Excel как электронная таблица. Вот как выглядит некоторая функция заголовка:

Function XLSHeader()
    XLSHeader = "<html xmlns:x=""urn:schemas-microsoft-com:office:excel"">" & vbNewLine
    XLSHeader = XLSHeader & "<head>" & vbNewLine & "<style>" & vbNewLine
    XLSHeader = XLSHeader & "<!--table" & vbNewLine
    XLSHeader = XLSHeader & "@page" & vbNewLine
    XLSHeader = XLSHeader & "{mso-header-data:""&CRegistrationList\000A"
    XLSHeader = XLSHeader & "Printed\: &D\000APage &P"";}" & vbNewLine
    XLSHeader = XLSHeader & "br" & vbNewLine
    XLSHeader = XLSHeader & "{mso-data-placement:same-cell;}" & vbNewLine
    XLSHeader = XLSHeader & "-->" & vbNewLine
    XLSHeader = XLSHeader & "td {border:1px solid black; border-collapse:collapse;}" & vbNewLine
    '-- other sheet-specific styles and formatting went here --'
    XLSHeader = XLSHeader & "</style>" & vbNewLine
    XLSHeader = XLSHeader & "<!--[if gte mso 9]><xml>" & vbNewLine
    XLSHeader = XLSHeader & "<x:ExcelWorkbook>" & vbNewLine
    XLSHeader = XLSHeader & "<x:ExcelWorksheets>" & vbNewLine
    XLSHeader = XLSHeader & "<x:ExcelWorksheet>" & vbNewLine
    XLSHeader = XLSHeader & "<x:Name>RegistrationList</x:Name>" & vbNewLine
    XLSHeader = XLSHeader & "<x:WorksheetOptions>" & vbNewLine
    XLSHeader = XLSHeader & "<x:Print>" & vbNewLine
    XLSHeader = XLSHeader & "<x:ValidPrinterInfo/>" & vbNewLine
    XLSHeader = XLSHeader & "</x:Print>" & vbNewLine
    XLSHeader = XLSHeader & "</x:WorksheetOptions>" & vbNewLine
    XLSHeader = XLSHeader & "</x:ExcelWorksheet>" & vbNewLine
    XLSHeader = XLSHeader & "</x:ExcelWorksheets>" & vbNewLine
    XLSHeader = XLSHeader & "</x:ExcelWorkbook>" & vbNewLine
    XLSHeader = XLSHeader & "</xml><![endif]-->" & vbNewLine
    XLSHeader = XLSHeader & "</head>" & vbNewLine & "<body>" & vbNewLine
    XLSHeader = XLSHeader & "<table>" & vbNewLine
    XLSHeader = XLSHeader & "<tr>" & vbNewLine
    '-- all the <th> went here, defining the header row --'
    XLSHeader = XLSHeader & "</tr>" & vbNewLine
End Function
'-- Other excel options were defined in the <head> above, but have been stripped to make this code block a little shorter --'

Остальная часть таблицы была выписана как обычно. Некоторые важные вещи, на которые стоит обратить внимание:

  • По какой-то причине Excel привередлив в отношении CSS, который он поддерживает и не поддерживает. Мне пришлось поместить весь CSS в <head>, так как было слишком много странных проблем с внешними таблицами стилей.
  • Существуют всевозможные специальные классы, которые вы можете добавить к <td> для включения / выключения различных функций Excel (например, блокировка ячейки для предотвращения редактирования)
  • Закройте таблицу и HTML как обычно.
  • Не должно быть другого содержимого, кроме заголовка, таблицы и правильных закрывающих элементов.

Скрипт импорта

Способ его импорта зависит от того, в каком формате он был сохранен. Некоторые люди, использующие нашу систему, в конечном итоге сохраняют данные в формате Excel 2007/2010, а некоторые сохраняют его обратно в формате Excel <= 2003. Итак, скрипт импорта начинается с: </p>

    'Connection string info at http://www.connectionstrings.com/excel-2007
    If Right(objFile.Name, 4) = ".xls" Or Right(objFile.Name, 5) = ".xlsb" Then
        strExcelConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & objFile.Path & ";Extended Properties=""Excel 12.0;HDR=YES"";"
        strSQL = "SELECT * FROM [RegistrationList$] ORDER BY EmployeeNumber;"
    ElseIf Right(objFile.Name, 5) = ".xlsx" Then
        strExcelConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & objFile.Path & ";Extended Properties=""Excel 12.0 Xml;HDR=YES"";"
        strSQL = "SELECT * FROM [RegistrationList$] ORDER BY EmployeeNumber;"
    Else
        '-- Error handling code went here --'
    End If

Обратите внимание, что "имя таблицы" - это имя листа в рабочей книге. Теоретически вы можете получить к нему доступ без имени, но я не смог заставить его работать на практике со справочным кодом MS.

С этого момента вы можете обращаться с ним как с любым другим источником данных

Set objExcel = CreateObject("ADODB.Recordset")
objExcel.Open strSQL, strExcelConn, adOpenForwardOnly, adLockReadOnly, adCmdText

Предполагается, что у вас есть строка заголовка, и она находится в верхней части листа. (это часть того, почему мы заблокировали листы немного больше, чем мы могли захотеть - люди неправильно сортировали листы, а «заголовок» заканчивался посередине листа ...)

Нам также пришлось добавить еще немного кода для обработки ошибок, когда люди сохраняли листы обратно в формате HTML с расширением .xls, а не в качестве фактической книги Excel. Это одна из причин, по которой мы имеем два сценария - некоторые части еще не автоматизированы.

0 голосов
/ 16 января 2011

Я предполагаю, что вы не конвертируете вывод HTML в чистую книгу xls. Все, что вы делаете, - это создаете способ сохранить файл в формате xls, чтобы открыть его в Excel, не предоставляя доступ к действительному файлу, с которым он может работать. Попробуйте сохранить выходные данные в виде чистой книги Excel и посмотрите, как будет вести себя доступ после этого.

...