请问下如何一次性将数据库中一个表里的所有数据分成若干个EXCEL表导出?也就是说一次性导出多个表!是否有可能实现这个功能呢?
必有重谢

解决方案 »

  1.   

    我现在就是用JDBC和POI   不知道怎么实现才来问的嘛!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  2.   

    用jxl,很好用的,用java来操作Excel的
      

  3.   

    用jxl吧,比较简单
    首先需要到网上下个jxl.jar的包练习代码如下:(注意里面的图片替换成自己的就可以了)import java.io.*;
    import java.util.Random;
    import java.util.Date;
    import jxl.*;
    import jxl.format.UnderlineStyle;
    import jxl.write.*;
    import jxl.write.Number;
    import jxl.write.Boolean;
    public class CreateXL
    {
        public CreateXL()
        {
            
        }
        public static void main(String[] args)
        {
            //读Excel
            //CreateXL.readExcel("d:/abc.xls");
            
            //创建新的Excel
            CreateXL.writeExcel("d:/new.xls");
            
            //更新Excel
            CreateXL.updateExcel("d:/new.xls");
            
        }
        //jxl暂时不提供修改已经存在的数据表,这里通过一个小办法来达到这个目的,不适合大型数据更新!
        //这里是通过覆盖原文件来更新的.
        public static void updateExcel(String filePath)
        {
            try
            {
                Workbook rwb = Workbook.getWorkbook(new File(filePath));
                WritableWorkbook wwb = Workbook.createWorkbook(new File("d:/new.xls"),rwb);//copy
                WritableSheet ws = wwb.getSheet(0);
                WritableCell wc = ws.getWritableCell(0,0);
                //判断单元格的类型,做出相应的转换
                Label label = (Label)wc;
                label.setString("The value has been modified");
                wwb.write();
                wwb.close();
                rwb.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }    public static void writeExcel(String filePath)
        {
            try
            {
                //创建工作薄
                WritableWorkbook wwb = Workbook.createWorkbook(new File(filePath));
                
                //创建工作表
                WritableSheet ws = wwb.createSheet("Sheet1",0);
                //System.out.println("create ok!");
                
                //添加标签文本
                Random rnd=new Random((new Date()).getTime());
                int forNumber=rnd.nextInt(100);
                for(int i=0;i<forNumber;i++)
                {
                    ws.addCell(new Number(rnd.nextInt(50),rnd.nextInt(50),rnd.nextInt(1000)));
                }
                
                //添加图片(注意此处jxl暂时只支持png格式的图片)
          //0,1分别代表x,y    2,5代表宽和高占的单元格数
          ws.addImage(new WritableImage(0,1,2,5,new File("png\\cs.png")));
                
                wwb.write();
          wwb.close();
            }
            catch(Exception e)
            {
                System.out.println(e.toString());
            }
        }
        public static void readExcel(String filePath)
        {
            /**
             *后续考虑问题,比如Excel里面的图片以及其他数据类型的读取
             **/
            try
            {
                InputStream is=new FileInputStream(filePath);
                //声名一个工作薄
                Workbook rwb = Workbook.getWorkbook(is);
                
                //获得工作薄的个数
                //rwb.getNumberOfSheets();
                    
                //在Excel文档中,第一张工作表的缺省索引是0
                Sheet st = rwb.getSheet("Sheet1");
                
                //通用的获取cell值的方式,getCell(int column, int row) 行和列
                int Rows=st.getRows();
                int Cols=st.getColumns();
                System.out.println("当前工作表的名字:"+st.getName());
                System.out.println("总行数:"+Rows);
                System.out.println("总列数:"+Cols);
            
                Cell c;
                for(int i=0;i<Cols;++i)
                {
                    for(int j=0;j<Rows;++j)
                    {
                        //getCell(Col,Row)获得单元格的值
                        System.out.print((st.getCell(i,j)).getContents()+"\t");
                    }
                    System.out.print("\n");
                }
                //操作完成时,关闭对象,释放占用的内存空间
                rwb.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
    } 这是在网上找的,我都实验过了。有你想要的功能可以创建execl,
    cell分3种,从数据库里查找到数据,创建execl,再创建sheet,再创建cell放入sheet就可以了
      

  4.   

    首先感谢4楼的兄弟 , 不过我看了下你发的代码,好象没有我需要的一次性导出多个EXCEL文件的功能!!!要不我把我的代码发一下吧 看看大家能不能帮我下  谢谢了!!
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.sql.ResultSet;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;import com.actionsoft.db.MysqlDb;public class ExExcel {
    //Excel 文件要存放的位置,假定在D盘根目录下,命名规则是以当前系统时间的毫秒数
    static long timea = System.currentTimeMillis();
    public static String outputFile="D:/excels/"+timea+".xls";
    public static void main(String argv[]){
    ExExcel.exExcel();
    }

    public static void exExcel(){
    HSSFWorkbook workbook = new HSSFWorkbook();
    try{
    //创建新的Excel文件

    int sheetnum = 0;
    //第1个SQL查询,是为了获得表中的分组数据
    String sql = "select * from t_color group by color_name";
    MysqlDb mdb = new MysqlDb();
    ResultSet rs = mdb.query(sql);
    while(rs.next()){
    String yanseid = rs.getString("color_id");
    String yansename = rs.getString("color_name");

    //在Excel工作簿中建一个sheet,其名为默认值
    //如要新建一名为"XXX名字"的sheet表,其语句为:HSSFSheet sheet = workbook.createSheet("XXX名字");
    HSSFSheet sheet = workbook.createSheet();
    HSSFRow row = sheet.createRow((short)0);//在索引0的位置创建行(最顶端的行)
    HSSFCell cell = row.createCell((short)0);//在索引0的位置创建单元格(左上端)
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);//定义单元格为字符串类型
    cell.setCellValue("颜色ID");//在单元格中输入需要的内容
    row = sheet.createRow((short)0);
    cell = row.createCell((short)1);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellValue("颜色名称");
    //创建第2个SQL查询
    MysqlDb mdb1 = new MysqlDb();
    String sql1 = "select * from t_color where color_name='"+yansename+"'";
    ResultSet rs1 = mdb1.query(sql1);
    int j = 1;
    while(rs1.next()){
    row = sheet.createRow((short)j);
    cell = row.createCell((short)0);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellValue(rs1.getString("color_id"));

    row = sheet.createRow((short)j);
    cell = row.createCell((short)1);
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellValue(rs1.getString("color_name"));
    //新建一输出文件流
    FileOutputStream fOut = new FileOutputStream(outputFile);
    //把相应的Excel 工作簿存盘
    workbook.write(fOut);
    fOut.flush();
    //操作结束,关闭文件
    fOut.close();
    j++;
    }
    String sheetname = yanseid+yansename;
    workbook.setSheetName(sheetnum, sheetname, HSSFWorkbook.ENCODING_UTF_16);
    sheetnum++;
    }
    System.out.println("EXCEL文件已生成至..."+outputFile);
    }catch(Exception e) {
    System.out.println("错误" + e );
    }
    /**
     * 实现文件压缩
     */
            int BUFFER = 2048;//预设缓冲区成员(位元阵列)为2048元组
            long l = System.currentTimeMillis();//获得当前系统时间的毫秒数
         try {
                BufferedInputStream origin = null;//设置输入流
                FileOutputStream dest = new FileOutputStream("E:\\"+l+".zip");//创建一个文件输出流
                ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));//实例化一个ZIP输出流并实例化缓冲区
                byte data[] = new byte[BUFFER];//获得一个字节数组
                File f  = new File("D:/excels");//获得需压缩的原始文件夹
                File files[] = f.listFiles();//返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。
                //循环路径名数组,向ZIP中写入
                for (int i = 0; i < files.length; i++) {
                    FileInputStream fi = new FileInputStream(files[i]);//通过路径数组来创建文件写入流
                    origin = new BufferedInputStream(fi, BUFFER);//实例化一个有缓冲区大小的输入流
                    ZipEntry entry = new ZipEntry(files[i].getName());//通过指定的名称创建ZIP文件
                    out.putNextEntry(entry);//输出ZIP文件
                    int count;//设置变量
                    //将输入流中最多BUFFER个数据字节读入字节数组。以整数形式返回实际读取的字节数,若到达末尾没有数据了,返回-1
                    while ((count = origin.read(data, 0, BUFFER)) != -1) 
                    {
                        out.write(data, 0, count);//输出ZIP数据
                    }
                    origin.close();//关闭输入流
                }
                out.close();//关闭ZIP输出流
                System.out.println("压缩文件生成...");
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
    }
      

  5.   

    我也支持用JXL  我觉得既然能导出一个Excel表 就可以实现导出多个的功能 
      

  6.   

    我刚刚学jxl,感觉确实很好用,想导出多个表,那就一个一个导呗,或者用循环语句导出,只要文件不重名就行!!!呵呵
      

  7.   

    你是要循环创建一个execl中的多个sheet,还是多个execl文件。
    我是这样想的,如果是要多个sheet,那你就循环创建sheet,   WritableSheet ws = wwb.createSheet("Sheet"+i,i); 
    然后你再一个sheet一个的往里填数据就是了嘛如果是多个execl文件,如果要填的数据符合一定规律,或者根本就是一样的,    public static void writeExcel(String filePath) 
        { 
         } 
    那你就循环调用这个函数不就是了吗?写个通用的。。
      

  8.   

    这个问题也是我要问的。13楼说的循环,是实现不了的。workbook.write(fOut)方法调用后会直接走到前台,第二次循环根本走不到。大家,来关注一下,帮帮忙吧,急啊,万分感谢!
      

  9.   

    请问楼上的问题解决了么?现在也遇到这样的问题。需要导出多个excel文件,原来的想法也是循环进行,可是,像楼上说的,第一次输出到浏览器之后循环就终止了。请问楼上的解决方案是??急求....
      

  10.   

    呵呵.我现在遇到的问题是,第一次运行成功,成功导出第一个excel,然后循环第二遍,也是成功运行,后天也没有保持
    ,但是第二个excel却并没有显示....看下载的默认路径也没有看到第二个excel被导出...
    是我哪里设置问题么?