Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 914|回复: 0

java jsp JXL调用模版导出Excel

[复制链接]

该用户从未签到

发表于 2011-7-31 21:42:01 | 显示全部楼层 |阅读模式
前阵子接到一个项目,其中有个功能就需要把数据填充到 绘制好的EXCEL表单里面,在网上搜集了一些东西之后就开始做了,呵呵。

*********************************************先看看转载的这部门*************************************************************

java操纵Excel之理解JXL--读取Excel 说到如何用JXL读取Excel文件,
现在来看看如何读取Excel模板然后把动态数据写入到模板以天生特定格局的Excel。
同样的思路,先来考虑下会涉及到那些对象,和上篇文章读取比拟这里涉及到一个写入的步骤,所以JXL必定会提供一个对象
来支持写入,这就是WritableWorkbook。那么如何得到到这个类的实例,查看APIDoc发现Workbook类提供了几个
静态的createWorkbook方法返回WritableWorkbook实例,可以看到众多createWorkbook方法主要分为两类:一个参数
和两个参数。简朴分析可以得知前者仅仅是用来直接天生Excel文件,后者先读取模板再向模板写入数据然后天生Excel。
(还有一个三参数方法加上一个用来设置workbook的参数)
现在按照上篇文章中所讲述的流程来看看读取模板并写入需要那些步骤。

第一步:选择模板文件:
Workbook wb = Workbook.getWorkbook(new File(realpath));

第二步:通过模板得到一个可写的Workbook:
WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
第一个参数是一个输出流对象,好比可以
ByteArrayOutputStream targetFile = new ByteArrayOutputStream();
这样定义这个输出流对象。第二个参数代表了要读取的模板。


第三步:选择模板中名称为StateResult的Sheet:
WritableSheet wws = wwb.getSheet("StateResult");
假如需要也可以创建Sheet
WritableSheet wws = wwb.createSheet("Sheet名称",i);


第四步:选择单元格,写入动态值,根据单元格的不同类型转换成相应类型的单元格:
Label A1 = (Label)wws.getWritableCell(0,0);
A1.setString("单元格内容")

Number A2 = (Number)wws.getWritableCell(0,1);//Number是jxl.write.Number
A2.setValue(3.3);
也可以创建新的单元格并且加入到Sheet中
Label C1 = new Label(2,0,"单元格内容");
wws.addCell(C1);

Number C1 = new Number(2,0,3.3);
wws.addCell(C1);

在天生Excel报表的时候还会碰到一种需求就是数据的格局题目,我们可能但愿数值型单元格以某种格局显示,而字符串型单元格以另

一种格局显示。这些可以通过WritableFont、NumberFormat、WritableCellFormat等实现,下例给单元格A1、A2添加了不同的格局。

java 代码





    WritableFont font= new WritableFont(WritableFont.createFont("宋体"),10,WritableFont.NO_BOLD);   

      NumberFormat format = new NumberFormat("###,##0.00"); //NumberFormat是jxl.write.NumberFormat   

        WritableCellFormat cellFormat1 = new WritableCellFormat(font,format);   

          WritableCellFormat cellFormat2 = new WritableCellFormat(font);   

            cellFormat1.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border   

              cellFormat2.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border   

                A2.setCellFormat(cellFormat1);   

                  [li]A1.setCellFormat(cellFormat2);   [/li]
                [/li]
              [/li]
            [/li]
          [/li]
        [/li]
      [/li]
    [/li]


还有不要健忘封闭WritableWorkbook和Workbook以开释资源:
wwb.close();
wb.close();

最后就可以你需要的方式从输出流targetFile中取得Excel,好比直接天生文件存本地,输出到客户端浏览器等。

假如还有其他需求,按照这种思路,再参照APIDoc相信可以很轻易的解决。

至此,Java操纵Excel之理解JXL就写完了。

***********************************************************************************************************************************



在这里说说两种表单格局,第一种只需把数据填充就行了,第二种是轮回输出数据。

第一种表单如下:







//选择模板文件:
     String realpath = "D:/download/test.xls";
   try{
   Workbook wb = Workbook.getWorkbook(new File(realpath));
   //第二步:通过模板得到一个可写的Workbook:第一个参数是一个输出流对象,第二个参数代表了要读取的模板
   File targetFile = new File("D:/download/test1.xls");
   WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
   //第三步:选择模板中名称为StateResult的Sheet:
   WritableSheet wws = wwb.getSheet(4);
//   假如需要也可以创建Sheet
//   WritableSheet wws = wwb.createSheet("Sheet名称",1);
   //第四步:选择单元格,写入动态值,根据单元格的不同类型转换成相应类型的单元格:
   //(列,行)
   Label A1 = (Label)wws.getWritableCell(0,0);
   A1.setString("         2009年 7 月****出单中央####公司结算表");
   WritableFont font= new WritableFont(WritableFont.createFont("宋体"),18,WritableFont.BOLD);
   WritableCellFormat cellFormat1 = new WritableCellFormat(font);     
   cellFormat1.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
   cellFormat1.setBackground(Colour.BLUE);//设置单元格背景颜色为天蓝色
   cellFormat1.setAlignment(jxl.format.Alignment.CENTRE);//设置文本对其方式,左对齐仍是右对齐
   A1.setCellFormat(cellFormat1);
  
   Label A2 = (Label)wws.getWritableCell(0,1);
   A2.setString("结算日期:2009年 7月7日 至 2009年 7月31日");
   WritableFont font2= new WritableFont(WritableFont.createFont("宋体"),12,WritableFont.BOLD);
   WritableCellFormat cellFormat2 = new WritableCellFormat(font2);     
   cellFormat2.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
   cellFormat2.setBackground(Colour.BLUE);//设置单元格背景颜色为天蓝色
   cellFormat2.setAlignment(jxl.format.Alignment.RIGHT);//设置文本对其方式,左对齐仍是右对齐
   A2.setCellFormat(cellFormat2);
  
   /********************************public*****************************/
   jxl.write.NumberFormat format = new jxl.write.NumberFormat("#");
   jxl.write.WritableCellFormat wcf = new jxl.write.WritableCellFormat(format);
   WritableFont fonte= new WritableFont(WritableFont.createFont("宋体"),12,WritableFont.NO_BOLD);
   WritableCellFormat cellFormat= new WritableCellFormat(fonte,format);     
   cellFormat.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); //Border是jxl.format.Border
   cellFormat.setAlignment(jxl.format.Alignment.CENTRE);//设置文本对其方式,左对齐仍是右对齐
   /********************************public*****************************/
  
  
   /********************************保单出产明细*****************************/
   //份数
   jxl.write.Number C4 = new jxl.write.Number(2,3,bean.getPieces(),wcf);  
   wws.addCell(C4);
   C4.setCellFormat(cellFormat);
  
   //保单总印量
   jxl.write.Number C5 = new jxl.write.Number(2,4,bean.getAllprintnum(),wcf);  
   wws.addCell(C5);
   C5.setCellFormat(cellFormat);

   //.................以此类推  


   wwb.write();
   wwb.close();
   wb.close();
      }catch(Exception e){
   e.printStackTrace();
      }
   }



第二种表单如下:



轮回一个月内 天天的记实,前面是写死的填充数据,现在是轮回输出,也很简朴,写个FOR轮回就OK,封闭WritableWorkbook和Workbook开释资源 要放在FOR轮回之外,方法如下:

/**
* 月报表导出EXCEL
*
* 轮回输出的地方要采用新建单元格并且加入到Sheet的方式来实现
*
*/
public void reportMonthJXLWriteExcel(List list, List list2)
    throws Exception {
   // 选择模板文件:
   String realpath = "D:/download/test.xls";
   try {
    Workbook wb = Workbook.getWorkbook(new File(realpath));
    // 第二步:通过模板得到一个可写的Workbook:第一个参数是一个输出流对象,第二个参数代表了要读取的模板
    File targetFile = new File("D:/download/test1.xls");
    WritableWorkbook wwb = Workbook.createWorkbook(targetFile, wb);
    // 第三步:选择模板中名称为StateResult的Sheet:
    WritableSheet wws = wwb.getSheet(3);
    // 第四步:选择单元格,写入动态值,根据单元格的不同类型转换成相应类型的单元格:
    // (列,行)
    Label A1 = (Label) wws.getWritableCell(0, 0);
    A1.setString("2007年07月16日湖南出单中央长沙分公司出产月明细表");
    WritableFont font = new WritableFont(WritableFont.createFont("宋体"),
      18, WritableFont.BOLD);
    WritableCellFormat cellFormat1 = new WritableCellFormat(font);
    cellFormat1.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); // Border是jxl.format.Border
    cellFormat1.setBackground(Colour.BLUE);// 设置单元格背景颜色为天蓝色
    cellFormat1.setAlignment(jxl.format.Alignment.CENTRE);// 设置文本对其方式,左对齐仍是右对齐
    A1.setCellFormat(cellFormat1);

    /** ******************************public**************************** */
    jxl.write.NumberFormat format = new jxl.write.NumberFormat("#");
    jxl.write.WritableCellFormat wcf = new jxl.write.WritableCellFormat(
      format);
    WritableFont fonte = new WritableFont(
      WritableFont.createFont("宋体"), 10, WritableFont.NO_BOLD);
    WritableCellFormat cellFormat = new WritableCellFormat(fonte,
      format);
    cellFormat.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); // Border是jxl.format.Border
    cellFormat.setAlignment(jxl.format.Alignment.CENTRE);// 设置文本对其方式,左对齐仍是右对齐
    for (int c = 0; c < 18; c++) {
     wws.setColumnView(c, 8);// 给每列设置宽度
    }

    /** ******************************public**************************** */

    int i = 0, j = 0;// i=描述单元格,j=获取JAVA BEAN对象
    for (i = 3, j = 0; i < list.size() + 3 && j < list.size(); i++, j++) {
     ReportDayBean bean = (ReportDayBean) list.get(j);

     Label A4 = new Label(0, i, bean.getBusitime());
     wws.addCell(A4);
     WritableFont font2 = new WritableFont(WritableFont
       .createFont("宋体"), 10, WritableFont.NO_BOLD);
     WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
     cellFormat2.setBorder(Border.ALL,
       jxl.format.BorderLineStyle.THIN); // Border是jxl.format.Border
     cellFormat2.setAlignment(jxl.format.Alignment.CENTRE);// 设置文本对其方式,左对齐仍是右对齐
     A4.setCellFormat(cellFormat2);

     // 份数
     jxl.write.Number B4 = new jxl.write.Number(1, i, bean
       .getPieces(), wcf);
     wws.addCell(B4);
     B4.setCellFormat(cellFormat);

     // 总印量
     jxl.write.Number C4 = new jxl.write.Number(2, i, bean
       .getAllprintnum(), wcf);
     wws.addCell(C4);
     C4.setCellFormat(cellFormat);

     // 超印量
     jxl.write.Number D4 = new jxl.write.Number(3, i, bean
       .getOverprintnum(), wcf);
     wws.addCell(D4);
     D4.setCellFormat(cellFormat);

     // 清单印量
     jxl.write.Number E4 = new jxl.write.Number(4, i, bean
       .getListprintnum(), wcf);
     wws.addCell(E4);
     E4.setCellFormat(cellFormat);
     // A4纸
     jxl.write.Number F4 = new jxl.write.Number(5, i, bean
       .getPaper(), wcf);
     wws.addCell(F4);
     F4.setCellFormat(cellFormat);

     // 份数
     jxl.write.Number G4 = new jxl.write.Number(6, i, bean
       .getZ_pieces(), wcf);
     wws.addCell(G4);
     G4.setCellFormat(cellFormat);
     // 印量
     jxl.write.Number H4 = new jxl.write.Number(7, i, bean
       .getZ_printnum(), wcf);
     wws.addCell(H4);
     H4.setCellFormat(cellFormat);
     // 用纸
     jxl.write.Number I4 = new jxl.write.Number(8, i, bean
       .getZ_paper(), wcf);
     wws.addCell(I4);
     I4.setCellFormat(cellFormat);
     // 本埠信函
     jxl.write.Number J4 = new jxl.write.Number(9, i, bean
       .getLocal(), wcf);
     wws.addCell(J4);
     J4.setCellFormat(cellFormat);
     // 外地信函
     jxl.write.Number K4 = new jxl.write.Number(10, i, bean
       .getForeign(), wcf);
     wws.addCell(K4);
     K4.setCellFormat(cellFormat);
     // 印量
     jxl.write.Number L4 = new jxl.write.Number(11, i, bean
       .getPrintnum(), wcf);
     wws.addCell(L4);
     L4.setCellFormat(cellFormat);
     // 预印用纸
     jxl.write.Number M4 = new jxl.write.Number(12, i, bean
       .getPrepaper(), wcf);
     wws.addCell(M4);
     M4.setCellFormat(cellFormat);
     // 空缺用纸
     jxl.write.Number N4 = new jxl.write.Number(13, i, bean
       .getBlankpaper(), wcf);
     wws.addCell(N4);
     N4.setCellFormat(cellFormat);
     // 信封
     jxl.write.Number O4 = new jxl.write.Number(14, i, bean
       .getEnvelope(), wcf);
     wws.addCell(O4);
     O4.setCellFormat(cellFormat);
     // 装订份数
     jxl.write.Number P4 = new jxl.write.Number(15, i, bean
       .getQ_pieces(), wcf);
     wws.addCell(P4);
     P4.setCellFormat(cellFormat);
     // 印量
     jxl.write.Number Q4 = new jxl.write.Number(16, i, bean
       .getQ_printnum(), wcf);
     wws.addCell(Q4);
     Q4.setCellFormat(cellFormat);
     // A4纸
     jxl.write.Number R4 = new jxl.write.Number(17, i, bean
       .getQ_paper(), wcf);
     wws.addCell(R4);
     R4.setCellFormat(cellFormat);

    }

    System.out.println("iiiiiiiiiiii=" + i);
    ReportDayBean bean = (ReportDayBean) list2.get(0);

    Label A4 = new Label(0, i, "小计");
    wws.addCell(A4);
    WritableFont font2 = new WritableFont(
      WritableFont.createFont("宋体"), 12, WritableFont.NO_BOLD);
    WritableCellFormat cellFormat2 = new WritableCellFormat(font2);
    cellFormat2.setBorder(Border.ALL, jxl.format.BorderLineStyle.THIN); // Border是jxl.format.Border
    cellFormat2.setAlignment(jxl.format.Alignment.CENTRE);// 设置文本对其方式,左对齐仍是右对齐
    A4.setCellFormat(cellFormat2);

    // 份数
    jxl.write.Number B4 = new jxl.write.Number(1, i, bean.getPieces(),
      wcf);
    wws.addCell(B4);
    B4.setCellFormat(cellFormat);

    // 总印量
    jxl.write.Number C4 = new jxl.write.Number(2, i, bean
      .getAllprintnum(), wcf);
    wws.addCell(C4);
    C4.setCellFormat(cellFormat);

    // 超印量
    jxl.write.Number D4 = new jxl.write.Number(3, i, bean
      .getOverprintnum(), wcf);
    wws.addCell(D4);
    D4.setCellFormat(cellFormat);

    // 清单印量
    jxl.write.Number E4 = new jxl.write.Number(4, i, bean
      .getListprintnum(), wcf);
    wws.addCell(E4);
    E4.setCellFormat(cellFormat);
    // A4纸
    jxl.write.Number F4 = new jxl.write.Number(5, i, bean.getPaper(),
      wcf);
    wws.addCell(F4);
    F4.setCellFormat(cellFormat);

    // 份数
    jxl.write.Number G4 = new jxl.write.Number(6, i,
      bean.getZ_pieces(), wcf);
    wws.addCell(G4);
    G4.setCellFormat(cellFormat);
    // 印量
    jxl.write.Number H4 = new jxl.write.Number(7, i, bean
      .getZ_printnum(), wcf);
    wws.addCell(H4);
    H4.setCellFormat(cellFormat);
    // 用纸
    jxl.write.Number I4 = new jxl.write.Number(8, i, bean.getZ_paper(),
      wcf);
    wws.addCell(I4);
    I4.setCellFormat(cellFormat);
    // 本埠信函
    jxl.write.Number J4 = new jxl.write.Number(9, i, bean.getLocal(),
      wcf);
    wws.addCell(J4);
    J4.setCellFormat(cellFormat);
    // 外地信函
    jxl.write.Number K4 = new jxl.write.Number(10, i,
      bean.getForeign(), wcf);
    wws.addCell(K4);
    K4.setCellFormat(cellFormat);
    // 印量
    jxl.write.Number L4 = new jxl.write.Number(11, i, bean
      .getPrintnum(), wcf);
    wws.addCell(L4);
    L4.setCellFormat(cellFormat);
    // 预印用纸
    jxl.write.Number M4 = new jxl.write.Number(12, i, bean
      .getPrepaper(), wcf);
    wws.addCell(M4);
    M4.setCellFormat(cellFormat);
    // 空缺用纸
    jxl.write.Number N4 = new jxl.write.Number(13, i, bean
      .getBlankpaper(), wcf);
    wws.addCell(N4);
    N4.setCellFormat(cellFormat);
    // 信封
    jxl.write.Number O4 = new jxl.write.Number(14, i, bean
      .getEnvelope(), wcf);
    wws.addCell(O4);
    O4.setCellFormat(cellFormat);
    // 装订份数
    jxl.write.Number P4 = new jxl.write.Number(15, i, bean
      .getQ_pieces(), wcf);
    wws.addCell(P4);
    P4.setCellFormat(cellFormat);
    // 印量
    jxl.write.Number Q4 = new jxl.write.Number(16, i, bean
      .getQ_printnum(), wcf);
    wws.addCell(Q4);
    Q4.setCellFormat(cellFormat);
    // A4纸
    jxl.write.Number R4 = new jxl.write.Number(17, i,
      bean.getQ_paper(), wcf);
    wws.addCell(R4);
    R4.setCellFormat(cellFormat);

    int k = i + 2;// 这里是空一行再写入制表人,审核人......
    wws.mergeCells(4, k, 17, k);
    Label E14 = new Label(
      4,
      k,
      "制表人:              审核人:                机构负责人:                机构财务部负责人:            ");
    wws.addCell(E14);
    WritableCellFormat cellFormatinfo = new WritableCellFormat(font2);
    cellFormatinfo.setBorder(Border.ALL,
      jxl.format.BorderLineStyle.NONE); // Border是jxl.format.Border
    cellFormatinfo.setAlignment(jxl.format.Alignment.LEFT);// 设置文本对其方式,左对齐仍是右对齐
    E14.setCellFormat(cellFormatinfo);

    wwb.write();
    wwb.close();
    wb.close();
   } catch (Exception e) {
   }

}
回复

使用道具 举报

  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2011-7-31 22:28:51 | 显示全部楼层
    谢谢楼主分享。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2011-9-21 15:52:24 | 显示全部楼层
    谢谢楼主分享啊。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-17 14:18 , Processed in 0.389366 second(s), 45 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表