Ler e Gravar Dados de Excel com PHP

Usando suporte para XML

Aprenda como usar suporte a XML em PHP para ler os dados do XML exportado do Microsoft® Excel® 2003. Aprenda também a exportar dados de seu aplicativo PHP como XML do Excel para que seus usuários possam ver seus dados em uma planilha real.

Jack Herrington, Editor-in-Chief, Code Generation Network

Um engenheiro com mais de 20 anos de experiência, Jack Herrington é atualmente o editor chefe da Code Generation Network. Ele é o autor de Code Generation in Action. Ele pode ser contatado em jack_d_herrington@codegeneration.net.



04/Out/2005

O Microsoft Office 2003 para o sistema operacional Microsoft Windows® abriu um novo conjunto de oportunidades completo que engenheiros não-Microsoft ainda precisam perceber. É claro, havia o conjunto de novos recursos normais. Mas o grande novo avanço foi a inclusão de formatos de arquivo XML. Com o Office 2003, você pode salvar sua planilha do Microsoft Excel como XML e usar o arquivo como o faria com o equivalente binário. O mesmo ocorre com o Microsoft Word.

Por que os formatos de arquivos XML são tão importantes? Porque há anos, o verdadeiro poder do Excel e do Word estava bloqueado em formatos de arquivos binários que precisavam de conversores elaborados para acesso. Agora, é possível ler ou gravar arquivos Excel ou Word usando ferramentas XML, como Extensible Stylesheet Language Transformation (XSLT) ou as funções do XML Document Object Model (DOM) integradas à linguagem de programação PHP.

Neste artigo, mostro como construir um aplicativo da Web PHP que usa esses formatos para ler dados de um banco de dados a partir de uma planilha do Excel e exportar o conteúdo de uma tabela de banco de dados para uma planilha do Excel.

Criar o Banco de Dados

Para este artigo, eu uso um aplicativo da Web simples para que você possa ver claramente o mecanismo de XML do Excel. Esse aplicativo é uma tabela de nomes e endereços de e-mail.

O esquema na sintaxe MySQL parece o código na Lista 1.

Lista 1. SQL para o Banco de Dados
DROP TABLE IF EXISTS names;
CREATE TABLE names (
	id INT NOT NULL AUTO_INCREMENT,
	first TEXT,
	middle TEXT,
	last TEXT,
	email TEXT,
	PRIMARY KEY( id )
);

Esse arquivo é um banco de dados de tabela única no qual a tabela -- names -- tem cinco campos: um campo de ID de incrementação automática, seguido pelos campos nome, nome do meio e sobrenome e um campo de e-mail.

Para configurar o banco de dados, crie o banco de dados usando a ferramenta de linha de comando Mysqladmin: mysqladmin --user=root create names. Você, então, carrega o banco de dados do arquivo de esquema: mysql --user=root names < schema.sql. A autenticação do usuário e da senha usada varia conforme sua instalação, mas a ideia permanece a mesma. Primeiro, crie o banco de dados. Em seguida, use o arquivo SQL para criar as tabelas com os campos necessários.


Criar os dados de Importação

A próxima etapa é criar alguns dados para importar. Crie um novo arquivo Excel. No primeiro workbook, chame a linha superior das colunas First, Middle, Last e Email. Em seguida, inclua algumas linhas de dados na lista (consulte a Figura 1).

Figura 1. Dados para Importar
Dados para Importar

Você pode fazer a lista do comprimento que quiser ou alterar os campos como desejar. O script de importação PHP neste artigo ignora a primeira linha de dados de forma incondicional, pois supõe que seja a linha de cabeçalho. Em um aplicativo de produção, você provavelmente desejaria ler e analisar a linha de cabeçalho para determinar quais campos estão em quais colunas e fazer as mudanças apropriadas em sua lógica de importação.

A última etapa é salvar o arquivo como XML clicando em Arquivo > Salvar como e, em seguida, na janela Salvar como, selecionando Planilha XML na lista drop-down Salvar como Tipo (consulte a Figura 2).

Figura 2. Salvar o Arquivo como uma Planilha XML
Salvar o Arquivo como uma Planilha XML

Com o arquivo XML em mãos, é possível iniciar o desenvolvimento de seu aplicativo PHP.


Importar os Dados

O sistema de importação é iniciado de forma fácil o suficiente com uma página na qual você especifica o arquivo XML de entrada do Excel (consulte a Figura 3).

Figura 3. Especificar o Arquivo XML de Entrada do Excel
Especificar o Arquivo XML de Entrada do Excel

A lógica da página é simples, conforme mostrado na Lista 2:

Lista 2. O Código da Página de Upload
<html> <body> <form enctype="multipart/form-data"
  action="import.php" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="2000000" />
  <table width="600">
  <tr>
  <td>Names file:</td>
  <td><input type="file" name="file" /></td>
  <td><input type="submit" value="Upload" /></td>
  </tr>
  </table>
  </form>
  </body>
  </html>

Denominei o arquivo com uma extensão .php, mas não tem nada a ver com PHP. É apenas um arquivo HTML que permite que o usuário especifique um arquivo e envie esse arquivo para a página import.php, que é onde a verdadeira diversão ocorre.


Ler os Dados XML do Excel

Para ficar mais fácil de acompanhar, escrevi a página import.php em duas fases. Na primeira fase, eu simplesmente analiso os dados XML e emito a saída dos mesmos como uma tabela. Na segunda fase, incluo a lógica que insere os registros no banco de dados.

A Lista 3 mostra um exemplo do arquivo XML do Excel 2003.

Lista 3. Arquivo XML do Excel de Amostra
<?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-com:office:office"
 xmlns:x="urn:schemas-microsoft-com:office:excel"
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
 xmlns:html="http://www.w3.org/TR/REC-html40">
 <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  <Author>Jack Herrington</Author>
  <LastAuthor>Jack Herrington</LastAuthor>
  <Created>2005-08-02T04:06:26Z</Created>
  <LastSaved>2005-08-02T04:30:11Z</LastSaved>
  <Company>My Software Company, Inc.</Company>
  <Version>11.6360</Version>
  </DocumentProperties>
  <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>8535</WindowHeight>
  <WindowWidth>12345</WindowWidth>
  <WindowTopX>480</WindowTopX>
  <WindowTopY>90</WindowTopY>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
  </ExcelWorkbook>
  <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
  <Alignment ss:Vertical="Bottom"/>
  <Borders/>
  <Font/>
  <Interior/>
  <NumberFormat/>
  <Protection/>
  </Style>
  <Style ss:ID="s21" ss:Name="Hyperlink">
  <Font ss:Color="#0000FF" ss:Underline="Single"/>
  </Style>
  <Style ss:ID="s23">
  <Font x:Family="Swiss" ss:Bold="1"/>
  </Style>
  </Styles>
  <Worksheet ss:Name="Sheet1">
  <Table ss:ExpandedColumnCount="4"
  ss:ExpandedRowCount="5" x:FullColumns="1"
  x:FullRows="1">
  <Column ss:Index="4" ss:AutoFitWidth="0" ss:Width="154.5"/>
  <Row ss:StyleID="s23">
  <Cell><Data ss:Type="String">First</Data></Cell>
  <Cell><Data ss:Type="String">Middle</Data></Cell>
  <Cell><Data ss:Type="String">Last</Data></Cell>
  <Cell><Data ss:Type="String">Email</Data></Cell>
  </Row>
  <Row>
  <Cell><Data ss:Type="String">Molly</Data></Cell>
  <Cell ss:Index="3"><Data
  ss:Type="String">Katzen</Data></Cell>
  <Cell ss:StyleID="s21" ss:HRef="mailto:molly@katzen.com">
  <Data ss:Type="String">molly@katzen.com</Data></Cell>
  </Row>
  ...
  </Table>
  <WorksheetOptions
  xmlns="urn:schemas-microsoft-com:office:excel">
  <Print>
  <ValidPrinterInfo/>
  <HorizontalResolution>300</HorizontalResolution>
  <VerticalResolution>300</VerticalResolution>
  </Print>
  <Selected/>
  <Panes>
  <Pane>
  <Number>3</Number>
  <ActiveRow>5</ActiveRow>
  </Pane>
  </Panes>
  <ProtectObjects>False</ProtectObjects>
  <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
  </Worksheet>
  <Worksheet ss:Name="Sheet2">
  <WorksheetOptions
  xmlns="urn:schemas-microsoft-com:office:excel">
  <ProtectObjects>False</ProtectObjects>
  <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
  </Worksheet>
  <Worksheet ss:Name="Sheet3">
  <WorksheetOptions
  xmlns="urn:schemas-microsoft-com:office:excel">
  <ProtectObjects>False</ProtectObjects>
  <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
  </Worksheet>
  </Workbook>

Eliminei algumas linhas no meio, mas, do contrário, o arquivo é literalmente o que sai do Excel. É XML relativamente limpo. Observe que a parte do cabeçalho do documento no início que descreve o documento e quem o está escrevendo apresenta algumas informações visuais, lista estilos, etc. Então, os dados aparecem como um conjunto de planilhas no objeto Workbook principal.

O primeiro objeto Worksheet contém os dados reais. Nesse objeto, os dados residem dentro da tag Table em um conjunto de tags Row e Cell . Cada tag Cell tem uma tag Data associada a ela que contém os dados para a célula. Neste caso, os dados são sempre formatados como tipo String.

Por padrão, ao criar um novo documento, o Excel cria três planilhas denominadas Sheet1, Sheet2 e Sheet3. Não excluí a segunda e a terceira planilha, portanto, você vê esses workbooks vazios no final do documento.

A Lista 4 mostra a primeira versão do script import.php.

Lista 4. A Primeira Versão do Script de Importação
  <?php
  $data = array();

  function add_person( $first, $middle, $last, $email )
  {
  global $data;

  $data []= array(
  'first' => $first,
  'middle' => $middle,
  'last' => $last,
  'email' => $email
  );
  }

  if ( $_FILES['file']['tmp_name'] )
  {
  $dom = DOMDocument::load( $_FILES['file']['tmp_name'] );
  $rows = $dom->getElementsByTagName( 'Row' );
  $first_row = true;
  foreach ($rows as $row)
  {
  if ( !$first_row )
  {
  $first = "";
  $middle = "";
  $last = "";
  $email = "";

  $index = 1;
  $cells = $row->getElementsByTagName( 'Cell' );
  foreach( $cells as $cell )
  {
  $ind = $cell->getAttribute( 'Index' );
  if ( $ind != null ) $index = $ind;

  if ( $index == 1 ) $first = $cell->nodeValue;
  if ( $index == 2 ) $middle = $cell->nodeValue;
  if ( $index == 3 ) $last = $cell->nodeValue;
  if ( $index == 4 ) $email = $cell->nodeValue;

  $index += 1;
  }
  add_person( $first, $middle, $last, $email );
  }
  $first_row = false;
  }
  }
  ?>
  <html>
  <body>
  <table>
  <tr>
  <th>First</th>
  <th>Middle</th>
  <th>Last</th>
  <th>Email</th>
  </tr>
  <?php foreach( $data as $row ) { ?>
  <tr>
  <td><?php echo( $row['first'] ); ?></td>
  <td><?php echo( $row['middle'] ); ?></td>
  <td><?php echo( $row['last'] ); ?></td>
  <td><?php echo( $row['email'] ); ?></td>
  </tr>
  <?php } ?>
  </table>
  </body>
  </html>

O script começa lendo o arquivo temporário transferido por upload para um objeto DOMDocument . Em seguida, o script localiza cada tag Row . A primeira linha é ignorada usando a lógica associada à variável $first_row . Após a primeira linha, um loop interno analisa cada tag Cell na linha.

A próxima coisa complicada é descobrir em qual coluna se encontra. Como pode ver no XML, a tag Cell não especifica o número da linha nem da coluna. O script precisa manter controle disso ele mesmo. Na verdade, é, até mesmo, um pouco mais complicado do que isso. Na verdade, a tag Cell tem um atributo ss:Index que indica em que coluna a célula se encontra se houver colunas em branco nessa linha. É isso que o código getAttribute('index') está procurando.

Após determinar o índice, o código é simples. Coloque o valor da célula em um valor local associado a esse campo. Em seguida, no final da linha, chame a função add_person para incluir a pessoa no conjunto de dados.

No final da página, PHP emite a saída de dados que foram localizados em uma tabela HTML usando mecanismos PHP familiares (consulte a Figura 4).

Figura 4. Saída de Dados em uma Tabela HTML
Saída de Dados em uma Tabela HTML

A próxima etapa é carregar esses dados no banco de dados.


Incluir os Dados no banco de Dados

Após o script colocar os dados da linha em uma estrutura de dados PHP, é necessário incluir esses dados no banco de dados. Para fazer isso, incluí algum código que usa o módulo Pear DB (consulte a Lista 5).

Lista 5. A Segunda Versão do Script de Importação
<?php
require_once( "db.php" );

$data = array();

$db =& DB::connect("mysql://root@localhost/names", array());
if (PEAR::isError($db)) { die($db->getMessage()); }

function add_person( $first, $middle, $last, $email )
{
 global $data, $db;

 $sth = $db->prepare( "INSERT INTO names VALUES( 0, ?, ?, ?, ? )" );
 $db->execute( $sth, array( $first, $middle, $last, $email ) );

 $data []= array(
   'first' => $first,
   'middle' => $middle,
   'last' => $last,
   'email' => $email
 );
}

if ( $_FILES['file']['tmp_name'] )
{
 $dom = DOMDocument::load( $_FILES['file']['tmp_name'] );
 $rows = $dom->getElementsByTagName( 'Row' );
 $first_row = true;
 foreach ($rows as $row)
 {
   if ( !$first_row )
   {
     $first = "";
     $middle = "";
     $last = "";
     $email = "";

     $index = 1;
     $cells = $row->getElementsByTagName( 'Cell' );
     foreach( $cells as $cell )
     {
       $ind = $cell->getAttribute( 'Index' );
       if ( $ind != null ) $index = $ind;

       if ( $index == 1 ) $first = $cell->nodeValue;
       if ( $index == 2 ) $middle = $cell->nodeValue;
       if ( $index == 3 ) $last = $cell->nodeValue;
       if ( $index == 4 ) $email = $cell->nodeValue;

       $index += 1;
     }
     add_person( $first, $middle, $last, $email );
   }
   $first_row = false;
 }
}
?>
<html>
<body>
These records have been added to the database:
<table>
<tr>
<th>First</th>
<th>Middle</th>
<th>Last</th>
<th>Email</th>
</tr>
<?php foreach( $data as $row ) { ?>
<tr>
<td><?php echo( $row['first'] ); ?></td><
<td><?php echo( $row['middle'] ); ?></td><
<td><?php echo( $row['last'] ); ?></td><
<td><?php echo( $row['email'] ); ?></td><
</tr>
<?php } ?>
</table>
Click <a href="list.php">here</a> for the entire table.
</body>
</html>

A Figura 5 mostra a saída no Firefox.

Figura 5. O Banco de Dados
O Banco de Dados

Não tem a melhor aparência, mas esse não é o ponto. O ponto é que através do uso de instruções prepare e execute do objeto de banco de dados, é possível incluir dados no banco de dados. Para provar isso, criei outra página chamada list.php, que mostra os dados no banco de dados (consulte a Lista 6).

Lista 6. List.php
  <?php
  // Instale o módulo de BD usando 'pear install DB'
  require_once( "db.php" );
  $data = array();
  $db =& DB::connect("mysql://root@localhost/names", array());
  if (PEAR::isError($db)) { die($db->getMessage()); }
  $res = $db->query( "SELECT * FROM names ORDER BY last" );
  ?>
  <html>
  <body>
  <table>
  <tr>
  <th>ID</th>
  <th>First</th>
  <th>Middle</th>
  <th>Last</th>
  <th>Email</th>
  </tr>
  <?php while( $res->fetchInto( $row,
            DB_FETCHMODE_ASSOC ) ) { ?>
  <tr>
  <td><?php echo( $row['id'] ); ?></td>
  <td><?php echo( $row['first'] ); ?></td>
  <td><?php echo( $row['middle'] ); ?></td>
  <td><?php echo( $row['last'] ); ?></td>
  <td><?php echo( $row['email'] ); ?></td>
  </tr>
  <?php } ?>
  </table>
  Download as an
  <a href="listxl.php">Excel spreadsheet</a>.
 </body>
  </html>

Essa página simples inicia executando uma operação SQL select com relação à tabela de nomes. Em seguida, cria uma tabela e inclui cada linha da tabela na mesma usando o método fetchInto para obter os dados da linha.

A Figura 6 mostra a saída da página.

Figura 6. Saída de list.php
Saída de list.php

Novamente, não é uma vencedora de concurso de beleza, mas com essa página, expliquei o básico de como chegar aos dados do banco de dados. Isso, por sua vez, fornece a base para o script que irá gerar o arquivo XML do Excel para exportação.


Gerar o XML de Exportação do Excel

A etapa final é gerar o XML do Excel. Para mim, isso começou com a cópia de XML do Excel para um script PHP (consulte a Lista 7). Sei que isso é preguiçoso, mas é a maneira mais fácil de chegar a um arquivo XML do Excel que é analisado corretamente. (O Excel é exigente sobre seu XML.)

Lista 7. A Página de Exportação XML
  <?php
  header( "content-type: text/xml" );
  // Instale o módulo do BD usando 'pear install DB'
  require_once( "db.php" );
  $data = array();
  $db =& DB::connect("mysql://root@localhost/names", array());
  if (PEAR::isError($db)) { die($db->getMessage()); }
  $res = $db->query( "SELECT * FROM names ORDER BY last" );
  $rows = array();
  while( $res->fetchInto( $row, DB_FETCHMODE_ASSOC ) )
  { $rows []= $row; }
  print "<?xml version=\"1.0\"?>\n";
  print "<?mso-application progid=\"Excel.Sheet\"?>\n";
  ?>
  <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:o="urn:schemas-microsoft-com:office:office"
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:html="http://www.w3.org/TR/REC-html40">
  <DocumentProperties
     xmlns="urn:schemas-microsoft-com:office:office">
 <Author>Jack Herrington</Author>
  <LastAuthor>Jack Herrington</LastAuthor>
  <Created>2005-08-02T04:06:26Z</Created>
  <LastSaved>2005-08-02T04:30:11Z</LastSaved>
  <Company>My Company, Inc.</Company>
  <Version>11.6360</Version>
  </DocumentProperties>
  <ExcelWorkbook
     xmlns="urn:schemas-microsoft-com:office:excel">
  <WindowHeight>8535</WindowHeight>
  <WindowWidth>12345</WindowWidth>
  <WindowTopX>480</WindowTopX>
  <WindowTopY>90</WindowTopY>
  <ProtectStructure>False</ProtectStructure>
  <ProtectWindows>False</ProtectWindows>
  </ExcelWorkbook>
  <Styles>
  <Style ss:ID="Default" ss:Name="Normal">
  <Alignment ss:Vertical="Bottom"/>
  <Borders/>
  <Font/>
  <Interior/>
  <NumberFormat/>
  <Protection/>
  </Style>
  <Style ss:ID="s21" ss:Name="Hyperlink">
  <Font ss:Color="#0000FF" ss:Underline="Single"/>
  </Style>
  <Style ss:ID="s23">
  <Font x:Family="Swiss" ss:Bold="1"/>
  </Style>
  </Styles>
  <Worksheet ss:Name="Names">
  <Table ss:ExpandedColumnCount="4"
  ss:ExpandedRowCount="<?php echo( count( $rows ) + 1 ); ?>"
  x:FullColumns="1" x:FullRows="1">
  <Column ss:Index="4" ss:AutoFitWidth="0" ss:Width="154.5"/>
  <Row ss:StyleID="s23">
  <Cell><Data
    ss:Type="String">First</Data></Cell>
  <Cell><Data
   ss:Type="String">Middle</Data></Cell>
  <Cell><Data
    ss:Type="String">Last</Data></Cell>
  <Cell><Data
    ss:Type="String">Email</Data></Cell>
  </Row>
  <?php foreach( $rows as $row ) { ?>
  <Row>
  <Cell><Data
     ss:Type="String"><?php echo( $row['first'] ); ?>
  </Data></Cell>
  <Cell><Data
     ss:Type="String"><?php echo( $row['middle'] ); ?>
  </Data></Cell>
  <Cell><Data
    ss:Type="String"><?php echo( $row['last'] ); ?>
  </Data></Cell>
  <Cell ss:StyleID="s21"><Data ss:Type="String">
  <?php echo( $row['email'] ); ?></Data></Cell>
  </Row>
  <?php } ?>
  </Table>
  <WorksheetOptions
     xmlns="urn:schemas-microsoft-com:office:excel">
  <Print>
  <ValidPrinterInfo/>
  <HorizontalResolution>300</HorizontalResolution>
  <VerticalResolution>300</VerticalResolution>
  </Print>
  <Selected/>
  <Panes>
  <Pane>
  <Number>3</Number>
  <ActiveRow>1</ActiveRow>
  </Pane>
  </Panes>
  <ProtectObjects>False</ProtectObjects>
  <ProtectScenarios>False</ProtectScenarios>
  </WorksheetOptions>
  </Worksheet>
  </Workbook>

O script começa configurando o tipo de conteúdo da saída para XML. Isso é importante, pois, do contrário, os navegadores pensarão que esse código é simplesmente HTML inválido.

Alterei a parte de consulta SQL do código para salvar os resultados da consulta em uma array. Geralmente, eu não faria isso com esse tipo de página de relatório, mas, neste caso, preciso colocar o número de linhas, mais um, no atributo ss:ExpandedRowCount . O mais um é para considerar a linha do cabeçalho.

A Figura 7 mostra o resultado de clicar no link.

Figura 7. O XML de Exportação no Firefox
O XML de Exportação no Firefox

Não terrivelmente impressionante. Mas veja o que ocorre quando clico no mesmo link no Internet Explorer (consulte a Figura 8):

Figura 8. O XML Exportado no Internet Explorer
O XML Exportado no Internet Explorer

Que diferença. Essa é uma planilha integral -- formatando e tudo certo -- dentro do navegador. (É claro, no Firefox, você pode clicar com o botão direito do mouse no link, salvar o XML em um arquivo e ativá-lo dessa forma.)


Uma Técnica com Possibilidades

Como em relação a tudo de uma tecnologia nova menos testada, essa técnica possui algumas armadilhas. Por exemplo, ainda não funciona em Macintosh, pois a versão mais recente do Office para Mac não suporta arquivos XML.

Outro obstáculo é que a depuração desses arquivos pode ser um problema. Se o XML estiver até mesmo ligeiramente errado, o objeto integrado do Excel entra em um tipo de estado inválido no qual o Excel já acredita que já esteja em execução e se recusa a ativá-lo. Isso pode ser corrigido somente reiniciando-se o aplicativo.

Dito isso, essa técnica oferece possibilidades de integração sem paralelo para programadores de PHP. Com que frequência você descobre que a origem dos dados está em algo como o Excel ou Word e precisa ser migrado manualmente -- célula a célula ou parágrafo a parágrafo -- em um aplicativo da Web? Com tecnologia de importação deste tipo, o problema está solucionado. Você pode ler os dados diretamente das planilhas ou documento.

O mesmo pode ser dito do lado da exportação. HTML é excelente para artigos e documentos, mas nunca foi projetado para apresentar informações de planilha corretamente. Com as técnicas mostradas aqui, é possível gerar uma planilha -- fórmula, formatação e tudo o mais -- de maneira que os usuários esperam ver.

Recursos

Aprender

  • PHP.net é o local para aprender sobre as novidades mais recentes sobre PHP, localizar downloads e aprender com outros usuários.
  • Microsoft Office Online é o melhor local para começar para obter informações sobre o Office, incluindo suporte.
  • Uma origem autorizada para padrões XML é o World Wide Web Consortium (W3C).
  • XML in Office 2003: Information Sharing with Desktop XML (Prentice Hall, 2003) de Charles F. Goldfarb e Priscilla Walmsley, é um guia completo e amplo.
  • Este artigo de novembro de 2003 do developerWorks " Converte Dados do Excel em XML" mostra como desbloquear dados de arquivos Excel para processá-los em XML e examina os prós e os contras de diferentes soluções. É apropriado para o software cliente Excel 2002 e Excel XP.
  • Encontre mais recursos para desenvolvedores de XML, no developerWorks, na zona de XML.
  • Visite Zona de Software Livre do developerWorks para obter informações extensivas sobre como executar ações, sobre ferramentas e atualizações de projetos para ajudá-lo a se desenvolver com tecnologias de software livre e usá-las com produtos IBM.

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Software livre
ArticleID=382638
ArticleTitle=Ler e Gravar Dados de Excel com PHP
publish-date=10042005