之前是用Poi作Excel的操做、最近一个项目用jxl来作!如今项目完成了、作作总结!java
首先呢、须要的固然是jxl的.jar包!---------->jxl.jar<------------数据库
代码:由于此次的导出业务不怎么复杂稍微把对Excel导出的操做提了一下 数组
- /**
- * @author 古道西风
- * @param file 文件对象
- * @param objData 导出内容数组
- * @param sheetName 导出工做表的名称
- * @param columns 导出Excel的表头数组
- * @return
- */
- public static int exportToExcel_3(File file, Object[] objData, String sheetName,
- String[] columns) {
- int flag = 0;
- //声明工做簿jxl.write.WritableWorkbook
- WritableWorkbook wwb;
- try {
- //根据传进来的file对象建立可写入的Excel工做薄
- wwb = Workbook.createWorkbook(file);
- /*
- * 建立一个工做表、sheetName为工做表的名称、"0"为第一个工做表
- * 打开Excel的时候会看到左下角默认有3个sheet、"sheet一、sheet二、sheet3"这样
- * 代码中的"0"就是sheet一、其它的一一对应。
- * createSheet(sheetName, 0)一个是工做表的名称,另外一个是工做表在工做薄中的位置
- */
- WritableSheet ws = wwb.createSheet(sheetName, 0);
- //建立单元格样式
- WritableCellFormat wcf = new WritableCellFormat();
- //背景颜色设置为"那什么"色
- wcf.setBackground(Colour.YELLOW);
- /*
- * 这个是单元格内容居中显示
- * 还有不少不少样式
- */
- wcf.setAlignment(Alignment.CENTRE);
- //判断一下表头数组是否有数据
- if (columns != null && columns.length > 0) {
- //循环写入表头
- for (int i = 0; i < columns.length; i++) {
- /*
- * 添加单元格(Cell)内容addCell()
- * 添加Label对象Label()
- * 数据的类型有不少种、在这里你须要什么类型就导入什么类型
- * 如:jxl.write.DateTime 、jxl.write.Number、jxl.write.Label
- * Label(i, 0, columns[i], wcf)
- * 其中i为列、0为行、columns[i]为数据、wcf为样式
- * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为何"色"内容居中
- */
- ws.addCell(new Label(i, 0, columns[i], wcf));
- }
- //判断表中是否有数据
- if (objData != null && objData.length > 0) {
- //循环写入表中数据
- for (int i = 0; i < objData.length; i++) {
- //我这里直接用Object来接收了、由于状况特殊没有javaBean很痛苦、转换事后获得一条记录
- Object obj[] = (Object[]) objData[i];
- //将获得的记录写入Cell(单元格)中
- for (int j = 0; j < obj.length; j++) {
- //这里不引用样式了、j为列、(i+1)为行、由于表头占去了一行、因此后面的就+1
- ws.addCell(new Label(j, i + 1, String.valueOf(obj[j])));
- }
- }
- }
- //写入Exel工做表
- wwb.write();
- //关闭Excel工做薄对象
- wwb.close();
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- System.out.println(ex.getMessage());
- flag = 1;
- }
- return flag;
- }
- /**
- * 下载excel
- * @author 古道西风
- * @param response
- * @param url 文件存放路径,如: request.getRealPath("/");
- * @param filename 文件名 ,如:20110808.xls
- * @param listData 数据源
- * @param sheetName 表头名称
- * @param columns 列名称集合,如:{物品名称,数量,单价}
- */
- public static void exportexcle_3(HttpServletResponse response,String url,String filename,Object[] listData,String sheetName,String[] columns)
- {
- //根据传进来的文件路径、建立文件
- File file = new File(url + filename);
- //调用上面的方法、生成Excel文件
- exportToExcel_3(file, listData, sheetName, columns);
- //声明一个file对象
- File f=null;
- try {
- //根据刚刚的文件地址、建立一个file对象
- f = new File(url + filename);
- //若是文件不存在
- if (!f.exists()) {
- response.sendError(404, "File not found!");
- }
- //建立一个缓冲输入流对象
- BufferedInputStream br = new BufferedInputStream(
- new FileInputStream(f));
- byte[] buf = new byte[1024];
- int len = 0;
- response.reset(); // 很是重要
- response.setContentType("application/x-msdownload");
- response.setHeader("Content-Disposition", "p_w_upload; filename="
- + f.getName());
- //建立输出流对象
- OutputStream outStream = response.getOutputStream();
- //开始输出
- while ((len = br.read(buf)) > 0)
- outStream.write(buf, 0, len);
- //关闭流对象
- br.close();
- outStream.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- if (f.exists()) {//下载完毕删除文件
- f.delete();
- }
- }
在Action中只需在获取完数据库中的数据事后直接调用上面的方法、并传入参数就Ok了!app
- Object[] repObj = report.queryMaintainUnit(obj,pageInfo);
- String[] strArr = {"流水号","路段名","维护站名","所属系统",
- "故障等级","维护工区","派工时间","维修单位",
- "接修时间","处理结果","维修结果"};
- ExportDate expor = new ExportDate();
- expor.exportexcle_3(response,this.getUrl(),this.getFileName(),
- repObj,"维修单位明细表",strArr);
这是查询出来的数据:ide
Excel:this
在加上分页功能事后、数据出了问题、当点击下一页的时候、会多出一列、这一列是Oracle数据库分页时添加的rownum列、一、二、三、四、五、六、这样!url
由于个人数据在输出的时候没有用到javaBean、用的是数组、因此输出的时候、连后面的那一列也一块儿输出了!spa
这样须要判断一下、可是不知道为何、第一页的时候rownum列不会出现、第二页还有后面的页rownum就会跑出来!excel
虽然占时解决了、可是惧怕它哪天不高兴出点什么乱子就老火了!orm