Есть ли способ программно объединить файлы Excel? - PullRequest
2 голосов
/ 04 декабря 2008

Сценарий: у нас есть веб-система, которая автоматически генерирует файлы Office 2003 Excel «на лету» (используя формат файлов XML 2003, а не двоичный формат). Эти файлы хранятся на веб-сервере для различных целей.

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

Я предполагаю, что .net Framework должен иметь какой-то способ сделать это (и подобные вещи), но я не могу дразнить то, что мне нужно из MSDN.

Для записи: .net 2.0, используя VB.net и ASP.net. Excel может быть установлен на сервере, если это необходимо, но то, что открывает Excel в фоновом режиме при каждом обращении к веб-пользователю, может не так хорошо масштабироваться. ;)

Ответы [ 5 ]

3 голосов
/ 04 декабря 2008

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

Мне кажется, что было бы легче преобразовать в формат Excel как можно позже в процессе.

1 голос
/ 04 декабря 2008

Может быть, 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"""
1 голос
/ 04 декабря 2008

1) Откройте каждый файл XML.
2) Получите XML-файл рабочего листа для каждого рабочего листа.
3) Вставьте весь XML-файл в новый XML-документ Excel 2003. 4) Доставить документ обратно из веб-запроса.

Убедитесь, что рабочие листы имеют уникальные имена.

Я бы избегал формата XML 2007, так как вы работаете с более простым форматом 2003.

1 голос
/ 04 декабря 2008

Уверен, что .Net Framework не имеет того, что вы ищете, и вам придется создавать его вручную. Вы можете сделать это через взаимодействие Excel:

Microsoft.Office.Interop.Excel от MSDN

Редактировать: Просто у вас есть что-то, на что можно рассчитывать, работать с ним может быть больно! : X

1 голос
/ 04 декабря 2008

так что ваш пользователь хотел бы добавлять последний файл, сгенерированный каждый раз? или просто склеить их вместе, когда они сделают запрос?

РЕДАКТИРОВАТЬ:

какие данные находятся в файле Excel? это может быть временно преобразовано в более простой формат, такой как csv?

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

Кроме этого, вам придется использовать Excel Interop. И хотя я знаю, что это боль, и на самом деле MS не поддерживает автоматизацию, нам удалось создать очень надежную систему автоматизации в виде веб-службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...