pss项目中的导出xls文件详细流程
上传文件主要使用jxl技术,首先来做一个测试,看看如何使用jxl
代码如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml"})
public class TestDownload {
@Autowired
private IEmployeeService employeeService;
@Test
public void testName() throws Exception {
//下载
//首先创建一个工作簿,参数就是下载之后的xls文件名称
WritableWorkbook workbook = Workbook.createWorkbook(new File("output.xls"));
//xls中有很多sheet,在这里我们创建一个sheet
WritableSheet sheet = workbook.createSheet("First Sheet", 0);
//label表示xls中的一个单元格,里面的三个参数分别代表位置,单元格 //的内容
Label label = new Label(0, 2, "A label record");
//sheet应该添加label
sheet.addCell(label);
//这里的number要注意,不是jdk的Number,是jxt特有的num,要注意 //导包
Number number = new Number(3, 4, 3.1459);
sheet.addCell(number);
workbook.write();
workbook.close();
}
@Test
public void testName2() throws Exception {
//上传
Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));
Sheet[] sheets = workbook.getSheets();
for (Sheet sheet : sheets) {
System.out.println("行的总数:"+sheet.getRows());
System.out.println("列的总数:" + sheet.getColumns());
//i是行,j是列
for (int i = 0; i < sheet.getRows(); i++) {
for (int j = 0; j < sheet.getColumns(); j++) {
Cell cell=sheet.getCell(j, i);
System.out.print(cell.getContents()+"\t");
}
System.out.println();
}
}
workbook.close();
}
下面使用一个Employee模型,里面的属性有:
private Long id;
private String name;
private String password;
private String email;
private Integer age;
private Department department;
使用struts2和jxl,里面要使用service层中的一个方法:
public InputStream exp(String[] heasds, List<String[]> list) throws Exception{
//new一个ByteArrayOutputStream
ByteArrayOutputStream os=new ByteArrayOutputStream();
// String[] heasds 表头
// List<String[]> list String数组
//创建一个xls文件,创建到输出流里面去
WritableWorkbook workbook = Workbook.createWorkbook(os);
//创建Sheet
WritableSheet sheet = workbook.createSheet("First Sheet", 0);
// Label label = new Label(0, 2, "A label record");
// sheet.addCell(label);
//添加表头,i是列,j是行
for (int i = 0; i < heasds.length; i++) {
Label label = new Label(i, 0, heasds[i]);
sheet.addCell(label);
}
//添加表中内容
// List<String[]> list
for (int i = 0; i < list.size(); i++) {
//拿到list中装的每一个String数组,就是每个对象有不同的属性
String [] strings =list.get(i);
for (int j = 0; j < strings.length; j++) {
Label label = new Label(j, i+1, strings[j]);
sheet.addCell(label);
}
}
workbook.write();
workbook.close();
//outputStream是把数据从数据库中拿出来,inputStream是把数据写到excel文件里面去
return new ByteArrayInputStream(os.toByteArray());
}
action中这样使用:
//getFilename,让前台能够拿到
public String getFilename() throws UnsupportedEncodingException {
return new String("员工列表.xls".getBytes("UTF-8"), "ISO8859-1");
}
private String[] heads = { "编号", "用户名", "密码", "email", "年龄", "部门名称" };
public String download() throws Exception{
this.pageList = employeeService.findByQuery(baseQuery);
//pageList里面的rows装的是根据条件查出来的数据
List<Employee> rows = pageList.getRows();
//rows中有两层,list中也有两层
List<String []> list=new ArrayList<String []>();
// 由于要设置employee中的属性,所以用fore
for (Employee employee : rows) {
//这里只有一层,就是list中的第一层
String[] strings = new String[heads.length];
strings[0]=employee.getId().toString();
strings[1]=employee.getName();
strings[2]=employee.getPassword();
strings[3]=employee.getEmail();
strings[4]=employee.getAge().toString();
strings[5]=employee.getDepartment().getName();
list.add(strings);
}
//执行方法并转换
this.inputStream = employeeService.exp(heads, list);
return "stream";
}
struts.xml中的配置是这样的:
<result name="stream" type="stream">
<param name="contentType">application/vnd.ms-excel</param>
<param name="inputName">inputStream</param>
<param name="contentDisposition">filename=${filename}</param>
<param name="bufferSize">4096</param>
</result>
application/vnd.ms-excel参见tomcat中的web.xml,意思是定义文件的类型
${filename}是拿到action中定义的文件名,代码是:
public String getFilename() throws UnsupportedEncodingException {
return new String("员工列表.xls".getBytes("UTF-8"), "ISO8859-1");
}
bufferSize是缓存的意思,这里不关心这个参数
stream是action中返回的String,jxl会根据这个参数进行处理,这里面定义的type会让jxl进行处理,同时也是action中进行转化的原因,代码如下:
//执行方法并转换
this.inputStream = employeeService.exp(heads, list);