Java 如何使用servlet发送excel文件

Java 如何使用servlet发送excel文件,java,servlets,jxl,Java,Servlets,Jxl,我试图在一个servlet上创建一个excel文件,并将其发送到客户端浏览器。当我在一个独立程序上创建该文件时,该文件是在我的计算机上创建的,但当我试图在servlet上创建它时,它什么也没有做 servlet: response.setContentType("text/html;charset=UTF-8"); // PrintWriter out = response.getWriter(); String[] items=request.getParame

我试图在一个servlet上创建一个excel文件,并将其发送到客户端浏览器。当我在一个独立程序上创建该文件时,该文件是在我的计算机上创建的,但当我试图在servlet上创建它时,它什么也没有做

servlet:

response.setContentType("text/html;charset=UTF-8");
        // PrintWriter out = response.getWriter();
        String[] items=request.getParameterValues("lecture");
        String course=request.getParameter("course");
        int sheets=Integer.parseInt(request.getParameter("sheets"));
        List <XlElement> xlElements=getAllElements(items);
        ServletOutputStream output=response.getOutputStream();
        try
        {
           response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment; filename="+course+".xls");
            CreateXl xl=new CreateXl();
            xl.createScadualFile(output, xlElements, sheets);
            output.println(course);
        }
        catch (Exception e)
        {
            System.out.println(e.toString());
            throw new ServletException("Exception in Excel Sample Servlet", e);
        }
          output.close();
response.setContentType(“text/html;charset=UTF-8”);
//PrintWriter out=response.getWriter();
String[]items=request.getParameterValues(“讲座”);
字符串course=request.getParameter(“course”);
int sheets=Integer.parseInt(request.getParameter(“sheets”);
列表X元素=获取等位元素(项目);
ServletOutputStream输出=response.getOutputStream();
尝试
{
response.setContentType(“application/vnd.ms excel”);
response.setHeader(“内容处置”、“附件;文件名=“+course+”.xls”);
CreateXl xl=新建CreateXl();
xl.createScadualFile(输出、X元素、表格);
输出println(课程);
}
捕获(例外e)
{
System.out.println(例如toString());
抛出新的ServletException(“Excel示例Servlet中的异常”,e);
}
output.close();
createXl类

   private List<WritableSheet> xlSheets;
    private String[] days={"א","ב","ג","ד","ה"};
    private final int numOfClasses=9;
    private final int cellHeight= 1020;
    private final int cellWidth=15;
    public void createScadualFile(ServletOutputStream output, List <XlElement> items,int sheets) throws IOException, WriteException{
        xlSheets=new ArrayList<WritableSheet>();
        WritableWorkbook workbook = Workbook.createWorkbook(output);
        for(int i=0;i<sheets;i++){
            WritableSheet sheet = workbook.createSheet("week "+(i+1), i);
            xlSheets.add(sheet);
        }
        for(WritableSheet s: xlSheets){
            initSheet(s);
        }
        for(XlElement e: items){
            insertElement(e);
        }
        workbook.write();
        workbook.close();
    }




    private  WritableCellFormat getCellFormat(Colour colour, Pattern pattern) throws WriteException {
        WritableFont cellFont = new WritableFont(WritableFont.TIMES, 12);
        WritableCellFormat cellFormat = new WritableCellFormat(cellFont);
        cellFormat.setBackground(colour, pattern);
        cellFormat.setWrap(true);
        cellFormat.setVerticalAlignment(jxl.format.VerticalAlignment.TOP);
        return cellFormat;
    }
    private void initSheet(WritableSheet s) throws WriteException{
        for(int i=0;i<days.length;i++){
            Label l=new Label(i+1,0,days[i],getCellFormat(Colour.GREY_25_PERCENT,Pattern.SOLID));
            s.setColumnView(i+1,cellWidth );
            s.addCell(l);
        }
        for(int i=0;i<numOfClasses;i++){
            Label l=new Label(0,i+1,Integer.toString(i+1),getCellFormat(Colour.GREY_25_PERCENT,Pattern.SOLID));
            s.setRowView(i+1, cellHeight);
            s.addCell(l);
        }
    }
    private void insertElement(XlElement e) throws WriteException{
        Label l=new Label(e.getCol(),e.getRow(),e.toXlString(), getCellFormat(Colour.RED,Pattern.SOLID));
        xlSheets.get(e.getWeek()).mergeCells(e.getCol(), e.getRow(), e.getCol(), e.getRow()+e.getSpan()-1);
        xlSheets.get(e.getWeek()).addCell(l);
    }
私有列表;
私有字符串[]天={“א”、“ב”、“ג”、“ד”、“ה”};
私有最终整数=9;
专用最终内部单元高度=1020;
专用最终整数单元格宽度=15;
public void createScadualFile(ServletOutputStream输出、列表项、int表)引发IOException、WriteException{
xlSheets=新的ArrayList();
WritableWorkbook=工作簿.createWorkbook(输出);

对于(int i=0;i首先,您应该只调用一次
response.setContentType()
。您想返回一个Excel,所以请取出将内容类型设置为
“text/html;charset=UTF-8”的Excel

第二,在将二进制文件写入输出流后,将文本写入输出流将使其出错。取出
output.println(当然);


第三,我真的认为也不需要
输出.close();
,因此您也可以尝试将其删除。

如果它“没有任何作用”很可能它实际上抛出了一个异常。你检查过你的服务器日志了吗?我调试了它,但没有发现任何异常。它只是通过代码运行。我做了所有这些事情,但我仍然没有将任何文件发送到浏览器