Documente Academic
Documente Profesional
Documente Cultură
www.devmedia.com.br
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
1 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
Copie os JARS necessrios do struts e da JExcel API para a pasta libs. Isso inclui o arquivo jxl.jar da JExcel API e todos os JARs
includos na pasta lib da distribuio do struts. Copie os arquivos TLD do struts para a pasta web/tld.
Crie um arquivo chamado index.jsp dentro da pasta web, conforme mostra a listagem 1. Esse o nico arquivo que ficar fora da pasta
JSP. Coloque o seguinte contedo no mesmo:
<%@ taglib uri="/tags/struts-logic" prefix="logic" %>
<logic:redirect forward="welcome"/>
Listagem 01. Arquivo web/index.jsp
Tudo o que esse JSP faz redirecionar a pgina atual para o JSP definido como welcome na configurao do struts.
Como nossa aplicao bem simples, usaremos s mais um JSP. Crie um arquivo chamado Welcome.jsp na pasta web/jsp e ento
coloque nele o contedo da listagem 2.
<%@ taglib uri="/tags/struts-bean" prefix="bean"%>
<%@ taglib uri="/tags/struts-html" prefix="html"%>
<%@ taglib uri="/tags/struts-logic" prefix="logic"%>
<html:html>
<head>
<title>Exemplo JExcel API</title>
</head>
<html:base />
<body bgcolor="white">
<h3>Exemplo JExcel API</h3>
<p>Por favor, escolha o arquivo excel a ser analisdo</p>
<BR>
<html:form action="/FormatExcelAction.do" method="post"
enctype="multipart/form-data">
<html:file property="arquivo" title="Arquivo Excel" />
<html:submit title="Processar arquivo" />
</html:form>
</body>
</html:html>
Listagem 02. Arquivo web/jsp/Welcome.jsp
Esse JSP simplesmente usa algumas tag libs do Struts para renderizar um form HTML com um input do tipo arquivo e um boto submit.
Perceba que o form foi configurado para ser enviado via mtodo POST com a codificao de multipart. Isso far com que arquivo
selecionado seja enviado pelo prprio stream http (e no como parmetro da URL) e tambm far com que o arquivo binrio seja
transformado em texto para que possa ser enviado viu http, numa codificao MIME especfica para esse fim. O importante disso tudo
que quando o arquivo for recebido no lado do servidor, ser preciso codific-lo de volta para binrio.
2 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
Antes de complicarmos mais, vejamos como ficam o web.xml e o struts-config.xml, nas listagens 3 e 4, respectivamente.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<display-name>JExcel Api Struts Example</display-name>
<!-- Standard Action Servlet Configuration (with debugging) -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
3 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
4 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
5 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
}
Listagem 05. Arquivo src/FormatExcelForm.java
O serial version UID existe somente pelo fato do arquivo implementar a interface Serializable. Perceba que usamos a classe FormFile do
Struts. Essa classe faz parte do suporte que o Struts tem para upload de arquivos. Como temos uma propriedade desse tipo em nosso
form com o mesmo nome do campo tipo file do formulrio html (o nome da propriedade arquivo), o Struts automaticamente ir
decodificar o arquivo de volta para binrio, colocar nessa propriedade atravs do mtodo setter e fornecer o form como parmetro para
nossa action.
Vejamos como ficou a action na listagem 6:
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import
import
import
import
import
import
import
jxl.Cell;
jxl.CellType;
jxl.Workbook;
jxl.format.Colour;
jxl.write.WritableCell;
jxl.write.WritableCellFormat;
jxl.write.WritableWorkbook;
import
import
import
import
import
org.apache.struts.action.Action;
org.apache.struts.action.ActionForm;
org.apache.struts.action.ActionForward;
org.apache.struts.action.ActionMapping;
org.apache.struts.upload.FormFile;
6 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
7 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
forma, usamos o InputStream para recuperar os dados transmitidos pela pgina e o OutputStream para transmitir os dados de volta.
Com a JExcel API, esse trabalho facilitado. O comando
WritableWorkbook w = Workbook.createWorkbook(
response.getOutputStream(), Workbook.getWorkbook(in));
cria um novo objeto WorkBook modificvel, que corresponde a uma planilha, no OutputStream, usando o arquivo transmitido como
base. Ento ns modificamos o Workbook e executamos os comandos
w.write();
w.close();
para escrever de fato o arquivo para a resposta http.
Perceba que setamos alguma propriedade importantes no objeto response:
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment; filename=sampleName.xls");
O primeiro comando dir ao browser que um arquivo Excel est sendo transmitido. A segunda linha indica que no estamos
redirecionando para uma outra pgina, mas sim para um download, de forma que o browser mostrar uma tela ao usurio perguntando
se ele deseja abrir ou salvar o arquivo sendo transmitido. Se escolher salvar, o arquivo ter o nome default de sampleName.xls.
Mas afinal, o que fizemos no arquivo Excel? Fizemos um loop (alis, trs loops) pelo arquivo, percorrendo cada uma de suas
worksheets. Para cada worksheet, usamos os comandos w.getSheet(i).getColumns() e w.getSheet(i).getRows() para percorrer por todas
as clulas de cada sheet. O tamanho de cada sheet retornado dependendo do contedo existente em suas clulas.
Para cada clula, verificamos o tipo do contedo. Se for um nmero, pintamos a cor de vermelho e, se for texto esttico (LABEL),
pintamos de azul.
Foi muito importante criarmos um objeto do tipo WriteableCell para modificarmos o formato. A JExcel API faz distino entre Cell e
WriteableCell, de forma que o ltimo herda do primeiro. S conseguimos modificar o arquivo porque criamos um objeto
WritableWorkbook a partir do arquivo de entrada no OutputStream do response. No possvel criar um objeto desses apenas a partir de
um InputStream, somente um Workbook simples, no modificvel.
Por ltimo, mas no menos importante, falta o arquivo de build, para construirmos nossa aplicao. Vejamos como ficou o nosso nas
listagens 7 e 8:
tomcat_home=G:/dev_env/Tomcat5/
tomcatlib=${tomcat_home}/common/lib
tomcatapps=${tomcat_home}/webapps
lib=lib
debug_on=true
8 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
9 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
10 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
11 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
12 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
13 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
14 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
15 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
16 de 17
17/8/2013 20:13
Verso para impresso: Usando JExcel API numa aplicao WEB Struts
http://www.devmedia.com.br/articles/viewcomp_forprint.asp?comp=5547
www.devmedia.com.br/articles/viewcomp.asp?comp=5547
17 de 17
17/8/2013 20:13