I created a class to accomplish what you want based on 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);
}
}
It is not easier for you to copy the file as a whole?
– Sorack
no.. pq this file means a "base file", it has data that will not be used in the new spreadsheet but other data will be copied.
– Mari Teixeira
So it improves a little your question by putting the format that the file is and some additional information, such as the code you tried so far...
– Sorack
I rewrote the question! thanks for the tip ;D
– Mari Teixeira
You want to completely copy a tab?
– Sorack
in the worksheet there are 2 tabs, the first tab want only the header (the first lines). In the second tab I want it complete
– Mari Teixeira