Pergunta

Como ler / gravar dados para o Excel 2007, em c ++?

Foi útil?

Solução

Excel fornece COM interface de que você pode usar do seu C ++ aplicação.

Eu tenho experiência com Excel só 2003, mas eu acho que para o Excel 2007 que também irá trabalho.

Isto pode ser feito, por exemplo, com #import ou na forma descrita neste artigo: http://support.microsoft.com/kb/216686

Outras dicas

Há uma solução python (usando expedição COM) aqui: http: //snippets.dzone .com / posts / show / 2036

Não é C ++, mas a interface COM deve ser o mesmo, não importa qual a linguagem que você usa, certo?

Você não precisa de porta tudo. __init__ apenas, set_range, get_value, set_value, save (ou save_as), close e quit. Você também pode precisar de dispor de lixo (como python tem gc automática).

Ou você poderia apenas porta (e modificar) o seguinte código (que eu não testei, como eu não tenho excel mais - você provavelmente deve verificá-lo por download de python e 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?

arquivos Excel 2007 são simplesmente arquivos zip. Tente renomear .xlsx para .zip: você pode extrair arquivos e pastas. Com um editor de texto que possa ver que eles são todos os arquivos XML.

Portanto, a solução:

  1. usar uma classe comum para descompactar o seu xlsx
  2. usar um parser XML para agarrá-lo dados
  3. se você tiver modificado somethig, re-zip todos

No COM objeto necessário. Dependendo do seu compilador C ++ você pode easyly encontrar as fontes necessárias.

Há três coisas principais que você precisa fazer.

1) Certifique-se de arquivos pré-requisito estão instalados e localizável.

óbvias eu sei, mas verifique se você tem uma versão adequada de Excel instalado, de modo que você pode localizar as bibliotecas Microsoft necessários (e suas localizações). ou seja MSO.DLL, VBE6EXT.OLB e EXCEL.EXE

2) Estabelecer as bibliotecas Microsoft.

Em seu código C ++, digamos que você começa com um aplicativo de console simples, certifique-se de incluir as bibliotecas de importação em qualquer aplicativo C ++ que interfaces com Excel. No meu exemplo eu uso:

#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) Use o objeto Excel Modelo em seu código C ++

Por exemplo, para declarar um ponteiro objeto aplicativo Excel para ler / escrever um livro do Excel:

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

E para acessar e manipular a planilha do Excel e as células dentro dele:

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

E assim por diante. Eu tenho uma discussão mais aprofundada neste seguinte postagem de blog .

Uma maneira de baixa tecnologia que tenho usado em um par de projetos é fazer um script simples / / macro seja lá o que é executado um programa externo. Escrever esse programa externo em C ++. Obter esse programa externo para ler sua entrada e escrever sua saída para um arquivo .csv (simples separados por vírgula arquivo de texto valor). Excel pode facilmente ler e escrever arquivos .csv, então esta configuração dá-lhe tudo o que precisa para criar uma solução viável.

Isso tudo pode ser feito através da interface IDispatch. Ele pode ficar realmente sangrenta complicado rapidamente (Elogios Microsoft), mas pelo menos uma vez você tem a sua cabeça redonda Excel você encontrará integrar com qualquer outro aplicativo MS fácil também:)

Felizmente há alguém na CodeGuru que fez o bom processo e fácil. Uma vez que eu tinha lido através desse código eu comecei a colocar minha cabeça redonda que excel estava fazendo e, além disso, eu achei tornou-se realmente fácil de estendê-lo para fazer outras coisas que eu queria. Basta lembrar que você está enviando comandos para o Excel através da interface IDispatch. Isto significa que você precisa pensar sobre como você faria algo para descobrir como fazê-lo através de programação.

Editar: o exemplo guru código é para o Excel 2003, mas deve ser bastante fácil de estendê-lo para 2007:)

Iniciar aqui com a OpenXml Sdk . Faça o download do SDK de aqui . O SDK usa .NET, assim você pode precisar usar C ++. NET

Tem sido um tempo muito longo, mas eu tenho usado o Jet OLEDB para chegar a arquivos do Excel. Você pode começar a procurar nesse sentido.

Eu tenho usado um componente 3ª Parte para isso no passado: OLE XlsFile de SM Software (não é livre, mas barato). A vantagem desse componente sobre os componentes Microsoft COM é que você pode usá-lo para gravar arquivos XLS, mesmo se o Excel não está instalado.

Ele também permite que você crie speadsheets ou pastas de trabalho com fórmulas embutidas e formatação, algo não possível se você usar arquivos CSV como um formato de intercâmbio.

Se você precisa o melhor desempenho, escrever arquivos do Excel binários é o caminho a percorrer e escrevê-los não é tão difícil como lê-los. O formato de arquivo binário é relativamente bem documentada pelo projeto OpenOffice.org:

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

e Microsoft também lançou a documentação:

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

Esta solução irá funcionar melhor se você tem que escrever muitos arquivos do Excel, principalmente com dados e pouco a formatação, e se você não quer abrir os arquivos ao mesmo tempo. Se você escreve um único ficheiro Excel para abri-lo depois, você provavelmente pode usar o propsed C ++ COM interface como os outros cartazes explicou.

Usando a interface COM exigirá chamadas caras fora de processo a menos que você escrever um suplemento COM Excel. Se você escrever um suplemento que as importações seus dados na folha de Excel atual, enchendo a folha ainda será muito mais lento do que despejar um arquivo, mas para um único arquivo de cada vez isto pode ser aceitável dependendo do cenário usuário. Se você decidir usar a interface COM, minimizar o número de chamadas para Excel. Utilizar os métodos que permitem inserir uma matriz de valores, se eles existirem, propriedades do tipo conjunto de linha e coluna é possível e não por célula.

Você pode usar ODBC para ler e gravar dados de um arquivo excel facilmente sem Excel. O link: Aqui

O link para saber como gravar dados utilizando ODBC: Aqui

Eu usei um conjunto de classes C ++ que está disponível a partir de CodeProject antes de escrever para arquivos XLS.

É realmente fácil de usar, e grátis! Você pode encontrá-lo aqui .

Levei tempo para configurar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top