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

RoxRicardo

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?

RoxRicardo

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.

RoxRicardo

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.

RoxRicardo

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.

Roselito_Favero_da_S

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.

RoxRicardo

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.

RoxRicardo

@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