1 package com.tgb.test; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.util.ArrayList; 6 import java.util.List; 7 8 import jxl.Cell; 9 import jxl.Sheet; 10 import jxl.Workbook; 11 import jxl.write.Label; 12 import jxl.write.Number; 13 import jxl.write.WritableImage; 14 import jxl.write.WritableSheet; 15 import jxl.write.WritableWorkbook; 16 import jxl.write.WriteException; 17 18 import org.apache.commons.lang3.math.NumberUtils; 19 import org.junit.Test; 20 //import org.junit.Test; 21 public class JxlDemo { 22 /** 23 * 导入(导入到内存) 24 */ 25 @Test 26 public void importExcel() { 27 Workbook book = null; 28 try { 29 book = Workbook.getWorkbook(new File("D:/test/test.xls")); 30 // 获得第一个工作表对象 31 Sheet sheet = book.getSheet(0); 32 int rows=sheet.getRows(); 33 int columns=sheet.getColumns(); 34 // 遍历每行每列的单元格 35 for(int i=0;i<rows;i++){ 36 for(int j=0;j<columns;j++){ 37 Cell cell = sheet.getCell(j, i); 38 String result = cell.getContents(); 39 if(j==0){ 40 System.out.print("姓名:"+result+" "); 41 } 42 if(j==1){ 43 System.out.print("年龄:"+result+" "); 44 } 45 if((j+1)%2==0){ 46 System.out.println(); 47 } 48 } 49 } 50 System.out.println("========"); 51 // 得到第一列第一行的单元格 52 Cell cell1 = sheet.getCell(0, 0); 53 String result = cell1.getContents(); 54 System.out.println(result); 55 System.out.println("========"); 56 } catch (Exception e) { 57 System.out.println(e); 58 }finally{ 59 if(book!=null){ 60 book.close(); 61 } 62 } 63 } 64 65 /** 66 * 导出(导出到磁盘) 67 */ 68 @Test 69 public void exportExcel() { 70 WritableWorkbook book = null; 71 try { 72 // 打开文件 73 book = Workbook.createWorkbook(new File("D:/test/test.xls")); 74 // 生成名为"学生"的工作表,参数0表示这是第一页 75 WritableSheet sheet = book.createSheet("学生", 0); 76 // 指定单元格位置是第一列第一行(0, 0)以及单元格内容为张三 77 Label label = new Label(0, 0, "张三"); 78 // 将定义好的单元格添加到工作表中 79 sheet.addCell(label); 80 // 保存数字的单元格必须使用Number的完整包路径 81 jxl.write.Number number = new jxl.write.Number(1, 0, 30); 82 sheet.addCell(number); 83 // 写入数据并关闭文件 84 book.write(); 85 } catch (Exception e) { 86 System.out.println(e); 87 }finally{ 88 if(book!=null){ 89 try { 90 book.close(); 91 } catch (Exception e) { 92 e.printStackTrace(); 93 } 94 } 95 } 96 } 97 98 /** 99 * 对象数据写入到Excel 100 */ 101 @Test 102 public void writeExcel() { 103 WritableWorkbook book = null; 104 try { 105 // 打开文件 106 book = Workbook.createWorkbook(new File("D:/test/stu.xls")); 107 // 生成名为"学生"的工作表,参数0表示这是第一页 108 WritableSheet sheet = book.createSheet("学生", 0); 109 110 List<Student> stuList=queryStudentList(); 111 if(stuList!=null && !stuList.isEmpty()){ 112 for(int i=0; i<stuList.size(); i++){ 113 sheet.addCell(new Label(0, i, stuList.get(i).getName())); 114 sheet.addCell(new Number(1, i, stuList.get(i).getAge())); 115 } 116 } 117 118 // 写入数据并关闭文件 119 book.write(); 120 } catch (Exception e) { 121 System.out.println(e); 122 }finally{ 123 if(book!=null){ 124 try { 125 book.close(); 126 } catch (Exception e) { 127 e.printStackTrace(); 128 } 129 } 130 } 131 132 } 133 134 /** 135 * 读取Excel数据到内存 136 */ 137 @Test 138 public void readExcel() { 139 Workbook book = null; 140 try { 141 // 打开文件 142 book = Workbook.getWorkbook(new File("D:/test/stu.xls")); 143 // 获得第一个工作表对象 144 Sheet sheet = book.getSheet(0); 145 int rows=sheet.getRows(); 146 int columns=sheet.getColumns(); 147 List<Student> stuList=new ArrayList<Student>(); 148 // 遍历每行每列的单元格 149 for(int i=0;i<rows;i++){ 150 Student stu = new Student(); 151 for(int j=0;j<columns;j++){ 152 Cell cell = sheet.getCell(j, i); 153 String result = cell.getContents(); 154 if(j==0){ 155 stu.setName(result); 156 } 157 if(j==1){ 158 stu.setAge(NumberUtils.toInt(result)); 159 } 160 if((j+1)%2==0){ 161 stuList.add(stu); 162 stu=null; 163 } 164 } 165 } 166 167 //遍历数据 168 for(Student stu : stuList){ 169 System.out.println(String.format("姓名:%s, 年龄:%s", 170 stu.getName(), stu.getAge())); 171 } 172 173 } catch (Exception e) { 174 System.out.println(e); 175 }finally{ 176 if(book!=null){ 177 try { 178 book.close(); 179 } catch (Exception e) { 180 e.printStackTrace(); 181 } 182 } 183 } 184 185 } 186 187 /** 188 * 图片写入Excel,只支持png图片 189 */ 190 @Test 191 public void writeImg() { 192 WritableWorkbook wwb = null; 193 try { 194 wwb = Workbook.createWorkbook(new File("D:/test/image.xls")); 195 WritableSheet ws = wwb.createSheet("图片", 0); 196 File file = new File("D:\test\png.png"); 197 //前两位是起始格,后两位是图片占多少个格,并非是位置 198 WritableImage image = new WritableImage(1, 4, 6, 18, file); 199 ws.addImage(image); 200 wwb.write(); 201 } catch (Exception e) { 202 e.printStackTrace(); 203 }finally{ 204 if(wwb!=null){ 205 try { 206 wwb.close(); 207 } catch (Exception e) { 208 e.printStackTrace(); 209 } 210 } 211 } 212 } 213 214 private List<Student> queryStudentList(){ 215 List<Student> stuList=new ArrayList<Student>(); 216 stuList.add(new Student("zhangsan", 20)); 217 stuList.add(new Student("lisi", 25)); 218 stuList.add(new Student("wangwu", 30)); 219 return stuList; 220 } 221 222 public class Student { 223 private String name; 224 private int age; 225 226 public Student() { 227 } 228 229 public Student(String name, int age) { 230 super(); 231 this.name = name; 232 this.age = age; 233 } 234 235 public String getName() { 236 return name; 237 } 238 239 public void setName(String name) { 240 this.name = name; 241 } 242 243 public int getAge() { 244 return age; 245 } 246 247 public void setAge(int age) { 248 this.age = age; 249 } 250 } 251 }
以上的代码简单明了的示范了JXL的导入导出功能,具体的导入导出工具类都是在此基础上建立起来的。在最近的项目中出现了一个小问题,就是导出Excel的文件名如果是中文就会出现乱码,所以需要做一些简单的处理,
response.setHeader("Content-disposition", "attachment; filename="+ new String( fileName.getBytes("gb2312"), "ISO8859-1" )+ ".xls");
更加详细健壮的设置如下:
fileName = new String(fileName.getBytes(),"iso-8859-1"); response.setCharacterEncoding("gb2312"); response.reset(); response.setContentType("application/OCTET-STREAM;charset=gb2312"); response.setHeader("pragma", "no-cache"); response.addHeader("Content-Disposition", "attachment;filename="" + fileName + ".xls"");// 点击导出excle按钮时候页面显示的默认名称 workbook = Workbook.createWorkbook(response.getOutputStream());