jxl导出Excel

32 篇文章 0 订阅

欢迎技术交流。 QQ:138986722

以前是用Poi做Excel的操作、最近一个项目用jxl来做!现在项目完成了、做做总结!

首先呢、需要的当然是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、"sheet1、sheet2、sheet3"这样
			 * 代码中的"0"就是sheet1、其它的一一对应。
			 * 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", "attachment; 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了!

Object[] repObj = report.queryMaintainUnit(obj,pageInfo);
			String[] strArr = {"流水号","路段名","维护站名","所属系统",
					"故障等级","维护工区","派工时间","维修单位",
					"接修时间","处理结果","维修结果"};
			ExportDate expor = new ExportDate();
			expor.exportexcle_3(response,this.getUrl(),this.getFileName(),
					repObj,"维修单位明细表",strArr);

 

这是查询出来的数据:

 

Excel:

 

 

在加上分页功能过后、数据出了问题、当点击下一页的时候、会多出一列、这一列是Oracle数据库分页时添加的rownum列、1、2、3、4、5、6、这样!

因为我的数据在输出的时候没有用到javaBean、用的是数组、所以输出的时候、连后面的那一列也一起输出了!

这样需要判断一下、但是不知道为什么、第一页的时候rownum列不会出现、第二页还有后面的页rownum就会跑出来!

虽然占时解决了、但是害怕它哪天不高兴出点什么乱子就老火了!





-------------------------------------------

下面在来个直接Servlet的!

/*
	 * Excel文件名
	 */
	private String fileName;
	public String getFileName() {
		this.setFileName("用户信息"+".xls");
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	} 
	
	/*
	 * 文件存储路径
	 */
	private String url;
	public String getUrl(HttpServletRequest request) {
		File f = new File(request.getRealPath("/")+"ExcelData//");
		//如果文件不存在则创建文件夹
		if (!f.exists()) { 
			f.mkdir();
		}
		this.setUrl(request.getRealPath("/")+"ExcelData//");
		return url; 
	}
	public void setUrl(String url) {
		this.url = url;
	}

/**
	 * 导出用户信息
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public void exportBoss_Users(HttpServletRequest request, HttpServletResponse response )throws Exception{
		String productnoId = request.getParameter("productnoId");
		String customnoId = request.getParameter("customno");
		List<UsersInfo> userList = new UsersInfoImpl().findBoss_UsersInfoAll(productnoId, customnoId);
		File file = null;
		PrintWriter out = null;
		try{
			request.setCharacterEncoding("UTF-8");
			response.setContentType("text/html;charset=UTF-8");
			out = response.getWriter();
			file = new File(this.getUrl(request) + this.getFileName());
			WritableWorkbook wwb;   
			wwb = Workbook.createWorkbook(file);
			WritableSheet ws = wwb.createSheet("用户信息Excel", 0);
			String[] columns = {"用户姓名","用户手机","用户性别","所属部门","累计消费值","创建时间","帐号状态"};
			for (int i = 0; i < columns.length; i++) {   
				ws.addCell(new Label(i, 0, columns[i]));  
			}
			for (int i = 0; i < userList.size(); i++) {
				UsersInfo users = userList.get(i);
				ws.addCell(new Label(0, i+1, users.getUsersName()));  
				ws.addCell(new Label(1, i+1, users.getUsersPhone()));
				ws.addCell(new Label(2, i+1, users.getUsersSex())); 
				ws.addCell(new Label(3, i+1, users.getUsersDept()));   
				ws.addCell(new Label(4, i+1, users.getUsersSum())); 
				ws.addCell(new Label(5, i+1, users.getUsersCreatedate())); 
				int num = Integer.parseInt(users.getUsersStatus()+"");
				String stAry = "";
				switch (num) {
        		case 1:
        			stAry = "启用" ;  
        			break;
				case 2: 
					stAry = "禁用" ;     
        			break;
				default:
					stAry = "注销" ;  
					break;
				}
				ws.addCell(new Label(6, i+1, stAry));  
			}
			wwb.write();
			wwb.close();
			BufferedInputStream br = new BufferedInputStream(
					new FileInputStream(file));
			byte[] buf = new byte[1024];
			int len = 0;

			response.reset(); // 非常重要
			response.setContentType("application/x-msdownload");
			response.setHeader("Content-Disposition", "attachment; filename="
					+ new String(file.getName().getBytes(),"iso-8859-1"));  

			OutputStream outStream = response.getOutputStream();
			while ((len = br.read(buf)) > 0)
				outStream.write(buf, 0, len);
			br.close();
			outStream.close();

		}catch(Exception ex){
			ex.printStackTrace();
			out.print("<script>alert('导出用户信息失败、请从试!');</script>");
		}finally{
			if (file.exists()) {//下载完毕删除文件
				file.delete();
			}
			if(out!=null){ 
				out.flush();
				out.close();
			}
		}
	} 

以前用的是UUID文件名、没发现乱码这么一说。

今天导出的时候发现了乱码

什么utf、gbk都是浮云!

直接用:

response.setHeader("Content-Disposition", "attachment; filename="
					+ new String(file.getName().getBytes(),"iso-8859-1")); 
搞定!






 

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUG胡汉三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值