简体   繁体   中英

Create and download excel file using ahref link using Apache POI

I have a list of excel files on a JSP page which are stored in a database as tables. They are hyperlinks. I need to download the file whenever the user clicks on a particular file.

I have the following code for it.

JSP PAGE

<html>
<head>
    <title></title>
</head>
<body>
<%
  List<String> encrypted = (List<String>)session.getAttribute("encryptedlist");
  List<String> original = (List<String>)session.getAttribute("originallist");
  List<String> decrypted = (List<String>)session.getAttribute("decryptedlist");

%>

<table>
  <tr>
    <td style="font-weight: bold">Original Files</td>
    <td style="font-weight: bold">Encrypted Files</td>
    <td style="font-weight: bold">Decrypted Files</td>
  </tr>
  <%for(int i=0;i<size;i++) {%>
  <tr>
    <td><a href="DownloadServlet1?file=<%=original.get(i)%>"><%=original.get(i)%></a></td>
    <td><a href="DownloadServlet1?file=<%=encrypted.get(i)%>"><%=encrypted.get(i)%></a></td>
    <td><a href="DownloadServlet2?file=<%=decrypted.get(i)%>"><%=decrypted.get(i)%></a></td>
  </tr>
  <%}%>
</table>
</body>
</html> 

SERVLET

public class DownloadServlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String file = request.getParameter("file");
        System.out.println(file);
        int columns = getCount(file);
        System.out.println(columns);
        List<String> columnNames = getColumnNames(file,columns);
        System.out.println(columnNames);
        saveFile(columnNames,columns,file,response);
        response.sendRedirect("Login.jsp");
    }

    protected int getCount(String file){
        //String sql = "select * from " + "`" + file + "`";
        int col=0;
        try {
            Connection con = DBOperations.getConnection();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + file);
            System.out.println("SELECT * FROM " + file);
            ResultSetMetaData md = rs.getMetaData();
            col = md.getColumnCount();
        }catch (Exception ex)
        {
            System.out.println("getcount" + ex);
        }
        return col;
    }

    protected List<String> getColumnNames(String file, int columns)
    {
        List<String> columnNames = new ArrayList<>();
        try {
            Connection con = DBOperations.getConnection();
            Statement st = con.createStatement();
            String sql = "Select * from " + file;
            System.out.println("getcolumnnames " + sql);
            ResultSet rs = st.executeQuery(sql);
            System.out.println("SELECT * FROM " + file);
            ResultSetMetaData md = rs.getMetaData();
            for (int i = 1; i <= columns; i++){
                String col_name = md.getColumnName(i);
                columnNames.add(col_name);
                //System.out.println(col_name);
            }
        }catch (Exception ex)
        {
            System.out.println("get column names"+ex);
        }
        return columnNames;
    }
    protected void saveFile(List<String> columnNames,int columns,String file,HttpServletResponse response)
    {
        Connection con = DBOperations.getConnection();

        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment; filename="+file+".xls");
        String excelFileName = file;

        String sheetName = "Sheet1";//name o sheet

        XSSFWorkbook wb = new XSSFWorkbook();
        XSSFSheet sheet = wb.createSheet(sheetName) ;

        //iterating r number of rows
        for (int r=0;r < 1; r++ )
        {
            XSSFRow row = sheet.createRow(r);

            //iterating c number of columns
            for (int c=0;c < columns; c++ )
            {
                XSSFCell cell = row.createCell(c);

                cell.setCellValue(columnNames.get(c));
            }
        }

        try
        {
            String sql = "Select * from " + file;
            System.out.println(sql);
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery(sql);
            int r=1;
            while(rs.next())
            {
                XSSFRow row = sheet.createRow(r);
                for(int c=1;c<columns;c++)
                {
                    XSSFCell cell = row.createCell(c);

                    cell.setCellValue(rs.getString(c));
                }
                r=r+1;
            }

        }catch (Exception ex)
        {
            System.out.println(ex);
        }

        try {
            FileOutputStream fileOut = new FileOutputStream(excelFileName);
            //write this workbook to an Outputstream.
            wb.write(fileOut);
            fileOut.flush();
            fileOut.close();
        }catch (Exception ex)
        {
            System.out.println(ex);
        }

    }
}

The getCount function returns the number of columns for the database file from the database. The getColumnNames gets the names of all the columns.

Both the functions return correct values, which shows that the there is no problem accessing the database table

The saveFile function is supposed to download the excel file.

I'm getting this error on the browser webpage

The webpage at http://localhost:8084/DownloadServlet1?file=Hil_1566869_27_08_17_20_24_18 might be temporarily down or it may have moved permanently to a new web address.

What could be the problem?

Write the Excel document directly into the HTTP response:

wb.write(response.getOutputStream());

There is no point in saving the Excel document locally on the server.

Also, don't redirect to Login.jsp , this is what probably causes the error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM