Возврат нескольких файлов Excel за один вызов с помощью Apache POI

Я пытаюсь загрузить несколько файлов Excel одним вызовом. У меня есть хранимая процедура, которая возвращает данные с разбивкой по компаниям, и для каждой компании мне нужен отдельный файл Excel. Некоторые значения файлов Excel взаимозависимы (поэтому то, что находится в первом файле Excel, перейдет ко второму.

За исключением нескольких функций, которые, как я проверял, работают правильно, я включил весь код ниже. В настоящее время код работает точно так же, как и должен. Если бы я не проверял выходные данные, я бы подумал, что он идеален, однако там, где я ожидаю увидеть два загруженных файла, я получаю только первый. Второй вызов для записи в ServletOutputStream срабатывает, но файл не загружается.

Кто-нибудь может увидеть, что здесь не так? Это не размер файла, в каждом файле должно быть не более пяти записей, и я скачал один файл Excel раньше без проблем.

package export;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import main.getFund;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

/**
 *
 * @author mmarino
 */
public class NavExport extends HttpServlet {
    String dateStr = "";
    String ERDate = "";
    Double absoluteTotal = 0.0;
    Double iTotal = 0.0;
    getFund g = new getFund();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String str = "";

        Workbook wb = new HSSFWorkbook();
        Workbook pWB = new HSSFWorkbook();
        //Workbook wb = new XSSFWorkbook();
        CreationHelper createHelper = wb.getCreationHelper();
        Sheet oSheet = wb.createSheet("Recon");
        Sheet pSheet = pWB.createSheet("Recon");
        String prevCompany = "";
        dateStr = new Date().toString();
        dateStr = new SimpleDateFormat("MM/dd/yyy").format(new Date());
        ERDate = "ER" + dateStr.substring(6, 10) + dateStr.substring(0,2) + dateStr.substring(3,5);
        try{

            Connection conn = null;
            ResultSet rs = null;
            PreparedStatement prst = null;
            String s = request.getParameter("ids");

            String roll = request.getParameter("roll");
            String[] ids = s.split("\\|");

            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

            String connUrl = "My Connection URL";
            conn = DriverManager.getConnection(connUrl);           
            String sql = "My SQL Query";                                 
            prst = conn.prepareStatement(sql);
            rs = prst.executeQuery();

            int pInt = 1;
            int oInt = 1;

            g.main();
            while(rs.next()){
                if(rs.getString("Company").equals("10")){
                    addRow(pSheet, rs, createHelper, pInt);
                    pInt++;
                }else{
                  if(!prevCompany.equals(rs.getString("Company")) && !prevCompany.equals("") && !prevCompany.equals("10")){
                      writeWorkBook(wb, prevCompany, response);
                      oInt = 1;
                      wb = new HSSFWorkbook();
                      oSheet = wb.createSheet("Recon");
                      iTotal = 0.0;
                  }
                prevCompany = rs.getString("Company");
                addRow(oSheet, rs, createHelper, oInt);
                iTotal += rs.getDouble("Approved");
                oInt++;  
                }
                absoluteTotal += rs.getDouble("Approved");
            }// end rs.next();
            if(!prevCompany.equals("10")){
                addTopRow(oSheet, createHelper, prevCompany, iTotal);
                writeWorkBook(wb, prevCompany, response);
            }
            addTopRow(pSheet, createHelper, "10", absoluteTotal);
            writeWorkBook(pWB, "10", response);

        }catch(Exception e){
            str="Got exception: " + e.getMessage();
        }

    }

     private void addTopRow(Sheet sheet, CreationHelper createHelper, String Company, Double amount){
         try{
                Row row = sheet.createRow((short)0);
                row.createCell(0).setCellValue(createHelper.createRichTextString(dateStr));
                row.createCell(1).setCellValue(createHelper.createRichTextString(""));
                row.createCell(2).setCellValue(createHelper.createRichTextString(ERDate));
                row.createCell(3).setCellValue(createHelper.createRichTextString("G/L Account"));
                row.createCell(4).setCellValue(passSwitch(Company));
                row.createCell(5).setCellValue(createHelper.createRichTextString(""));
                row.createCell(6).setCellValue(createHelper.createRichTextString("1000-0000"));
                row.createCell(7).setCellValue(createHelper.createRichTextString(""));
                row.createCell(8).setCellValue(createHelper.createRichTextString(""));
                row.createCell(9).setCellValue(createHelper.createRichTextString(""));
                row.createCell(10).setCellValue(createHelper.createRichTextString(""));
                row.createCell(11).setCellValue(createHelper.createRichTextString("Null"));
                row.createCell(12).setCellValue(createHelper.createRichTextString(""));
                row.createCell(13).setCellValue(createHelper.createRichTextString(""));
                row.createCell(14).setCellValue(createHelper.createRichTextString(""));
                row.createCell(15).setCellValue(createHelper.createRichTextString(""));
                row.createCell(16).setCellValue(createHelper.createRichTextString(""));
                row.createCell(17).setCellValue(amount);
                row.createCell(18).setCellValue(createHelper.createRichTextString(""));
                row.createCell(19).setCellValue(createHelper.createRichTextString(""));
                row.createCell(20).setCellValue(createHelper.createRichTextString(""));
                row.createCell(21).setCellValue(createHelper.createRichTextString("G/L Account"));
         }catch(Exception e){
             String error = e.toString();
         }
     }

    private void addRow(Sheet sheet, ResultSet rs, CreationHelper createHelper, int i){
        try{
            Row row = sheet.createRow((short)i);
            row.createCell(0).setCellValue(createHelper.createRichTextString(dateStr));
            row.createCell(1).setCellValue(createHelper.createRichTextString(""));
            row.createCell(2).setCellValue(createHelper.createRichTextString(ERDate));
            row.createCell(3).setCellValue(createHelper.createRichTextString("G"));
            row.createCell(4).setCellValue(rs.getString("Code"));
            row.createCell(5).setCellValue(createHelper.createRichTextString(""));
            row.createCell(6).setCellValue(createHelper.createRichTextString(g.getFundVar(rs.getString("Company") + ":" + rs.getString("Dept"))));
            row.createCell(7).setCellValue(createHelper.createRichTextString(""));
            row.createCell(8).setCellValue(createHelper.createRichTextString(""));
            row.createCell(9).setCellValue(createHelper.createRichTextString(""));
            row.createCell(10).setCellValue(createHelper.createRichTextString(""));

            String emNum = rs.getString("EM");
            while(emNum.length() != 9){
                emNum = "0" + emNum;
            }
            emNum = "E" + emNum;
            row.createCell(11).setCellValue(createHelper.createRichTextString(emNum));
            row.createCell(12).setCellValue(createHelper.createRichTextString(""));
            row.createCell(13).setCellValue(createHelper.createRichTextString(""));
            row.createCell(14).setCellValue(createHelper.createRichTextString(""));
            row.createCell(15).setCellValue(createHelper.createRichTextString(""));
            row.createCell(16).setCellValue(createHelper.createRichTextString(""));
            row.createCell(17).setCellValue(rs.getDouble("Approved"));
            row.createCell(18).setCellValue(createHelper.createRichTextString(""));
            row.createCell(19).setCellValue(createHelper.createRichTextString(""));
            row.createCell(20).setCellValue(createHelper.createRichTextString(""));
            row.createCell(21).setCellValue(createHelper.createRichTextString("G/L Account"));

        }catch(Exception e){
            String error = e.toString();
        }
    }
    private void writeWorkBook(Workbook wb, String Company, HttpServletResponse response) {
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Expires", "0");
        response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        response.setHeader("Pragma", "public");
        response.setHeader("Content-Disposition", "attachment; filename=" + Company +".xls");
    try {                         
        ServletOutputStream out = response.getOutputStream();
        wb.write(out);
        out.flush();
        out.close();         
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1 ответ

Решение

Либо вам нужно сжать файлы Excel и отправить в качестве ответа, либо вы используете его как один файл Excel и используете вместо файлов несколько листов

Другие вопросы по тегам