簡體   English   中英

使用Apache POI使用ahref鏈接創建和下載Excel文件

[英]Create and download excel file using ahref link using Apache POI

我在JSP頁面上有一個excel文件列表,這些文件以表格形式存儲在數據庫中。 它們是超鏈接。 每當用戶單擊特定文件時,我都需要下載文件。

我有以下代碼。

JSP頁面

<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);
        }

    }
}

getCount函數從數據庫返回數據庫文件的列數。 getColumnNames獲取所有列的名稱。

這兩個函數都返回正確的值,這表明訪問數據庫表沒有問題

saveFile函數應該下載excel文件。

我在瀏覽器網頁上收到此錯誤

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.

可能是什么問題呢?

將Excel文檔直接寫入HTTP響應中:

wb.write(response.getOutputStream());

將Excel文檔本地保存在服務器上沒有任何意義。

另外,不要重定向到Login.jsp ,這可能是導致錯誤的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM