Сценарий: у нас есть веб-система, которая автоматически генерирует файлы Excel Office 2003 «на лету» (используя формат файла 2003 XML, а не двоичный формат). Эти файлы действительно хранятся на веб-сервере для различных целей.
Теперь мы находимся в ситуации, когда клиент действительно хотел бы, чтобы мы взяли файлы xls, сгенерированные этим процессом, и склеили их в один лист одного большого файла. (в основном для того, чтобы они могли нажать «печать» только один раз.)
Я предполагаю, что у .net framework должен быть какой-то способ сделать это (и тому подобное), но я не могу дразнить то, что мне нужно, из MSDN.
Для справки: .net 2.0, используя VB.net и ASP.net. При необходимости Excel можно установить на сервере, но то, что открывает Excel в фоновом режиме при каждом обращении к веб-пользователю, может не так хорошо масштабироваться. ;)
Собственно, в 2003 году был свой формат XML. Поверьте, я был удивлен, узнав это.
Это не ответ, но мне любопытно, почему вообще были созданы файлы Excel? Если это просто отчет, который пользователь просматривает в Интернете или распечатывает, почему бы не использовать HTML?
Ну ... краткий ответ заключается в том, что пользователи загружают их и фактически редактируют в Excel - иногда. И этот процесс был написан несколько лет назад, когда они думали, что им будет нужен только один файл / страница за раз. Теперь они ищут способ распечатать / загрузить сразу 20 страниц.





Итак, ваш пользователь хотел бы добавлять последний файл, сгенерированный каждый раз? или просто склеить "их вместе, когда они сделают запрос?"
Обновлено:
какие данные находятся в файле Excel? можно ли его временно преобразовать в более простой формат, например csv?
даже если вы не можете, вы можете создать новый файл и, перебирая каждую строку в каждом файле, вы можете записать его в новый файл. Проблема здесь в том, что если у вас есть какие-либо функции в ячейках, они будут потеряны, поскольку вы в основном копируете только данные.
Помимо этого, вам придется использовать Excel Interop. И хотя я знаю, что это больно, и на самом деле MS не поддерживает автоматизацию, нам удалось создать очень надежную систему автоматизации в виде веб-службы.
По сути, когда другой пользователь нажимает другую кнопку, процесс берет все файлы xls в каталоге и объединяет их в новый файл.
Я не знаю, из чего состоят файлы Excel, но можно ли хотя бы начать с более простого формата, который может читать Excel? IE, начните с файла CSV, соедините их вместе, а затем преобразуйте в формат Excel.
Мне кажется, что было бы проще конвертировать в формат Excel как можно позже в процессе.
Иногда лес не видно, когда видишь только деревья.
Совершенно уверен, что .Net framework не имеет того, что вы ищете, и вам придется создать его вручную. Вы можете сделать это через взаимодействие с Excel:
Microsoft.Office.Interop.Excel из MSDN
Редактировать: Просто чтобы вам было чего ждать, работать с этим может быть больно! :ИКС
1) Откройте каждый файл XML. 2) Возьмите XML-файл рабочего листа для каждого рабочего листа. 3) Вставьте весь XML-файл рабочего листа в новую «оболочку» XML-документа Excel 2003. 4) Верните документ из веб-запроса.
Убедитесь, что у рабочих листов уникальные имена.
Я бы избегал формата XML 2007 года, поскольку вы работаете с более легким в обращении форматом 2003 года.
Может, ADO подойдет? Вот пример сценария.
strXLToOpen = "C:\Docs\ltd.xls"
strXLToImport = "C:\Docs\ltd2.xls"
Set cn = CreateObject("ADODB.Connection")
''EDIT I not that MSDASQL is deprecated by Microsoft, so
''Please see below.
With cn
.Provider = "MSDASQL"
.ConnectionString = "Driver = {Microsoft Excel Driver (*.xls)};" & _
"DBQ = " & strXLToOpen & "; ReadOnly=False;"
.Open
End With
strSQL = "INSERT INTO [Sheet2$] (H1, H2) " _
& "SELECT H1, H2 FROM [Sheet2$] IN '' " _
& "'Excel 8.0;database = " & strXLToImport & "';"
cn.Execute strSQL
Дополнительная информация: http://support.microsoft.com/kb/257819/EN-US/
http://support.microsoft.com/kb/278973
Отредактируйте комментарий.
Подойдет ли это? Это от: http://www.codemaker.co.uk/it/tips/ado_conn.htm#ODBCDriverForExcel
cn.Open "Driver = {Microsoft Excel Driver (*.xls)};" & _
"DriverId=790;" & _
"DBQ = " & strXLToOpen & "; ReadOnly=False;" & _
"DefaultDir=c:\somepath"
Вы также можете использовать драйверы Jet с Excel.
ИЗМЕНИТЬ комментарий # 2
Я протестировал эту строку подключения с .Net, и, похоже, она работает:
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Docs\Test.xls;" & _
"Mode=ReadWrite;Extended Properties = ""Excel 8.0;HDR=No"""
Это довольно впечатляюще, но эти строки подключения не работают в .net 2.0 или с XML-файлом Excel 2003. Есть ли шанс на версию для ado.net?
Формат XML - 2007 (но вы можете открывать файлы XML в 2003 году после использования пакета совместимости 2007).