jxl导出Excel的方法有很多,但是基本上不能够做到简便灵活,如,只写一个方法就可以实现所有需要导出的数据。除非使用方法反射机制,把对象所有的getxxx()方法遍历出来,取得它返回的值,但是得到的方法数组是无序的。代码如下:
for(int j=0;j<list.size();j++){ Object object = list.get(j); Class class1 = object.getClass();
//方法数组是无序的,这样取出的值就不能够保证与Excel标题一一对应 Method[] methods = class1.getMethods(); //遍历对象的所有方法 int count = 0; for(int k=0;k<methods.length;k++){ Method method = methods[k]; String methodName = method.getName(); // 只处理getXXX方法 if(methodName.startsWith("get")&&!methodName.equals("getClass")){ System.out.println("方法的名字="+methodName); // 调用该方法,invoke方法参数一obj表示对象实例,参数二为该方法的实参,getXXX方法没有参数,故为null,returnValue为getXXX方法的返回值 Object returnValue = method.invoke(object, null); System.out.println(returnValue); String cell = (returnValue==null)?"":returnValue.toString(); Label label = new Label(count, j+2, cell); sheet.addCell(label); sheet.setColumnView(k,25);//设置单元格的宽度 count++; }
这种方法,如果要让方法有序排序还得另外写方法,麻烦。所以打算采用第二种方式:
public static void proExcel(){ Student student1 = new Student(1,"wukailing","1100208131",new Date()); Student student2 = new Student(1,"wukailing","1100208131",new Date()); Student student3 = new Student(1,"wukailing","1100208131",new Date()); List<Student> list = new ArrayList<Student>(); list.add(student1); list.add(student2); list.add(student3); String headers[] = {"学生ID","学生姓名","学号","入学日期"}; try { WritableWorkbook booWorkbook = Workbook.createWorkbook(new File("C:/test2.xls")); WritableSheet sheet = booWorkbook.createSheet("测试用的数据", 0); //添加标题标题 for(int i=0;i<headers.length;i++){ sheet.addCell(new Label(i, 0, headers[i])); } //填充单元格的内容:注意:自己必须清楚知道每一行的每一个单元格的数据类型 for(int j=0;j<list.size();j++){ Student student = (Student)list.get(j); sheet.addCell(new jxl.write.Number (0,j+1,student.getId())); sheet.addCell(new Label(1,j+1,student.getNo())); sheet.addCell(new Label(2,j+1,student.getName())); jxl.write.DateTime labelDT = new jxl.write.DateTime(3, j+1, student.getDate()); sheet.addCell(labelDT); } //写数据、关闭 booWorkbook.write(); booWorkbook.close(); } catch (Exception e) { e.printStackTrace(); } }
种方法非常的简单,缺点就是如果有很多类对象的数据需要导出,我们就得要写很多个方法,没办法了,本人能力有限,只能采用这种方法。
如果在浏览器中导出Excel表,还需要在方法的前面加上下面几句:
WritableWorkbook book = null;
// 通过输出流的方法向浏览器输送数据 HttpServletResponse response = ServletActionContext.getResponse();
// // 这个必须写上,可以写在action的Result中即配置文件中,也可以写在导出数据的方法中 response.setContentType("application/x-msdownload");
// 这里定义了导出Excel文件的文件名称 response.setHeader("Content-Disposition", "attachment;filename=gaiyaedu.xls"); OutputStream out = response.getOutputStream(); // 我们通过输出流来创建一个Workbook,即Excel表 book = Workbook.createWorkbook(out); // 生成名为"学生"的工作表,参数0表示这是第一页 WritableSheet sheet = book.createSheet("订单表", 0);
各位有啥更好导出Excel的办法,欢迎留言指教啦!!