generar un excel descargable con apache poi jsp servlet

Lo que estoy asiendo es generando un archivo de Excel en java apartir de una consulta en sql el archivo se genera al presionar un boton de generar informe que hice en jsp y la idea es que al momento de que se genera el Excel me aparezca la opción de descargar dicho archivo desde el jsp por medio del servlet, la verdad es que no tengo mucho conocimiento sobre esto si me pueden explicar como hacerlo muchas gracias, por el momento lo que estoy asiendo es generando el Excel en una carpeta en el dico E: pero lo que necesito es que aparesca la opcion de descargarlo desde el jsp adjunto la parte donde genero el Excel

try {

con = new Conexion();
query = "SELECT Nro_Documento,Nombres,Horas_registradas_en_jira,Proyecto,Horas_laboradas_sin_extras_y_sin_novedades FROM tbljira ORDER BY Proyecto";
st = con.getConn().prepareStatement(query);

res = st.executeQuery();

while (res.next()) {
TablaJira j = new TablaJira();
j.setNro_Documento(res.getString("Nro_Documento"));
j.setNombres(res.getString("Nombres"));
j.setHoras_registradas_en_jira(res.getDouble("Horas_registradas_en_jira"));
j.setProyecto(res.getString("proyecto"));
j.setHoras_laboradas_sin_extras_sin_novedades(res.getDouble("Horas_laboradas_sin_extras_y_sin_novedades"));
Jira.add(j);

}

for (int j = 0; j < Jira.size(); j++) {

String ide = Jira.get(j).getNro_Documento();
String name = Jira.get(j).getNombres();
Double h = Jira.get(j).getHoras_registradas_en_jira();
String proyec = Jira.get(j).getProyecto();
Double time = Jira.get(j).getHoras_laboradas_sin_extras_sin_novedades();

if (j == 0) {
idean = ide;
nombrean = name;
timea = h;
proan = proyec;
horat = time;

} else if (ide.equals(idean) & proyec.equals(proan)) {

suma = suma + h;
idean = ide;
proan = proyec;
nombrean = name;

horat = time;
} else {
det = new Detalle_Servicios();
if (suma == 0) {
total = timea / horat;
totalco = total * 100;
BigDecimal bd = new BigDecimal(totalco);
bd = bd.setScale(2, RoundingMode.HALF_UP);

det.setPorcentaje_dedicacion(bd.doubleValue());
det.setHoras_laboradas_mes(horat);
det.setNombre_empleado(nombrean);
det.setNro_Documento(idean);
det.setHoras_dedicadas_Servicio(timea);
det.setNombre_proyecto(proan);
lst.add(det);

nombrean = name;
horat = time;
idean = ide;
proan = proyec;
timea = 0.0;
suma = h;

} else {
total = suma / horat;
totalco = total * 100;
BigDecimal bd = new BigDecimal(totalco);
bd = bd.setScale(2, RoundingMode.HALF_UP);
det.setPorcentaje_dedicacion(bd.doubleValue());
det.setHoras_laboradas_mes(horat);
det.setNombre_empleado(nombrean);
det.setNro_Documento(idean);
det.setHoras_dedicadas_Servicio(suma);
det.setNombre_proyecto(proan);
lst.add(det);

nombrean = name;
horat = time;
idean = ide;
proan = proyec;

suma = h;

}
if (j + 1 == Jira.size()) {
if (ide.equals(idean) & proyec.equals(proan)) {
det = new Detalle_Servicios();
total = suma / horat;
totalco = total * 100;
BigDecimal bd = new BigDecimal(totalco);
bd = bd.setScale(2, RoundingMode.HALF_UP);
det.setNombre_proyecto(proan);
det.setPorcentaje_dedicacion(bd.doubleValue());
det.setHoras_laboradas_mes(horat);
det.setNombre_empleado(nombrean);
det.setNro_Documento(idean);
det.setHoras_dedicadas_Servicio(suma);

lst.add(det);
}
}
}
}
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet();
CellStyle style = wb.createCellStyle();
DataFormat forma = wb.createDataFormat();
Font font = wb.createFont();
font.setFontName("Arial");
style.setFillForegroundColor((short) 30);
style.setBottomBorderColor((short) 8);

style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setWrapText(true);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setColor(HSSFColor.WHITE.index);
style.setFont(font);

XSSFRow row = sheet.createRow(1);
XSSFCell cell;

row.createCell(1).setCellValue("Nombre Empleado");
row.getCell(1).setCellStyle(style);

row.createCell(2).setCellValue("Proyecto");
row.getCell(2).setCellStyle(style);

row.createCell(3).setCellValue("Horas Dedicadas al servicios");
row.getCell(3).setCellStyle(style);

row.createCell(4).setCellValue("Horas laboradas");
row.getCell(4).setCellStyle(style);

row.createCell(5).setCellValue("Porcentaje de dedicacion");
row.getCell(5).setCellStyle(style);

int i = 2;
for (int n = 0; n < lst.size(); n++) {
nom = lst.get(n).getNombre_empleado();

pro = lst.get(n).getNombre_proyecto();
sum = lst.get(n).getHoras_dedicadas_Servicio();
to = lst.get(n).getPorcentaje_dedicacion();
horat = lst.get(n).getHoras_laboradas_mes();
row = sheet.createRow(i++);
cell = row.createCell(1);
cell.setCellValue(nom);
cell = row.createCell(2);
cell.setCellValue(pro);
cell = row.createCell(3);
cell.setCellValue(sum);
cell = row.createCell(4);
cell.setCellValue(horat);
cell = row.createCell(5);
cell.setCellValue(to);

}

try {
String ex = "ensayo";

try (FileOutputStream archivo = new FileOutputStream("E:/copia/" + ex + ".xlsx")) {
wb.write(archivo);
archivo.close();
}

} catch (IOException e) {
System.out.println(e);

}
} catch (SQLException ex) {
System.out.println(ex);
Logger.getLogger(Detalle_ServiciosDao.class.getName()).log(Level.SEVERE, null, ex);
}

}
}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de SuperSerch

Activar la "opción de descarga" en los navegadores

Victor,

En la comunicación entre un navegador y el servidor de aplicaciones existe un protocolo (http), el cuál utiliza encabezados para indicar lo que el navegador deberá realizar con el contenido que está recibiendo.
Supongamos que ya generaste el archivo y este ya se encuentra en algún lado y que ya tienes un Servlet que es el que entregará el archivo:

 

Lo que se está haciendo es:

  • Indicarle al navegador que debe procesar el archivo como una hoja de cálculo en formato abierto (xlsx)
  • Indicarle al navegador que debe manejar el contenido como un attachment con nombre "nombre.xlsx"
  • Y mandarle un stream de datos para que los interprete como el contenido del archivo