Есть ли способ программно объединить файлы Excel?

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

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

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

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

Формат XML - 2007 (но вы можете открывать файлы XML в 2003 году после использования пакета совместимости 2007).

TravisO 04.12.2008 02:29

Собственно, в 2003 году был свой формат XML. Поверьте, я был удивлен, узнав это.

Electrons_Ahoy 04.12.2008 02:31

Это не ответ, но мне любопытно, почему вообще были созданы файлы Excel? Если это просто отчет, который пользователь просматривает в Интернете или распечатывает, почему бы не использовать HTML?

KeyserSoze 04.12.2008 02:42

Ну ... краткий ответ заключается в том, что пользователи загружают их и фактически редактируют в Excel - иногда. И этот процесс был написан несколько лет назад, когда они думали, что им будет нужен только один файл / страница за раз. Теперь они ищут способ распечатать / загрузить сразу 20 страниц.

Electrons_Ahoy 04.12.2008 02:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
1 701
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Обновлено:

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

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

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

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

Electrons_Ahoy 04.12.2008 02:36

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

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

Иногда лес не видно, когда видишь только деревья.

Brad Gilbert 04.12.2008 07:42

Совершенно уверен, что .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?

Electrons_Ahoy 04.12.2008 04:03

Другие вопросы по теме