Как читать / записывать данные в Excel 2007 на c ++?

StackOverflow https://stackoverflow.com/questions/1727361

  •  19-09-2019
  •  | 
  •  

Вопрос

Как читать / записывать данные в Excel 2007 на c ++?

Это было полезно?

Решение

Excel предоставляет COM-интерфейс, который вы можете использовать в своем приложении C++.

У меня есть опыт работы только с Excel 2003, но я думаю, что и с Excel 2007 он тоже подойдет.

Это можно сделать, например.с помощью #import или способом, описанным в этой статье:http://support.microsoft.com/kb/216686

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

Здесь есть решение Python (с использованием диспетчеризации COM): http://snippets.dzone.com/posts/show/2036

Это не C++, но COM-интерфейс должен быть одинаковым независимо от того, какой язык вы используете, верно?

Вам не нужно будет портировать все.Только __init__, set_range, get_value, set_value, save (или save_as), close, и quit.Вам также может потребоваться избавиться от мусора (поскольку в Python есть автоматический сборщик мусора).

Или вы можете просто портировать (и изменить) следующий код (который я не проверял, так как у меня больше нет Excel — вам, вероятно, следует проверить его, загрузив python и pythonwin):

from win32com.client import Dispatch
app = Dispatch("Excel.Application")
app.Visible = True # spooky - watch the app run on your desktop!
app.Workbooks.Open("C:\\book.xls")

range = app.ActiveWorkbook.Sheets(1).Range("a1") 
print 'The range was:'
print range.Value

range.Value = 42

print 'The value is now 42'  

app.ActiveWorkbook.Save()
app.ActiveWorkbook.SaveAs("C:\\excel2.xls")

app.ActiveWorkbook.Close()
app.Quit()

# any gc to do?

Файлы Excel 2007 представляют собой просто zip-файлы.Попробуйте переименовать .xlsx в .zip:вы можете извлекать файлы и папки.С помощью текстового редактора вы можете увидеть, что все они представляют собой файлы XML.

Итак, решение:

  1. используйте общий класс для распаковки вашего xlsx
  2. используйте синтаксический анализатор XML, чтобы получить данные
  3. если вы что-то изменили, перезаархивируйте все

COM-объект не требуется.В зависимости от вашего компилятора C++ вы можете легко найти необходимые исходные коды.

Есть три основные вещи, которые вам нужно сделать.

1) Убедитесь, что необходимые файлы установлены и доступны для поиска.

Я знаю, это совершенно очевидно, но убедитесь, что у вас установлена подходящая версия Excel, чтобы вы могли найти необходимые библиотеки Microsoft (и их расположение).а именно MSO.DLL, VBE6EXT.OLB и EXCEL.EXE

2) Настройте библиотеки Microsoft.

Допустим, вы начинаете с простого консольного приложения в своем коде на C ++. обязательно включите библиотеки импорта в любое приложение на C ++, которое взаимодействует с Excel.В моем примере я использую:

#import "C:\\Program Files (x86)\\Common Files\\microsoft shared\\OFFICE11\\MSO.DLL" \
rename( "RGB", "MSORGB" )

using namespace Office;  

#import "C:\\Program Files (x86)\\Common Files\\microsoft shared\\VBA\\VBA6\\VBE6EXT.OLB"  

using namespace VBIDE;  

#import "C:\\Program Files (x86)\\Microsoft Office\\OFFICE11\\EXCEL.EXE" \  
    rename( "DialogBox", "ExcelDialogBox" ) \  
    rename( "RGB", "ExcelRGB" ) \  
    rename( "CopyFile", "ExcelCopyFile" ) \  
    rename( "ReplaceText", "ExcelReplaceText" ) \  
    exclude( "IFont", "IPicture" ) no_dual_interfaces 

3) Используйте объектную модель Excel в вашем коде на C ++

Например, чтобы объявить указатель объекта приложения Excel для чтения / записи книги Excel:

Excel::_ApplicationPtr pXL;  
pXL->Workbooks->Open( L"C:\\dump\\book.xls" );

А также для доступа к листу Excel и ячейкам внутри него и управления ими:

Excel::_WorksheetPtr pWksheet = pXL->ActiveSheet;  
Excel::RangePtr pRange = pWksheet->Cells;  
double value = pRange->Item[1][1];  
pRange->Item[1][1] = 5.4321; 

И так далее.У меня есть более подробное обсуждение по этому поводу ниже публикация в блоге.

Низкотехнологичный способ, который я использовал в нескольких проектах, — это создать простой скрипт/макрос/что угодно, что запускает внешнюю программу.Напишите эту внешнюю программу на C++.Заставьте эту внешнюю программу читать входные данные и записывать выходные данные в файл .csv (простой текстовый файл со значениями, разделенными запятыми).Excel может легко читать и записывать файлы .csv, поэтому эта настройка дает вам все необходимое для создания жизнеспособного решения.

Все это можно сделать через интерфейс IDispatch.Это может быстро стать чертовски сложным (ура, Microsoft), но, по крайней мере, как только вы разберетесь с Excel, вы также обнаружите, что интеграция с любым другим приложением MS также проста :)

К счастью, здесь кто-то есть. кодгуру который сделал этот процесс приятным и легким.Прочитав этот код, я начал понимать, что делает Excel, и, более того, я обнаружил, что стало ОЧЕНЬ легко расширить его, чтобы он мог делать другие вещи, которые я хотел.Просто помните, что вы отправляете команды в Excel через интерфейс IDispatch.Это означает, что вам нужно подумать о том, как ВЫ будете что-то делать, чтобы понять, как это сделать программно.

Редактировать:пример гуру кода предназначен для Excel 2003, но его будет довольно легко расширить до 2007 :)

Начните здесь с OpenXml SDK.Загрузите SDK с здесь.SDK использует .NET, поэтому вам может потребоваться использовать C++.NET.

Прошло очень много времени, но я использовал Jet OLEDB для работы с файлами Excel.Возможно, вы начнете искать в этом направлении.

Раньше я использовал для этого сторонний компонент:OLE XlsФайл из СМ Программное обеспечение (не бесплатно, но недорого).Преимущество этого компонента перед компонентами Microsoft COM заключается в том, что вы можете использовать его для записи файлов XLS, даже если Excel не установлен.

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

Если вам нужна максимальная производительность, лучше всего написать двоичные файлы Excel, и писать их не так сложно, как читать.Формат двоичного файла относительно хорошо документирован проектом OpenOffice.org:

http://sc.openoffice.org/excelfileformat.pdf

и Microsoft также выпустила документацию:

http://download.microsoft.com/download/0/B/E/0BE8BDD7-E5E8-422A-ABFD-4342ED7AD886/Excel97-2007BinaryFileFormat(xls)Specification.xps

Это решение будет работать лучше всего, если вам нужно написать много файлов Excel, в основном с данными и небольшим форматированием, и если вы не хотите открывать файлы одновременно.Если вы напишете один файл Excel, чтобы впоследствии открыть его, вы, вероятно, сможете использовать предложенный COM-интерфейс C++, как объясняли другие авторы.

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

Вы можете использовать ODBC для легкого чтения и записи данных из файла Excel без Excel.Связь:Здесь

Ссылка на запись данных с помощью odbc: Здесь

Прежде чем писать в файлы XLS, я использовал набор классов C++, доступный в CodeProject.

Это действительно просто в использовании и бесплатно!Вы можете найти это здесь.

Настройка не заняла у меня времени.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top