用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", "attachment; 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文件就生成了。