在上一片博客中我用的是freemarker(操作简单),试了很多种方法就是没有把带图片的excel导出来,没办法就换jxl来实现。好了下面就开始进入正题:
第一步:pom.xml中添加jxl的依赖如下:
第二步:把excel模板放到项目中
在这里我要重点说一下,首先我们要把excel另存为2003版的xls,因为jxl只能识别这个版本的,望各位不要中枪,要不然会一直报错说找到不到文件。
第三步:当然就是上代码了,在这里先简单介绍下写入模板的方法和步骤:
(1):读取模板
ServletContext application = request.getSession().getServletContext();
String path = application.getRealPath("template");//通过上下文获取该文件的路径
File file=new File(path+"\\test.xls");
(2):打开excel模板
//它是用来遍历当前模板的信息,如果只是插入可以不定义它,如果获取它的信息则需要
Workbook book = Workbook.getWorkbook(file);
//打开excel模板
File out=new File("buildFile");
WritableWorkbook wwb=Workbook.createWorkbook(out, book);//它是写入excel的一个类
(3)获取你要操作的工作区间
//获取第一个工作区间
WritableSheet sheet=wwb.getSheet(0);
(4)在要输入的单元格中输入数据并定义格式
Sheet seet=book.getSheet(0);
WritableCellFormat format1=new WritableCellFormat(seet.getCell(3, 1).getCellFormat());//获取3列1行的单元格格式
Label lable=new Label(2, 1, (String)datamap.get("username"),format1);//定义2列1行的值和格式
sheet.addCell(lable);//把这一个lable放到当前工作区间
/***********自定义格式****************/
/**********样式设置***************/
WritableFont font= new WritableFont(WritableFont.createFont("宋体"),12,WritableFont.NO_BOLD);
WritableCellFormat cellFormat1 = new WritableCellFormat(font);
cellFormat1.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
cellFormat1.setAlignment(jxl.format.Alignment.CENTRE);//设置文本对其方式,左对齐还是右对齐
/*************************/
NumberFormat nf=new NumberFormat("¥#,##0.00");
WritableCellFormat formatmoney=new WritableCellFormat(font,nf);
jxl.write.Number num = new jxl.write.Number(0,1,123.456,formatmoney); //货币类型
sheet.addCell(num);
(5)导出并关闭
wwb.write();
wwb.close();
(6)客户端下载
// 设置response的编码方式
response.setContentType("application/x-msdownload");
response.setCharacterEncoding("utf-8");
// 设置附加文件名
response.setHeader("Content-Disposition", "attachment;filename="
+ new String(newName.getBytes("utf-8"), "iso-8859-1"));
// 读出文件到i/o流
FileInputStream fis = new FileInputStream(out);
BufferedInputStream buf = new BufferedInputStream(fis);
byte[] b = new byte[1024];// 相当于我们的缓存
long k = 0;// 该值用于计算当前实际下载了多少字节
// 从response对象中得到输出流,准备下载
OutputStream myout = response.getOutputStream();
// 开始循环下载
while (k < out.length()) {
int j = buf.read(b, 0, 1024);
k += j;
// 将b中的数据写到客户端的内存
myout.write(b, 0, j);
}
// 将写入到客户端的内存的数据,刷新到磁盘
myout.flush();
myout.close();
好了这就大功告成了,当然了如果是有货币格式的,通过获取单元格的格式在给它设置是行不同的,¥会变成乱码,所以还是要自定义才可以。至于为什么会出现这种情况,我也想了很多比如在它变成流之前就已经是乱码了,我给他设置了编码但是还是不好使,纠结了半天还是没有结果。。。。效果图如下: