Это будет во многом зависеть от того, как вы экспортируете файл, а также от того, как вы пытаетесь импортировать файл. В отсутствие опубликованного кода для экспорта я включу обе стороны, используемые в проекте, который у нас здесь работает.
Для контекста эти фрагменты относятся к файлам 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. Это одна из причин, по которой мы имеем два сценария - некоторые части еще не автоматизированы.