Método de Substituição (Replace)

12 respostas
J

Pessoal,

tenho o seguinte código:

for (int coluna = 0; coluna <= 2; coluna++) {  
	                Iterator<Row> rows = sheet.rowIterator();  
	  
	                while (rows.hasNext()) {  
	                    HSSFRow Hrow = (HSSFRow) rows.next();  
	  
	                    System.out.print((Hrow).getRowNum() + " - " + Hrow.getCell((short) coluna)); 
	                    System.out.println(""); 
	                    int a = 0;
	                    	                    
	                    int row = Hrow.getRowNum();
	                    HSSFCell colu = Hrow.getCell(0);
	    	            System.out.print(row + " " + colu);
	    	            
	    	            
	    	            Range r = hwpf.getRange();
	    		    r.replaceText("<<CAMPO_A>>", colu);

Pronto, eu preciso pegar a variável que está na primeira linha e primeira coluna no excel e substituir no word quando achar a tag especial <>, mas não estou conseguindo fazer essa substituição usando o método replace.

Alguém pode me ajudar?

Obrigado.

12 Respostas

R

Se você pegar o valor da célula, substituir e atribuir de novo para a célula. Não funciona?

J

Para pegar o valor da célula, terei de armazenar em uma variável e quando fosse substituir aí não funcionaria. Se é isso que você quis dizer, caso não, não entendi sua pergunta, pode postar um exemplo?

R

if(celula.getRichStringCellValue().getString().contains("<<CAMPO_A>>")){ String valorCelula = celula.getRichStringCellValue().getString(); valorCelula = valorCelula.replace("<<CAMPO_A>>", "valorASerSubstituido"); celula.setCellValue(new HSSFRichTextString(valorCelula)); }
onde celula é o seu elemento HSSFCell.

J

Esse código não faz a busca de <<CAMPO_A>> no word, tentei fazer algumas alterações aqui, para primeiro tentar buscar no word e depois fazer isso aí, mas também não deu certo.

R

Esqueça o word, você está trabalhando com um objeto que contem o valor da sua linha, basta pegar a String com este valor, substituir e atribuir de volta.

J

Quando faço isso aí o código executa sem erros, no entanto não faz alterações no word.

R

Imagino que você esteja lendo este word, ao fazer uma alteração ai você tem que gerar um novo word ou salvá-lo.
Você já fez isso?

J

Demorei a responder pois surgiu outros problemas emergenciais para resolver. Mas tá aí todo meu código, as linhas comentadas são testes que estava fazendo e eu estou gerando outro word.

package JavaPoi;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hwpf.usermodel.Range;

import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import java.io.FileNotFoundException;
import java.io.IOException;


public class JavaPoi {

	
	public static void main(String[] args) {
		POIFSFileSystem fs; 
		
		try {
			File readWord = new File("C:\\Ação .doc");
			FileInputStream fis = new FileInputStream(readWord);
			BufferedInputStream bis = new BufferedInputStream(fis);
			File writeWord = new File("C:\\NovoDocumento.doc");
			HWPFDocument hwpf = new HWPFDocument(bis);
			
			
			  
	            
	            fs = new POIFSFileSystem(new FileInputStream("C:\\Users\\Matheus\\Documents\\Teste Arquivos\\Lista.xls"));  
	            HSSFWorkbook wb = new HSSFWorkbook(fs);  
	            HSSFSheet sheet = wb.getSheetAt(0);  
	  
	            for (int coluna = 0; coluna <= 2; coluna++) {  
	                Iterator<Row> rows = sheet.rowIterator();  
	  
	                while (rows.hasNext()) {  
	                    HSSFRow Hrow = (HSSFRow) rows.next();  
	  
	                    System.out.print((Hrow).getRowNum() + " - " + Hrow.getCell((short) coluna)); 
	                    System.out.println(""); 
	                    	                    	                    
	                    int row = Hrow.getRowNum();
	                    HSSFCell colu = Hrow.getCell(0);
	    	            System.out.print(row + " " + colu);
	    	            
	    	            /*HSSFComment a1 = sheet.getCellComment(0,0);
	    	            String stringa1 = ((Object) a1).getContents();*/
	    	            
	    	               
	    	            if(colu.getRichStringCellValue().getString().contains("<<CAMPO_A>>")){  
	    	                String valorCelula = colu.getRichStringCellValue().getString();  
	    	                valorCelula = valorCelula.replace("<<CAMPO_A>>", "valorASerSubstituido");  
	    	                colu.setCellValue(new HSSFRichTextString(valorCelula));
	    	               }
	    	            
	    	              // Range r = hwpf.getRange();
	    				   //r.replaceText("<<CAMPO_A>>", "Teste");
	    				
	                }  
	            }  
	         
	           
	            
			
			
	        WordExtractor we = new WordExtractor(hwpf);
	   		System.out.println(we.getText());
			if(writeWord.exists())
				writeWord.delete();
			FileOutputStream fos = new FileOutputStream(writeWord);
			BufferedOutputStream bos = new BufferedOutputStream(fos);
			hwpf.write(bos);
			bos.flush();
			bos.close();
		}catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        } catch (Exception e) {
			e.printStackTrace();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}
}
J

Aí coloquei o que vc falou, mas ainda não deu certo.

R

Acho que seu problema é com os caracteres especiais (< e >). Tive um problema assim com o ponto e tive que escrever no replace assim: “\.”
Na verdade eu estava usando replaceAll, não me lembro se o replace tem o mesmo comportamento.

R

Roselito Fávero da Silva:
Acho que seu problema é com os caracteres especiais (< e >). Tive um problema assim com o ponto e tive que escrever no replace assim: “\.”
Na verdade eu estava usando replaceAll, não me lembro se o replace tem o mesmo comportamento.

No replace é comparado a cadeia de caracteres, no replaceAll é um regex, então você tem que adicionar scapes para alguns caracteres.

R

@jmva, não consegui perceber onde os valores do seu excel são transferidos para o seu word.

Criado 20 de setembro de 2013
Ultima resposta 23 de set. de 2013
Respostas 12
Participantes 3