用java操作Excel有很多方法,这里我主要简单介绍一下用jxl这个方法,因为我也是新手嘛,也是第一次操作这个东西,可能不是很全面。大家见谅。

下面是我用jxl操作Excel表格的一些细节和原理。你也可以用poi,不过这个方法在网上有很多介绍我就不多加赘述了。

 

首先介绍一下导出Excel表格。

第一步

             项目需要导入jxl.jar (在网上可以下载,然后放到lib文件夹中)

第二步

             我的项目是基于S2SH集成框架开发的。

             首先我们通过页面点击生成Excel文件按钮。跳至生成Excel文件的Action处理方法中。

             Date today = new Date(new java.util.Date().getTime());  
             inputPath = "移库单"+today+".xls"; 
             HttpServletRequest request = ServletActionContext.getRequest(); 
             HttpServletResponse response = ServletActionContext.getResponse(); 
             response.reset();  
             response.setCharacterEncoding("ISO8859-1");  
             response.setHeader("Content-Disposition", "p_w_upload; filename=" + new String(inputPath.getBytes("GBK"), "ISO8859-1"));//fileChName为下载时用户看到的文件名  
             response.setHeader("Connection", "close"); 
             response.setHeader("Content-Type", "application/octet-stream");

             上面代码是我要生成的文件名字。"移库单2011-12-7.xls" 后面是处理文件名,避免生成文件名中文不会乱码。

第三步

            首先要把你需要生成Excel文件的数据全部查询出来。并把发放到List集合里面。

            我这里因为生成的数据比较大所以放在了下面这个放着Map集合的List集合里面。

            List<Map<String,String>> list = reportService.getMoveOrderView(pageBean,orderNumber);

            总之上面这句代码就是把你需要生成Excel文件的数据放在一个List集合里面。

            OutputStream os = response.getOutputStream();                          //打开输出流。
            WritableWorkbook book = Workbook.createWorkbook(os);        //把输出流传给Excel文件。
            WritableSheet sheet = book.createSheet("第一页", 0);                    //获得Excel表的第一页。
            WritableCellFormat format = new WritableCellFormat();                //规定格式。
            format.setAlignment(Alignment.CENTRE);                                         //设置格式为段落居中。

            Label label = new Label(0, 0, "移库单"+today,format);                     //创建单元格。第1列,第1行,单元格内容,添加格式。
            sheet.addCell(label);                                                                                //将定义好的单元格添加到工作表中。
            sheet.mergeCells(0, 0, 10, 0);                                                                 //合并单元格。从第1列第1行合并到第11列第一行。

            上面代码获得输出流os 生成Excel文件 把输出流传给book。这样页面点完生成Excel文件按钮之后就会直接提示用户另存为/下载Excel文件,

第四步

            for (int i =0;i<list.size();i++) {
                    Label labelorderNumberTitle = new Label(0, 1, "移库单号",format);
                    sheet.addCell(labelorderNumberTitle);
                    Label labelPalletNameTitle = new Label(1, 1, "管理号",format);
                    sheet.addCell(labelPalletNameTitle);
                    Label labelMaterialNumberTitle = new Label(2, 1, "物料号",format);
                    sheet.addCell(labelMaterialNumberTitle);
                    Label labelMaterialDescTitle = new Label(3, 1, "物料描述",format);
                    sheet.addCell(labelMaterialDescTitle);
                    Label labelQtyTitle = new Label(4, 1, "移库数量",format);
                    sheet.addCell(labelQtyTitle);
                    Label labelBatchNumberTitle = new Label(5, 1, "批次号",format);
                    sheet.addCell(labelBatchNumberTitle);
                    Label labelAreaNameTitle = new Label(6, 1, "原库区",format);
                    sheet.addCell(labelAreaNameTitle);
                    Label labelPosNameTitle = new Label(7, 1, "原库位",format);
                    sheet.addCell(labelPosNameTitle);
                    Label labelStockAreaNameTitle = new Label(8, 1, "目标库区",format);
                    sheet.addCell(labelStockAreaNameTitle);
                    Label labelStockPosNameTitle = new Label(9, 1, "目标库位",format);
                    sheet.addCell(labelStockPosNameTitle);
                    Label labelNumberTitle = new Label(10, 1, "参考号",format);
                    sheet.addCell(labelNumberTitle);
                   
                    Map<String, String> map = list.get(i);


                    Label labelOrderNumber = new Label(0, i+2, map.get("orderNumber"));
                    Label labelPalletName = new Label(1, i+2, map.get("palletName"));
                    Label materialNumber = new Label(2, i+2, map.get("materialNumber"));
                    Label materialDesc = new Label(3, i+2, map.get("materialDesc"));
                    Label qty = new Label(4, i+2, map.get("qty"));
                    Label batchNumber = new Label(5, i+2, map.get("batchNumber"));
                    Label areaName = new Label(6, i+2, map.get("areaName"));
                    Label posName = new Label(7, i+2, map.get("posName"));
                    Label stockAreaName = new Label(8, i+2, map.get("stockAreaName"));
                    Label stockPosName = new Label(9, i+2, map.get("stockPosName"));
                    Label number = new Label(10, i+2, map.get("number"));
                    sheet.addCell(labelOrderNumber);
                    sheet.addCell(labelPalletName);
                    sheet.addCell(materialNumber);
                    sheet.addCell(materialDesc);
                    sheet.addCell(qty);
                    sheet.addCell(batchNumber);
                    sheet.addCell(areaName);
                    sheet.addCell(posName);
                    sheet.addCell(stockAreaName);
                    sheet.addCell(stockPosName);
                    sheet.addCell(number);
               
            }
            book.write();
            book.close();
            os.flush();
            os.close();
            上面代码循环遍历List集合里面的数据。并将数据放到单元格中。在把定义好的单元格添加到工作表中。写入数据并关闭文件。清空输出流并关闭输出流。这样一个Excel文件就生成了。