环境tomcat + j2sdk1.4.1_02
在jsp中,要如何将sql语句查询到的数据生成到Excel文件中
或保存成Excel文件?

解决方案 »

  1.   

    最简单的
    因为ms word和excel的文档都支持html文本格式,因此可以先用word或excel做好模版,另存为Web页,然后将该html改成jsp,将数据部分动态填入即可,不用很辛苦的调整格式word页面只要在jsp头设置如下指令:
    <%@page contentType="application/msword;charset=GBK" %>excel如下:
    <%@page contentType="application/vnd.ms-excel;charset=GBK" %>
    ——-——————————————————————————————
    使用这种方式客户端必须安装有office软件,用户访问时将在ie中直接用word或excel打开该页面。此方法优势是模板设计、调整方便,无需在服务器端使用复杂的POI或jxl技术,也无需在客户端使用ActiveX控件技术,更安全、方便,轻松实现较好的打印效果。 microsoft关于服务器端动态创建office文档的资料(asp示例): 
    http://support.microsoft.com/default.aspx?scid=KB;en-us;301044&简单示例:<%@ page contentType="application/msword;charset=GBK" %><%@ page import="java.sql.*" %><html><head><title>报表</title></head><body bgcolor="#FFFFFF"><center><h1>报表</h1></center><table border=1 cellspacing=0 cellpadding=0 bordercolor=#000000 align=center><tr><td>用户名</td><td>真实姓名</td><td>性别</td></tr><%Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String url="jdbc:odbc:user";//连接user数据库Connection con=DriverManager.getConnection (url, "", ""); Statement stmt=con.createStatement(); ResultSet rs=stmt.executeQuery("select * from user ");//查询user表while(rs.next()){%><tr><td><%= rs.getString("username") %></td><td><%= rs.getString("name") %></td><td><%= rs.getString("sex") %></td></tr><%}%><%rs.close();stmt.close();con.close();%> </table> 
     
     
     
      

  2.   

    首先把结果放在 String[][]或什么什么里
    再把String[][]写入 Excel
    用 jxl包
    http://www.andykhan.com/jexcelapi/download.html
    或者自己写个方法。
    我们有个项目用的是odbc数据源。把excle当成个数据库,把数据写入形成报表。
      

  3.   

    Downloads The JACOB binary distribution (jacobBin_XX.zip) includes: 
    import com.ms.com.*;
    import com.ms.activeX.*;public class DispatchTest
    {
      public static void main(String[] args)
      {
        ActiveXComponent xl = new ActiveXComponent("Excel.Application");
        Object xlo = xl.getObject();
        try {
          System.out.println("version="+xl.getProperty("Version"));
          System.out.println("version="+Dispatch.get(xlo, "Version"));
          xl.setProperty("Visible", new Variant(true));
          Object workbooks = xl.getProperty("Workbooks").toDispatch();
          Object workbook = Dispatch.get(workbooks,"Add").toDispatch();
          Object sheet = Dispatch.get(workbook,"ActiveSheet").toDispatch();
          Object a1 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
                                      new Object[] {"A1"},
                                      new int[1]).toDispatch();
          Object a2 = Dispatch.invoke(sheet, "Range", Dispatch.Get,
                                      new Object[] {"A2"},
                                      new int[1]).toDispatch();
          Dispatch.put(a1, "Value", "123.456");
          Dispatch.put(a2, "Formula", "=A1*2");
          System.out.println("a1 from excel:"+Dispatch.get(a1, "Value"));
          System.out.println("a2 from excel:"+Dispatch.get(a2, "Value"));
          Variant f = new Variant(false);
          Dispatch.call(workbook, "Close", f);
        } catch (Exception e) {
          e.printStackTrace();
        } finally {
          xl.invoke("Quit", new Variant[] {});
        }
      }
    }
      

  4.   

    用POI吧,这个做个参考,是把rs转化为Excel文件的
    import java.util.*;
    import org.apache.poi.hssf.usermodel.*;
    import java.io.*;
    public class DataExchange {

    /**
     * 一个Excel文件的层次:Excel文件->工作表->行->单元格
     * 对应到POI中,为:workbook->sheet->row->cell
     * 
     * 程序主要流程:
     * 1、创建一个输出流并依次创建一个文件,工作表,若干行及每行的单元格
     * 2、用一个循环将rs中的直附给Excel表
     * 3、将表写如输出流输出并关闭输出流
     * 
     * @param rs 要转换为Excel文件的数据库查询结果集
     * @param userName 当前用户名
     * @param moduleName 当前模块名
     * @param dir 站点的相对路径,可由String file = request.getRealPath("/")获取
     * @return 生成的文件名
     */
    public static String rsToExcel(String userName, String moduleName, String dir, ResultSet rs)
    {
    short rownum = 0;
    String str = null;
    //生成文件名
    GetDate currentDate = new GetDate();
    String path = dir + File.separator + "temp" + File.separator; 
    String name = userName + "_" + moduleName + "_" + currentDate.getYear() + currentDate.getMonth() + currentDate.getDayOfMonth() + ".xls";
    String fullName =  path + name;

    //获取结果集rs中的信息
    int rsColCount = 0;
    ResultSetMetaData rsmd = null;
    try {
    rsmd = rs.getMetaData();
    rsColCount = rsmd.getColumnCount();

    catch (SQLException e2) 
    {
    e2.printStackTrace();
    }

    // 创建一个新的文件
    File newFile = new File( fullName );
    //创建一个输出流
    FileOutputStream out = null;
    try {
    out = new FileOutputStream( newFile );
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }
    // 创建一个新的Workbook
    HSSFWorkbook wb = new HSSFWorkbook();
    // 在新的Workbook下创建一个Sheet
    HSSFSheet s = wb.createSheet();
    // 声明一个行的引用
    HSSFRow r = null;
    // 声明一个单元格的引用
    HSSFCell c = null; // 将第一个工作表命名为worksheet
    wb.setSheetName(0, "worksheet");

    // 将结果集rs中的值放到Excel中对应的位置
    try 
    {
    while(rs.next())
    {
    // 新建一行
    r = s.createRow(rownum++);
    //为每一行附值
    for (short cellnum = (short)0; cellnum < rsColCount; cellnum++)
    {
    // 创建一个单元格
    c = r.createCell(cellnum);
    //解决中文问题
    c.setEncoding(HSSFCell.ENCODING_UTF_16);
    // 为单元格附值
    str = rs.getString(cellnum + 1);
    c.setCellValue(str);
    }
    }

    catch (SQLException e3) 
    {
    e3.printStackTrace();
    }

    // 将workbook写入输出流并关闭文件
    try 
    {
    wb.write(out);
    out.close();

    catch (IOException e1)
    {
    e1.printStackTrace();
    }

    return name;
    }
    }
      

  5.   

    private void downLoad(HttpServletResponse response,ResultSet rs)
    throws Exception
    {
       PrintWriter out;
       StringBuffer sb = new StringBuffer();
       sb.append("a1");
       .
       .
       sb.append("z1");   while(rs.next)
       {
          sb.append(createFileLine(rs.getString("aaa"),false);
          sb.append(createFileLine(rs.getString("bbb"),false);
          .
          .
          sb.append(createFileLine(rs.getString("zzz"),true);
       }
       if(sb!=null ))
       {
          response.setContentType("application/BizFirm-csv; charset=UTF-8");
          response.setHeader("Content-disposition", "application/octet-stream;filename=orderList.CSV");
                try
                {
                     out = response.getWriter();
                     out.print(strDownloadData);
                }
                catch (IOException e)
                {
                    throw new BfException(BfException.ORDERLIST_DOWNLOAD_ERR);
                }
                out.close();        }
        }private String createFileLine(String strVal,boolean isEnd)
        {        String strValue = "";
            String strComma = ",";
            String strBr = "\n";        strVal = addQuotLR(replaceEnterToBr(replaceSimpleQuot(strVal)));
            if (isEnd)
            {
                strValue = strVal + strBr;
            }
            else
            {
                strValue = strVal + strComma;
            }
            return strValue;
        }
      

  6.   

    我没用过poi,我用的是jxl,感觉还不错!
    上面仁兄的做法都很不错,值得借鉴,祝你成功
      

  7.   

    有没有更好的解决方法  我想  生成excel然后下载下来