jxl实现写入excel模板及导出(带图片)

在上一片博客中我用的是freemarker(操作简单),试了很多种方法就是没有把带图片的excel导出来,没办法就换jxl来实现。好了下面就开始进入正题:

第一步:pom.xml中添加jxl的依赖如下:

<!-- jxl通用excel导入导出-->
<dependency> 
<groupId>net.sourceforge.jexcelapi</groupId >
 <artifactId>jxl</artifactId > 
 <version>2.6</version >
 </dependency > 

第二步:把excel模板放到项目中

在这里我要重点说一下,首先我们要把excel另存为2003版的xls,因为jxl只能识别这个版本的,望各位不要中枪,要不然会一直报错说找到不到文件。

jxl实现写入excel模板及导出(带图片)

第三步:当然就是上代码了,在这里先简单介绍下写入模板的方法和步骤:

(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();

好了这就大功告成了,当然了如果是有货币格式的,通过获取单元格的格式在给它设置是行不同的,¥会变成乱码,所以还是要自定义才可以。至于为什么会出现这种情况,我也想了很多比如在它变成流之前就已经是乱码了,我给他设置了编码但是还是不好使,纠结了半天还是没有结果。。。。效果图如下:

jxl实现写入excel模板及导出(带图片)