문제

C ++에서 Excel 2007에 데이터를 읽고 쓰는 방법?

도움이 되었습니까?

해결책

Excel은 C ++ 응용 프로그램에서 사용할 수있는 COM 인터페이스를 제공합니다.

나는 Excel 2003에만 경험이 있지만 Excel 2007에도 효과가 있다고 생각합니다.

이것은 예를 들어 #import 또는이 기사에 설명 된 방식으로 수행 할 수 있습니다.http://support.microsoft.com/kb/216686

다른 팁

여기에는 파이썬 솔루션 (COM 디스패치 사용)이 있습니다. http://snippets.dzone.com/posts/show/2036

C ++는 아니지만 COM 인터페이스는 어떤 언어를 사용하든 동일해야합니까?

모든 것을 포트 할 필요는 없습니다. 단지 __init__, set_range, get_value, set_value, save (또는 save_as), close, 그리고 quit. 파이썬에 자동 GC가있는 것처럼 쓰레기를 폐기해야 할 수도 있습니다.

또는 더 이상 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. somethig를 수정 한 경우 모든 것을 다시 연결하십시오

com 객체가 필요하지 않습니다. C ++ 컴파일러에 따라 필요한 소스를 쉽게 찾을 수 있습니다.

당신이해야 할 세 가지 주요 일이 있습니다.

1) 사전 반품 파일이 설치되고 찾을 수 있는지 확인하십시오.

맹목적으로 분명하지만 필요한 Microsoft 라이브러리 (및 해당 위치)를 찾을 수 있도록 적절한 Excel 버전을 설치해야합니다. 즉, mso.dll, vbe6ext.olb 및 Excel.exe

2) Microsoft 라이브러리를 설정하십시오.

C ++ 코드에서 간단한 콘솔 애플리케이션으로 시작하여 Excel과 인터페이스하는 C ++ 응용 프로그램에 가져 오기 라이브러리를 포함시켜야한다고 가정 해 봅시다. 내 예에서는 다음을 사용합니다.

#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) C ++ 코드에서 Excel 객체 모델 사용

예를 들어, Excel 통합 문서를 읽고 / 쓰기위한 Excel Application Object Pointer를 선언하려면 :

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), 적어도 헤드 라운드 엑셀을 얻으면 다른 MS 애플리케이션과 쉽게 통합되어 있습니다 :)

다행히도 누군가가 있습니다 코드 구루 누가 그 과정을 멋지고 쉽게 만들었습니다. 그 코드를 읽은 후에 나는 Excel이하고있는 일을 머리를 돌리기 시작했고, 또한, 내가 원하는 다른 일을하기 위해 확장하기가 정말 쉬워 졌다는 것을 알았습니다. Idispatch 인터페이스를 통해 탁월한 명령을 보내고 있음을 기억하십시오. 이것은 당신이 프로그래밍 방식으로 수행하는 방법을 알아 내기 위해 무언가를하는 방법에 대해 생각해야한다는 것을 의미합니다.

편집 : 코드 전문가 예제는 Excel 2003 용이지만 2007 년으로 확장하는 것은 매우 쉽습니다 :)

여기에서 시작하십시오 OpenXml SDK. SDK를 다운로드하십시오 여기. SDK는 .NET을 사용하므로 C ++를 사용해야 할 수도 있습니다.

아주 오랜 시간이 지났지 만 Jet OLEDB를 사용하여 Excel 파일을 얻었습니다. 그 방향으로 검색을 시작할 수 있습니다.

나는 과거에 이것에 대해 제 3 자 구성 요소를 사용했습니다 : Ole xlsfile. SM 소프트웨어 (무료는 아니지만 저렴합니다). Microsoft COM 구성 요소에 비해이 구성 요소의 장점은 Excel이 설치되지 않더라도 XLS 파일을 작성하는 데 사용할 수 있다는 것입니다.

또한 CSV 파일을 인터체인지 형식으로 사용하는 경우에는 내장 된 공식 및 서식이 포함 된 Speadsheets 또는 통합 문서를 만들 수 있습니다.

최상의 성능이 필요한 경우 Binary Excel 파일을 작성하는 것이 좋습니다.이를 작성하는 것이 어렵지 않습니다. 바이너리 파일 형식은 OpenOffice.org 프로젝트에서 비교적 잘 문서화됩니다.

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

그리고 Microsoft는 또한 문서를 발표했습니다.

http://download.microsoft.com/download/0/e/0be8bdd7-e5e8-422a-abfd-4342ed7ad886/excel97-2007binaryfileformat(xls)specification.xps

이 솔루션은 주로 데이터와 작은 형식으로 많은 Excel 파일을 작성해야하며 파일을 동시에 열고 싶지 않은 경우 가장 잘 작동합니다. 나중에 열기 위해 단일 Excel 파일을 작성하면 다른 포스터가 설명한대로 제안 된 C ++ COM 인터페이스를 사용할 수 있습니다.

COM 인터페이스를 사용하면 Excel Com Addin을 작성하지 않으면 비싼 프로세스 외 호출이 필요합니다. 데이터를 현재 Excel 시트로 가져 오는 Addin을 작성하는 경우 시트를 채우는 것이 파일을 덤프하는 것보다 여전히 훨씬 느리게 진행되지만 한 번에 단일 파일의 경우 사용자 시나리오에 따라 허용 할 수 있습니다. COM 인터페이스를 사용하기로 결정한 경우 Excel의 통화 수를 최소화하십시오. 값이 존재하는 경우 값 배열을 삽입 할 수있는 메소드를 사용하고 셀당 행으로 스타일 속성을 설정하십시오.

ODBC를 사용하여 Excel없이 Excel 파일에서 데이터를 읽고 쓸 수 있습니다. 링크:여기

ODBC를 사용하여 데이터를 작성하는 방법에 대한 링크 : 여기

XLS 파일에 작성하기 전에 CodeProject에서 사용할 수있는 C ++ 클래스 세트를 사용했습니다.

사용하기 쉽고 무료입니다! 당신은 그것을 찾을 수 있습니다 여기.

설정할 시간이 없었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top