HSSFWorkbook - How to copy one worksheet to another? [closed]

3

I have an excel worksheet that I need to copy some data to another worksheet. This old spreadsheet is like a "base", I need to copy only the header and caption part (with the style of the cell, in addition to the text).

I'm using the HSSFWorkbook library, but I'm not sure how to proceed.

Vi no stackoverflow english the code, however I found the media confusing

abaOrigem = origem.getSheetAt(0);
abaDestino = destino.createSheet(abaOrigem.getSheetName());

for (int indiceLinha = 0; indiceLinha < 5; indiceLinha++) {
    copiarLinha(abaOrigem, abaDestino, destino, indiceLinha);
}

The error that appears:

Exception in thread "main" java.lang.NullPointerException
    at testeExcel.CopiaXLS.pegarValorCelula(CopiaXLS.java:102)
    at testeExcel.CopiaXLS.copiarLinha(CopiaXLS.java:63)
    at testeExcel.CopiaXLS.copiar(CopiaXLS.java:30)
    at testeExcel.app.main(app.java:14)
    
asked by anonymous 05.09.2017 / 20:21

1 answer

2

I've created a class to accomplish what you want based in this answer :

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import static org.apache.poi.ss.usermodel.CellType.BLANK;
import static org.apache.poi.ss.usermodel.CellType.NUMERIC;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

public class CopiaXLS {

  public static void copiar(String caminho) throws IOException, InvalidFormatException {
    String extensao;
    Workbook origem;
    Workbook destino;
    Sheet abaOrigem;
    Sheet abaDestino;
    File arquivoDestino;

    extensao = caminho.substring(caminho.lastIndexOf("."), caminho.length());
    origem = WorkbookFactory.create(new File(caminho));

    if (extensao.toUpperCase().equals(".XLS")) {
      destino = new HSSFWorkbook();
    } else {
      destino = new SXSSFWorkbook();
    }

    // Primeira aba
    abaOrigem = origem.getSheetAt(0);
    abaDestino = destino.createSheet(abaOrigem.getSheetName());

    copiarLinha(abaOrigem, abaDestino, destino, 0); // Copia o cabeçalho

    // Segunda aba
    abaOrigem = origem.getSheetAt(1);
    abaDestino = destino.createSheet(abaOrigem.getSheetName());

    for (int indiceLinha = abaOrigem.getFirstRowNum(); indiceLinha < abaOrigem.getLastRowNum(); indiceLinha++) {
      copiarLinha(abaOrigem, abaDestino, destino, indiceLinha); // Copia o cabeçalho
    }

    origem.close();
    arquivoDestino = new File(caminho.substring(0, caminho.lastIndexOf(".")) + " - Cópia" + extensao);
    destino.write(new FileOutputStream(arquivoDestino));
    destino.close();
  }

  private static void copiarLinha(Sheet abaOrigem, Sheet abaDestino, Workbook destino, int indiceLinha) {
    Row linhaOrigem;
    Row linhaDestino;

    linhaOrigem = abaOrigem.getRow(indiceLinha);
    linhaDestino = abaDestino.createRow(indiceLinha);

    for (int indiceCelula = linhaOrigem.getFirstCellNum(); indiceCelula < linhaOrigem.getLastCellNum(); indiceCelula++) {
      Cell celulaOrigem = linhaOrigem.getCell(indiceCelula);
      Cell celulaDestino = linhaDestino.createCell(indiceCelula);
      CellStyle estiloDestino = destino.createCellStyle();

      definirValorCelula(celulaDestino, pegarValorCelula(celulaOrigem));
      estiloDestino.cloneStyleFrom(celulaOrigem.getCellStyle());
      celulaDestino.setCellStyle(estiloDestino);
    }
  }

  private static void definirValorCelula(Cell celula, Object valor) {
    if (valor instanceof Boolean) {
      celula.setCellValue((boolean) valor);
    } else if (valor instanceof Byte) {
      celula.setCellValue((byte) valor);
    } else if (valor instanceof Double) {
      celula.setCellValue((double) valor);
    } else if (valor instanceof String) {
      if (((String) valor).startsWith("=")) { //  Formula String
        celula.setCellFormula(((String) valor).substring(1));
      } else {
        celula.setCellValue((String) valor);
      }
    } else {
      throw new IllegalArgumentException();
    }
  }

  private static Object pegarValorCelula(Cell celula) {
    switch (celula.getCellTypeEnum()) {
      case BOOLEAN:
        return celula.getBooleanCellValue(); // boolean
      case ERROR:
        return celula.getErrorCellValue(); // byte
      case NUMERIC:
        return celula.getNumericCellValue(); // double
      case STRING:
      case BLANK:
        return celula.getStringCellValue(); // String
      case FORMULA:
        return "=" + celula.getCellFormula(); // Fórmula
      default:
        throw new IllegalArgumentException();
    }
  }
}

To run you use the following method:

public static void main(String[] args) {
  try {
    CopiaXLS.copiar("C:/meu arquivo.xls");
  } catch (IOException ex) {
    Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
  } catch (InvalidFormatException ex) {
    Logger.getLogger(Teste.class.getName()).log(Level.SEVERE, null, ex);
  }
}
    
05.09.2017 / 22:05