测验合营标准:
数码总的数量为110011条,每条数据条数为十多少个字段。
计算机配置为:P4 2.67GHz,1G内部存款和储蓄器。

此随笔出自:<a href=”; [happyljw]</a>

用过POI的人都精通,在POI早前的版本中并不支持大数据量的管理,假诺数据量过多还可能会常报OOM错误,

那时候调度JVM的布置参数
亦不是一个好机关(注:
jdk在32人系统中帮衬的内存不能够超过2个G,而在六十位中并未有节制,不过在61位的体系中,质量实际不是太好
),万幸POI3.8版本新出来了一个SXSSFWorkbook对象,它正是用来缓和大数据量以致异常的大数据量的导入导出操作的,然则SXSSFWorkbook只帮忙.xlsx格式,不帮衬.xls格式的Excel文件。

此地分布一下,在POI中动用HSSF对象时,excel
二零零二最三只同意存6553数目,日常用来管理非常少的数据量,这时候对于百万等级数据,Excel分明
容纳不了,并且在计算机质量稍低的机器上测量检验,就超轻便形成堆溢出。当笔者升级到XSSF对象时,它能够直接扶持excel2005之上版本,因为它采用
ooxml格式。那时候excel能够扶植1048576条数据,单个sheet表就帮助近104
万条数据了,即便当时导出100万数量能知足要求,但接受XSSF测量检验后开掘不经常照旧会生出堆溢出,所以也不切合百万数码的导出。今后我们知道excel2005及以上版本能够轻易完成有储百万级其他数额,但是系统中的大批量数据是什么样能够赶快正确的导入到excel中那就好疑似个难点,对于日常的web系统,大家为了减轻资金,基本都以使用的入门级web服务器tomcat,既然大家不引入调解JVM的分寸,那大家将要本着大家的代码来缓慢解决大家要化解的主题素材。在POI3.8过后新增了一个类,
SXSSFWorkbook
,采纳当数码加工作时间不是看似前面版本的目的,它可以调节excel数据占用的内部存款和储蓄器,他经过操纵在内部存款和储蓄器中的行数来达成财富管理,即当创设对象超越了设定的行数,它会活动刷新内部存款和储蓄器,将数据写入文件,
如此那般变成打字与印刷时,占用的CPU,和内部存款和储蓄器少之又少。但有人会说了,我用过这么些类呀,他近乎并不可能完全化解,当数据量超过一定量后依旧会内部存款和储蓄器溢出的,何况时间还相当长。对你只是用了那么些类,可是你并未照准你的必要进行相应的设计,仅仅是用了,所以接下去本身要说的主题素材就算,如何通过SXSSFWorkbook以至对应的写入设计来实现百万等级的数目火速写入。

本身先举个例证,以前我们[数据库
中留存大气的多寡,大家要查询,如何做?大家在并没有通过规划的时候是那般来管理的,先写二个集合,然后施行jdbc,将重回的结果赋值给list,然后再回来到页面上,然则当数据量大的时候,就能并发数量不能够赶回,内部存款和储蓄器溢出的气象,于是大家在简单的时光和空中下,通过分页将数据风华正茂页豆蔻梢头页的显得出来,那样可避防止了[大数据
量多少对内部存款和储蓄器的据有,也加强了客户的心得,在大家要导出的百万数量也是七个道理,内部存款和储蓄器突发性占用,大家得以界定导出数据所攻下的内部存储器,
此处笔者先创制八个list容器,list中开发10000行的寄放空间,每一遍存款和储蓄10000行,用完了将内容清空,然后重新使用
,那样就能够使得调节内部存款和储蓄器,所以大家的布署思路就基本产生了,所以分页数据导出共有以下3个步骤:

1、求数据库中待导出数据的行数

2、依据行数求数量提取次数

3、按次数将数据写入文件

由此上述步骤在功用和客户体验性上都有了极高的巩固,接下去上代码

public void exportBigDataExcel(ValueDataDto valueDataDto, String path)
            throws IOException {
    // 最重要的就是使用SXSSFWorkbook,表示流的方式进行操作
    // 在内存中保持100行,超过100行将被刷新到磁盘
    SXSSFWorkbook wb = new SXSSFWorkbook(100);
    Sheet sh = wb.createSheet(); // 建立新的sheet对象
    Row row = sh.createRow(0);   // 创建第一行对象
    // -----------定义表头-----------
    Cell cel0 = row.createCell(0);
    cel0.setCellValue("1");
    Cell cel2 = row.createCell(1);
    cel2.setCellValue("2");
    Cell cel3 = row.createCell(2);
    cel3.setCellValue("3");
    Cell cel4 = row.createCell(3);
    // ---------------------------
    List<valuedatabean> list = new ArrayList<valuedatabean>();
    // 数据库中存储的数据行
    int page_size = 10000;
    // 求数据库中待导出数据的行数
    int list_count = this.daoUtils.queryListCount(this.valueDataDao
            .queryExportSQL(valueDataDto).get("count_sql"));
    // 根据行数求数据提取次数
    int export_times = list_count % page_size > 0 ? list_count / page_size
            + 1 : list_count / page_size;
    // 按次数将数据写入文件
    for (int j = 0; j < export_times; j++) {
        list = this.valueDataDao.queryPageList(this.valueDataDao
                .queryExportSQL(valueDataDto).get("list_sql"), j + 1,
                page_size);
        int len = list.size() < page_size ? list.size() : page_size;

到目前
早就能够兑现百万数目标导出了,不过当我们的事体数据超越200万,300万了吧?怎么样清除?
这个时候,直接打字与印刷数据到贰个专门的工作簿的三个职业表是落实持续的,必需拆分到多少个工作表,也许多少个工作簿中工夫兑现。因为多个sheet最多行数1048576
。上面就以这种思路提供其余后生可畏种缓和方案,直接上代码(前边会附着测验数据库,及案例须要的jar包)

public static void main(String[] args) throws Exception {
    Test3SXXFS tm = new Test3SXXFS();
    tm.jdbcex(true);
}
public void jdbcex(boolean isClose) throws InstantiationException, IllegalAccessException, 
            ClassNotFoundException, SQLException, IOException, InterruptedException {

    String xlsFile = "f:/poiSXXFSBigData.xlsx";     //输出文件
    //内存中只创建100个对象,写临时文件,当超过100条,就将内存中不用的对象释放。
    Workbook wb = new SXSSFWorkbook(100);           //关键语句
    Sheet sheet = null;     //工作表对象
    Row nRow = null;        //行对象
    Cell nCell = null;      //列对象

    //使用jdbc链接数据库
    Class.forName("com.mysql.jdbc.Driver").newInstance();  
    String url = "jdbc:mysql://localhost:3306/bigdata?characterEncoding=UTF-8";
    String user = "root";
    String password = "123456";
    //获取数据库连接
    Connection conn = DriverManager.getConnection(url, user,password);   
    Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);   
    String sql = "select * from hpa_normal_tissue limit 1000000";   //100万测试数据
    ResultSet rs = stmt.executeQuery(sql);  

    ResultSetMetaData rsmd = rs.getMetaData();
    long  startTime = System.currentTimeMillis();   //开始时间
    System.out.println("strat execute time: " + startTime);

    int rowNo = 0;      //总行号
    int pageRowNo = 0;  //页行号

    while(rs.next()) {
        //打印300000条后切换到下个工作表,可根据需要自行拓展,2百万,3百万...数据一样操作,只要不超过1048576就可以
        if(rowNo%300000==0){
            System.out.println("Current Sheet:" + rowNo/300000);
            sheet = wb.createSheet("我的第"+(rowNo/300000)+"个工作簿");//建立新的sheet对象
            sheet = wb.getSheetAt(rowNo/300000);        //动态指定当前的工作表
            pageRowNo = 0;      //每当新建了工作表就将当前工作表的行号重置为0
        }   
        rowNo++;
        nRow = sheet.createRow(pageRowNo++);    //新建行对象

        // 打印每行,每行有6列数据   rsmd.getColumnCount()==6 --- 列属性的个数
        for(int j=0;j<rsmd.getColumnCount();j++){
            nCell = nRow.createCell(j);
            nCell.setCellValue(rs.getString(j+1));
        }

        if(rowNo%10000==0){
            System.out.println("row no: " + rowNo);
        }
//      Thread.sleep(1);    //休息一下,防止对CPU占用,其实影响不大
    }

    long finishedTime = System.currentTimeMillis(); //处理完成时间
    System.out.println("finished execute  time: " + (finishedTime - startTime)/1000 + "m");

    FileOutputStream fOut = new FileOutputStream(xlsFile);
    wb.write(fOut);
    fOut.flush();       //刷新缓冲区
    fOut.close();

    long stopTime = System.currentTimeMillis();     //写文件时间
    System.out.println("write xlsx file time: " + (stopTime - startTime)/1000 + "m");

    if(isClose){
        this.close(rs, stmt, conn);
    }
}

//执行关闭流的操作
private void close(ResultSet rs, Statement stmt, Connection conn ) throws SQLException{
    rs.close();   
    stmt.close();   
    conn.close(); 
}

在平时应用程序中,对office和pdf文书档案实行读取数据是比较宽泛的效果,特别在广大web应用程序中。所早先不久大家就大概来看一下Java对word、excel、pdf文件的读取。本篇博客只是讲明轻松利用。如若想深刻通晓原理。请读者自行钻研一些连锁源码。

一、POI、JXL、FastExcel比较
POI、JXL、法斯特Excel均为java第三方开源导出Excel的开源项目。

 

导出方案风度翩翩:叁回性全体导出到三个Excel文件中。
实质上情状均报OutOfMemery错误,以下数据为报OutOfMemery数据时,数据到的最大数据数目,如表1所示:
表1:报OutOfMemery错误时所能管理的数据量
                                    FastExecl POI    JXL
10000数据/sheet          37465     28996 42270
5000数据/sheet             39096     31487 46270
3000数据/sheet             39000 32493 47860
小结:
多分sheet能自然水平上裁减内部存储器的选拔,可是均因为程序中开创的Cell(即为Excel中的多少个单元格)无法自由,消耗大量内部存储器,招致OutOfMemery错误;JXL表现最棒,创建Cell内部存储器使用少之甚少。

第朝气蓬勃我们来认识一下读取相关文书档案的jar包:

导出方案二:先分多少个Excel文件将数据总体导出,然后对五个Excel文件实行统风度翩翩。
首先,测验将全部数码导出所用的光阴,如表2所示,数据均测量试验二次取平均。
表2:导出全部数量所用时间
                              FastExecl POI JXL
10000数据/文件          68s       33s 30s
5000数据/文件             68s       32s 33s
3000数据/文件             59s       33s 39s
小结:
均成功导出Excel文件,原因是导出叁个Excel文件,释放所攻陷的创始Cell的内部存款和储蓄器。
FastExecl展现最差,POI表现平稳,JXL随着数据的附加,速度自然水平上增快。

 

接下来,进行整合,由于将多Excel归总成八个Excel文件的功效独有POI全数,故使用POI测量检验,结果如表3所示。
注:数据量大合併还有大概会报OutOfMemery错误,故合併总的数量据量以5万为准。
表3:合併5万多少所用时间
时间
10000数据/文件 11s
5000数据/文件 11s
3000数据/文件 11s
小结:
行使POI对文本进行联合速度异常的快,但有数据量的限定。

1. 引用POI包读取word文书档案内容

计算:方案二相比灵通,不过数据量有限定,为5万条。

poi.jar 下载地址

二、导出XML 的电子钟格
导出的格式肖似为纯文本,能促成大数据量的蕴藏,并能达成分Sheet查看,且能增加简单的体裁,相符项目必要。经实际测验Excel2004和Excel2005均能鉴定分别并常常展开查看。使用时间测量试验如表4所示,数据均测验3次取平均。
表4:生成全部数量所用时间
                                  时间
10000数据/sheet    28.0秒
20000数据/sheet    30.1秒
30000数据/sheet    28.1秒
40000数据/sheet    26.5秒
50000数据/sheet    28.2秒
55000数据/sheet    26.8秒
59000数据/sheet    30.1秒
59500数码/sheet    产生假死机现象
60000多少/sheet    发生假死机现象

 
 

不过导出的多少为XML不是纠正的Excel文件,如使用Excel文件的xls后缀保存,打开文件会弹出警告,但不影响阅读。
且经实际测量试验,在Access二零零七和Access贰零零壹中可经过导入外界数据的情势,将导出的XML导入进Access数据库。

 

三、总结
项目供给是大数据量导出Excel文件,POI、JXL、FastExcel无法完全满意需要;使用XML
的石英钟格导出达成了大数据量导出,不过格式为XML不是正面包车型客车Excel文件,为曲线救国。二种导出方式的可比,如表5所示。
表5:归总5万数据所用时间
                           POI、JXL、FastExcel    XML 的电子钟格
导出数据格式                 为纯Execl文件                为XML文件
导出数据量                         小                            一点都不小
能否分Sheet                      能                            能
可不可以加多样式                      能                            能
是不是增多图片                      POI 能                      不能够
导出数据是还是不是导入Access       能                            能

2.引用jxl包读取excel文书档案的内容

最早的小说链接:

Jxl.jar下载地址

tidus2005 写道

biguan 写道

 

本人同事近来要把1000万条记下从数据库导到excel里,在自己的援救下解决了。
呵呵。原创的。
因各类excel最多放5万条,所以他把那1000万条记下记录停放了200个excel文件里。用时40分钟。
采纳基本的jdbc技巧+io流。
1.出头露面三个excel文件。填上要的表头和两条记下。然后另存为网页a.html。
2.用记事本展开网页a.html,就看出源代码。把源代码分成三有个别:头+记录行+尾。
3.用jdbc访问数据库,循环遍历,每5万条,用io流写文件,格式为”xxx.xls”。
a.html的头代码+记录行代码(已经被5万条替换)+尾代码。

3.援引PDFBox读取pdf文书档案的从头到尾的经过

不曾看太懂你的意思, 用html是干什么?

Pdfbox.jar下载地址

用java的io写txt格式的文本,大家都会吧?

 
 

实在,也足以用java的io写xls格式的文本的。关键是您得按一定的excel文件格式写,技能确定保障生成的是excel文件。

Fontbox.jar下载地址

其生机勃勃格式如何得到呢?方法是这么:

 
 

您先建三个excel文件,如a.xls。填上两条伪数据。然后另存为网页,即htm格式,如a.htm。

Jempbox.jar下载地址

接下来,用记事本打开htm格式的a.htm,这样excel文件格式代码就洞穿在您后边。

 
 

余下的事,呵呵,就是把a.htm源代码的伪数据部分,替成数据库里的多寡,然后把替换后的方方面面a.htm源代码,用java的io写成一个后缀为xls的文件。就打完收工了。

上面大家就来轻松看一下这一个jar包的对文书档案的读取的利用实例:

瞩目:为了不给内部存款和储蓄器扩大压力,要把a.htm源代码分成三有些:头(伪数据部分
前的代码) + 伪数据部分 + 尾(伪数据部分 后的代码)。
先把 头 写到文件,并flush。然后是 伪数据部分
,替一条数据Curry的记录就写到文件里,并flush。最终把 尾
写到文件,并flush。

 

等本身实现了第二的法门,把代码贴出来。

1. 援引POI包读取word文书档案内容

再有另三个篇章
供仿照效法

 

  1. import java.io.File;     
  2. import java.io.FileInputStream;     
  3. import org.apache.poi.hwpf.HWPFDocument;     
  4. import org.apache.poi.hwpf.usermodel.Range;     
  5.   
  6. /**  
  7. *  
  8. * @author 曹胜欢 
  9. */   
  10. public class DocFile{     
  11.   
  12.   
  13.     @Override   
  14.     public String getContent(File f) throws Exception {     
  15.         FileInputStream fis = new FileInputStream(f);     
  16.         HWPFDocument doc = new HWPFDocument(fis);     
  17.         Range rang = doc.getRange();     
  18.         String text = rang.text();     
  19.         fis.close();     
  20.         return text;     
  21.     }     

2.引用jxl包读取excel文档的情节

 

  1. import java.io.File;     
  2. import java.io.FileInputStream;     
  3. import jxl.Cell;     
  4. import jxl.Sheet;     
  5. import jxl.Workbook;     
  6.   
  7. /**  
  8. *  
  9. * @author 曹胜欢 
  10. */   
  11. public class XlsFile{     
  12.   
  13.     @Override     
  14.     public String getContent(File f) throws Exception {     
  15.      //构建Workbook对象, 只读Workbook对象  
  16.      //直接从当三步跳件创造Workbook  
  17.       //从输入流成立Workbook  
  18.   
  19.         FileInputStream fis = new FileInputStream(f);     
  20.         StringBuilder sb = new StringBuilder();     
  21.         jxl.Workbook rwb = Workbook.getWorkbook(fis);     
  22. //豆蔻梢头旦创建了Workbook,大家就能够透过它来做客  
  23. //Excel Sheet的数组集结(术语:专门的职业表State of Qatar,  
  24. //也能够调用getsheet方法得到内定的薪水表  
  25.         Sheet[] sheet = rwb.getSheets();     
  26.         for (int i = 0; i < sheet.length; i++) {     
  27.             Sheet rs = rwb.getSheet(i);     
  28.             for (int j = 0; j < rs.getRows(); j++) {     
  29.                Cell[] cells = rs.getRow(j);     
  30.                for(int k=0;k<cells.length;k++)     
  31.                sb.append(cells[k].getContents());     
  32.             }     
  33. 澳门新葡萄京所有网站 ,        }     
  34.         fis.close();     
  35.         return sb.toString();     
  36.     }     
  37.   
  38. }  

 

由地方代码大家能够:黄金年代旦获得了Sheet,大家就足以经过它来访谈Excel Cell(术语:单元格卡塔尔国。参谋上边包车型大巴代码片段:
//获取第意气风发行,第一列的值
Cell c00 = rs.getCell(0, 0);
String strc00 = c00.getContents();
//获取第意气风发行,第二列的值
Cell c10 = rs.getCell(1, 0);
String strc10 = c10.getContents();
当你完了对Excel原子钟格数据的管理后,应当要使用close(卡塔尔(قطر‎方法来关闭先前创办的目的,以自由读取数据表的历程中所占用的内部存款和储蓄器空间,在读取大批量数码时体现更为首要。

 

3.援用PDFBox读取pdf文书档案的内容

 

  1. import java.io.File;     
  2. import java.io.FileInputStream;     
  3. import org.pdfbox.pdfparser.PDFParser;     
  4. import org.pdfbox.pdmodel.PDDocument;     
  5. import org.pdfbox.util.PDFTextStripper;     
  6.   
  7. /**  
  8. *  
  9. * @author 曹胜欢 
  10. */   
  11. <pre name=”code” class=”java”>public class PdfFile{     
  12.   
  13.     public String getContent(File f) throws Exception {     
  14.         FileInputStream fis = new FileInputStream(f);     
  15.         PDFParser p = new PDFParser(fis);     
  16.         p.parse();     
  17.         PDDocument pdd = p.getPDDocument();     
  18.         PDFTextStripper ts = new PDFTextStripper();     
  19.         String c = ts.getText(pdd);     
  20.         pdd.close();     
  21.         fis.close();     
  22.         return c;     
  23.     }     
  24. }</pre><br>  

作者们简要介绍了java读取word,excel和pdf文书档案内容 ,但在实际支付中,大家用到最多的是把数据库中数据导出excel报表情势。不独有不难的读取office中的数据.特别是在生养管理依旧财务系统有效的不得了多如牛毛,因为这个体系时常要做一些表格打字与印刷的劳作。而数据导出的格式日常是EXCEL恐怕PDF 。所以今日大家来简单看一下行使Apache  POI达成数据库中多少导出excel报表。在Java中有无数兑现多少导出excel报表的第三方jar包。但在比较了刹那间感到到依旧POI相对来讲相比好用。假使我们想学习别的的导出情势能够活动钻研一下。

 

首先来打听一下 Apache POI

 

     Apache POI 是用Java编写的无需付费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。Apache POI 是创制和爱护操作种种相符Office Open XML(OOXML)标准和微软的OLE 2复合文书档案格式(OLE2)的Java API。用它能够运用Java读取和开创,改正MS Excel文件.並且,还足以行使Java读取和创设MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel技术方案(适用于Excel97-二〇〇九)。 上面我们来看一下Apache POI 中提供的几大片段的效劳:

 

 

HSSF - 提供读写Microsoft Excel XLS格式档案的机能。  

XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的成效。  

HWPF - 提供读写Microsoft Word DOC格式档案的职能。  

HSLF - 提供读写Microsoft PowerPoint格式档案的功力。  

HDGF - 提供读Microsoft Visio格式档案的功效。  

HPBF - 提供读Microsoft Publisher格式档案的意义。  

HSMF - 提供读Microsoft Outlook格式档案的机能。 

 

     
 本节我们所要学习的是POI对excel的操作。所以我们只需用到HSSF 那部分剧情就足以了。别的的请大家自行钻研吗。哈哈。

 

 

上面大家就一步一步的来看一下怎样制造三个excel报表:

 

1. 开立新的Excel职业薄

 

HSSFWorkbook workbook = new HSSFWorkbook();

在Excel事业簿中国建工业总会公司意气风发工作表,其名为缺省值。POI中还提供了其他的片段其余的workbook 构造方法。下边大家来看一下:

澳门新葡萄京所有网站 1

 

 

2.创立二个专门的职业表

如要新建一名叫”薪水表”的专门的学业表,其语句为:  

HSSFSheet sheet = workbook.createSheet(“工资表”); 

 

3.创建行

 在索引0的岗位创造行(最上方的行)  

HSSFRow row = sheet.createRow(0);

 

4.创制单元格

在索引0的岗位创建单元格(左上端)  

HSSFCell cell = row.createCell((short) 0);

概念单元格为字符串类型,那一个字符串类型也可在开立单元格里面安装。

cell.setCellType(HSSFCell.CELL_TYPE_STRING); 

在单元格中输入一些剧情  

cell.setCellValue(“增加值”); 

 

5.新建蓬蓬勃勃出口文件流,把相应的Excel工作簿 输出到本地

FileOutputStream fOut = new FileOutputStream(outputFile);

workbook.write(fOut);

fOut.flush();

操作结束,关闭文件  

fOut.close(); 

 

      OK,在给单元格设置下从数据库中读取的数量。那样大家就足以把数据Curry面包车型客车内容导入到excel了。当然这里我们只是简短的介绍了一些POI的用法。并未细讲,比方设置单元格里面数据的格式。单元格的大器晚成部分天性设置。这几个将会在自个儿上面包车型客车例子中用到。也毕竟给大家有个别演示吧。好了。最终看二个实例吧:

 

EXCEL报表工具类:ExportExcel.java

 

  1. package com.bzu.search.action;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.FileOutputStream;  
  6. import java.io.IOException;  
  7.   
  8. import org.apache.poi.hssf.usermodel.HSSFCell;  
  9. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
  10. import org.apache.poi.hssf.usermodel.HSSFFont;  
  11. import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
  12. import org.apache.poi.hssf.usermodel.HSSFRow;  
  13. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  15. import org.apache.poi.hssf.util.HSSFColor;  
  16. import org.apache.poi.hssf.util.Region;  
  17.   
  18. /** 
  19.  * EXCEL报表工具类. 
  20.  *  
  21.  * @author caoyb 
  22.  * @version $Revision:$ 
  23.  */  
  24. public class ExportExcel {  
  25.   
  26.     private HSSFWorkbook wb = null;  
  27.   
  28.     private HSSFSheet sheet = null;  
  29.   
  30.     /** 
  31.      * @param wb 
  32.      * @param sheet 
  33.      */  
  34.     public ExportExcel(HSSFWorkbook wb, HSSFSheet sheet) {  
  35.         super();  
  36.         this.wb = wb;  
  37.         this.sheet = sheet;  
  38.     }  
  39.   
  40.     /** 
  41.      * @return the sheet 
  42.      */  
  43.     public HSSFSheet getSheet() {  
  44.         return sheet;  
  45.     }  
  46.   
  47.     /** 
  48.      * @param sheet 
  49.      *            the sheet to set 
  50.      */  
  51.     public void setSheet(HSSFSheet sheet) {  
  52.         this.sheet = sheet;  
  53.     }  
  54.   
  55.     /** 
  56.      * @return the wb 
  57.      */  
  58.     public HSSFWorkbook getWb() {  
  59.         return wb;  
  60.     }  
  61.   
  62.     /** 
  63.      * @param wb 
  64.      *            the wb to set 
  65.      */  
  66.     public void setWb(HSSFWorkbook wb) {  
  67.         this.wb = wb;  
  68.     }  
  69.   
  70.     /** 
  71.      * 创建通用EXCEL底部 
  72.      *  
  73.      * @param headString 
  74.      *            尾部展现的字符 
  75.      * @param colSum 
  76.      *            该报表的列数 
  77.      */  
  78.     public void createNormalHead(String headString, int colSum) {  
  79.   
  80.         HSSFRow row = sheet.createRow(0);  
  81.   
  82.         // 设置第风姿洒脱行  
  83.         HSSFCell cell = row.createCell(0);  
  84.         row.setHeight((short) 400);  
  85.   
  86.         // 定义单元格为字符串类型  
  87.         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
  88.         cell.setCellValue(new HSSFRichTextString(“格拉斯哥市区各网点进件总括报表”State of QatarState of Qatar;  
  89.   
  90.         // 内定合併区域  
  91.         sheet.addMergedRegion(new Region(0, (short) 0, 0, (short) colSum));  
  92.   
  93.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  94.   
  95.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTEHighlander卡塔尔(قطر‎; // 内定单元格居中对齐  
  96.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTEENVISION卡塔尔;// 钦点单元格垂直居中对齐  
  97.         cellStyle.setWrapText(trueState of Qatar;// 钦定单元格自动换行  
  98.   
  99.         // 设置单元格字体  
  100.         HSSFFont font = wb.createFont();  
  101.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  102.         font.setFontName(“宋体”);  
  103.         font.setFontHeight((short) 300);  
  104.         cellStyle.setFont(font);  
  105.   
  106.         cell.setCellStyle(cellStyle);  
  107.     }  
  108.   
  109.     /** 
  110.      * 成立通用报表第二行 
  111.      *  
  112.      * @param params 
  113.      *            计算标准化数组 
  114.      * @param colSum 
  115.      *            要求统意气风发到的列索引 
  116.      */  
  117.     public void createNormalTwoRow(String[] params, int colSum) {  
  118.         HSSFRow row1 = sheet.createRow(1);  
  119.         row1.setHeight((short) 300);  
  120.   
  121.         HSSFCell cell2 = row1.createCell(0);  
  122.   
  123.         cell2.setCellType(HSSFCell.ENCODING_UTF_16);  
  124.         cell2.setCellValue(new HSSFRichTextString(“总计时间:” + params[0] + “至”  
  125.                 + params[1]));  
  126.   
  127.         // 钦命合并区域  
  128.         sheet.addMergedRegion(new Region(1, (short) 0, 1, (short) colSum));  
  129.   
  130.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  131.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTE中华V卡塔尔国; // 钦赐单元格居中对齐  
  132.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTE科雷傲State of Qatar;// 内定单元格垂直居中对齐  
  133.         cellStyle.setWrapText(true卡塔尔国;// 内定单元格自动换行  
  134.   
  135.         // 设置单元格字体  
  136.         HSSFFont font = wb.createFont();  
  137.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  138.         font.setFontName(“宋体”);  
  139.         font.setFontHeight((short) 250);  
  140.         cellStyle.setFont(font);  
  141.   
  142.         cell2.setCellStyle(cellStyle);  
  143.   
  144.     }  
  145.   
  146.     /** 
  147.      * 设置报表标题 
  148.      *  
  149.      * @param columHeader 
  150.      *            标题字符串数组 
  151.      */  
  152.     public void createColumHeader(String[] columHeader) {  
  153.   
  154.         // 设置列头  
  155.         HSSFRow row2 = sheet.createRow(2);  
  156.   
  157.         // 内定行高  
  158.         row2.setHeight((short) 600);  
  159.   
  160.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  161.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTE奔驰G级卡塔尔国; // 钦赐单元格居中对齐  
  162.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTE奥德赛卡塔尔国;// 钦命单元格垂直居中对齐  
  163.         cellStyle.setWrapText(true卡塔尔国;// 钦赐单元格自动换行  
  164.   
  165.         // 单元格字体  
  166.         HSSFFont font = wb.createFont();  
  167.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  168.         font.setFontName(“宋体”);  
  169.         font.setFontHeight((short) 250);  
  170.         cellStyle.setFont(font);  
  171.   
  172.         /* 
  173.          * cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN卡塔尔国; // 设置单无格的边框为粗体 
  174.          * cellStyle.setBottomBorderColor(HSSFColor.BLACK.index卡塔尔国; // 设置单元格的边框颜色. 
  175.          * cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
  176.          * cellStyle.setLeftBorderColor(HSSFColor.BLACK.index); 
  177.          * cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); 
  178.          * cellStyle.setRightBorderColor(HSSFColor.BLACK.index); 
  179.          * cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); 
  180.          * cellStyle.setTopBorderColor(HSSFColor.BLACK.index); 
  181.          */  
  182.   
  183.         // 设置单元格背景象  
  184.         cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);  
  185.         cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
  186.   
  187.         HSSFCell cell3 = null;  
  188.   
  189.         for (int i = 0; i < columHeader.length; i++) {  
  190.             cell3 = row2.createCell(i);  
  191.             cell3.setCellType(HSSFCell.ENCODING_UTF_16);  
  192.             cell3.setCellStyle(cellStyle);  
  193.             cell3.setCellValue(new HSSFRichTextString(columHeader[i]));  
  194.         }  
  195.   
  196.     }  
  197.   
  198.     /** 
  199.      * 创制内容单元格 
  200.      *  
  201.      * @param wb 
  202.      *            HSSFWorkbook 
  203.      * @param row 
  204.      *            HSSFRow 
  205.      * @param col 
  206.      *            short型的列索引 
  207.      * @param align 
  208.      *            对齐格局 
  209.      * @param val 
  210.      *            列值 
  211.      */  
  212.     public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align,  
  213.             String val) {  
  214.         HSSFCell cell = row.createCell(col);  
  215.         cell.setCellType(HSSFCell.ENCODING_UTF_16);  
  216.         cell.setCellValue(new HSSFRichTextString(val));  
  217.         HSSFCellStyle cellstyle = wb.createCellStyle();  
  218.         cellstyle.setAlignment(align);  
  219.         cell.setCellStyle(cellstyle);  
  220.     }  
  221.   
  222.     /** 
  223.      * 创立合计行 
  224.      *  
  225.      * @param colSum 
  226.      *            要求统生机勃勃到的列索引 
  227.      * @param cellValue 
  228.      */  
  229.     public void createLastSumRow(int colSum, String[] cellValue) {  
  230.   
  231.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  232.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTE库罗德卡塔尔(قطر‎; // 钦赐单元格居中对齐  
  233.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTE景逸SUV卡塔尔(قطر‎;// 钦赐单元格垂直居中对齐  
  234.         cellStyle.setWrapText(true卡塔尔;// 钦点单元格自动换行  
  235.   
  236.         // 单元格字体  
  237.         HSSFFont font = wb.createFont();  
  238.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  239.         font.setFontName(“宋体”);  
  240.         font.setFontHeight((short) 250);  
  241.         cellStyle.setFont(font);  
  242.   
  243.         HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1));  
  244.         HSSFCell sumCell = lastRow.createCell(0);  
  245.   
  246.         sumCell.setCellValue(new HSSFRichTextString(“合计”));  
  247.         sumCell.setCellStyle(cellStyle);  
  248.         sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0,  
  249.                 sheet.getLastRowNum(卡塔尔(قطر‎, (short卡塔尔国 colSumState of Qatar卡塔尔;// 钦点合并区域  
  250.   
  251.         for (int i = 2; i < (cellValue.length + 2); i++) {  
  252.             sumCell = lastRow.createCell(i);  
  253.             sumCell.setCellStyle(cellStyle);  
  254.             sumCell.setCellValue(new HSSFRichTextString(cellValue[i – 2]));  
  255.   
  256.         }  
  257.   
  258.     }  
  259.   
  260.     /** 
  261.      * 输入EXCEL文件 
  262.      *  
  263.      * @param fileName 
  264.      *            文件名 
  265.      */  
  266.     public void outputExcel(String fileName) {  
  267.         FileOutputStream fos = null;  
  268.         try {  
  269.             fos = new FileOutputStream(new File(fileName));  
  270.             wb.write(fos);  
  271.             fos.close();  
  272.         } catch (FileNotFoundException e) {  
  273.             e.printStackTrace();  
  274.         } catch (IOException e) {  
  275.             e.printStackTrace();  
  276.         }  
  277.     }  
  278. }  

报表生成类:ComplexExportExcelClient.java

  1. package com.bzu.search.action;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.apache.poi.hssf.usermodel.HSSFCell;  
  7. import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
  8. import org.apache.poi.hssf.usermodel.HSSFFont;  
  9. import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
  10. import org.apache.poi.hssf.usermodel.HSSFRow;  
  11. import org.apache.poi.hssf.usermodel.HSSFSheet;  
  12. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  13. import org.apache.poi.hssf.util.Region;  
  14.   
  15. /** 
  16.  * 谢绝件报表生成类. 
  17.  *  
  18.  * @author caoyb 
  19.  * @version $Revision:$ 
  20.  */  
  21. public class ComplexExportExcelClient {  
  22.   
  23.     private static HSSFWorkbook wb = new HSSFWorkbook();  
  24.   
  25.     private static HSSFSheet sheet = wb.createSheet();  
  26.   
  27.     @SuppressWarnings({ “unchecked”, “deprecation” })  
  28.     public static void main(String[] args) {  
  29.   
  30.         ExportExcel exportExcel = new ExportExcel(wb, sheet);  
  31.   
  32.         // 创造列标头LIST  
  33.         List fialList = new ArrayList();  
  34.   
  35.         fialList.add(“申请人未提供任何联系情势”State of Qatar;  
  36.         fialList.add(“无政府机构消息且未提供收入来自消息”State of Qatar;  
  37.         fialList.add(“有行政单位但未提供单位地址或电话”卡塔尔(قطر‎;  
  38.         fialList.add(“家庭地址缺点和失误”卡塔尔;  
  39.         fialList.add(“客商身份ID明资料缺”卡塔尔(قطر‎;  
  40.         fialList.add(“具名缺点和失误或签定不相符必要”卡塔尔;  
  41.         fialList.add(“其它”);  
  42.   
  43.         List errorList = new ArrayList();  
  44.   
  45.         errorList.add(“顾客主动撤回”State of Qatar;  
  46.         errorList.add(“个人征信不良”卡塔尔国;  
  47.         errorList.add(“诈骗申请”卡塔尔(قطر‎;  
  48.         errorList.add(“申请人基本尺度不符”State of Qatar;  
  49.         errorList.add(“申请材质违规”卡塔尔;  
  50.         errorList.add(“不可能不奇怪达成征信”卡塔尔(قطر‎;  
  51.         errorList.add(“重复申请”卡塔尔国;  
  52.         errorList.add(“其他”);  
  53.   
  54.         // 总计该报表的列数  
  55.         int number = 2 + fialList.size() * 2 + errorList.size() * 2;  
  56.   
  57.         // 给办事表列定义列宽(实际运用自个儿改造列数卡塔尔  
  58.         for (int i = 0; i < number; i++) {  
  59.             sheet.setColumnWidth(i, 3000);  
  60.         }  
  61.   
  62.         // 创制单元格样式  
  63.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  64.   
  65.         // 内定单元格居中对齐  
  66.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
  67.   
  68.         // 钦赐单元格垂直居中对齐  
  69.         cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
  70.   
  71.         // 钦命当单元格内容呈现不下时自动换行  
  72.         cellStyle.setWrapText(true);  
  73.   
  74.         // 设置单元格字体  
  75.         HSSFFont font = wb.createFont();  
  76.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
  77.         font.setFontName(“宋体”);  
  78.         font.setFontHeight((short) 200);  
  79.         cellStyle.setFont(font);  
  80.   
  81.         // 创立报表底部  
  82.         exportExcel.createNormalHead(“拉脱维亚里加地区申请资料拒件解析总括”, number卡塔尔;  
  83.   
  84.         // 设置第二行  
  85.         String[] params = new String[] { ”    年  月  日”, ”  年  月  日” };  
  86.         exportExcel.createNormalTwoRow(params, number);  
  87.   
  88.         // 设置列头  
  89.         HSSFRow row2 = sheet.createRow(2);  
  90.   
  91.         HSSFCell cell0 = row2.createCell(0);  
  92.         cell0.setCellStyle(cellStyle);  
  93.         cell0.setCellValue(new HSSFRichTextString(“机构代码”卡塔尔国State of Qatar;  
  94.   
  95.         HSSFCell cell1 = row2.createCell(1);  
  96.         cell1.setCellStyle(cellStyle);  
  97.         cell1.setCellValue(new HSSFRichTextString(“支行名称”State of Qatar卡塔尔国;  
  98.   
  99.         HSSFCell cell2 = row2.createCell(2);  
  100.         cell2.setCellStyle(cellStyle);  
  101.         cell2.setCellValue(new HSSFRichTextString(“无效件”));  
  102.   
  103.         HSSFCell cell3 = row2.createCell(2 * fialList.size() + 2);  
  104.         cell3.setCellStyle(cellStyle);  
  105.         cell3.setCellValue(new HSSFRichTextString(“拒绝件”));  
  106.   
  107.         HSSFRow row3 = sheet.createRow(3);  
  108.   
  109.         // 设置行高  
  110.         row3.setHeight((short) 800);  
  111.   
  112.         HSSFCell row3Cell = null;  
  113.         int m = 0;  
  114.         int n = 0;  
  115.   
  116.         // 成立不一样的LIST的列题目  
  117.         for (int i = 2; i < number; i = i + 2) {  
  118.   
  119.             if (i < 2 * fialList.size() + 2) {  
  120.                 row3Cell = row3.createCell(i);  
  121.                 row3Cell.setCellStyle(cellStyle);  
  122.                 row3Cell.setCellValue(new HSSFRichTextString(fialList.get(m)  
  123.                         .toString()));  
  124.                 m++;  
  125.             } else {  
  126.                 row3Cell = row3.createCell(i);  
  127.                 row3Cell.setCellStyle(cellStyle);  
  128.                 row3Cell.setCellValue(new HSSFRichTextString(errorList.get(n)  
  129.                         .toString()));  
  130.                 n++;  
  131.             }  
  132.   
  133.         }  
  134.   
  135.         // 创设最后一列的左券列  
  136.         row3Cell = row3.createCell(number);  
  137.         row3Cell.setCellStyle(cellStyle);  
  138.         row3Cell.setCellValue(new HSSFRichTextString(“合计”));  
  139.   
  140.         // 合并单元格  
  141.         HSSFRow row4 = sheet.createRow(4);  
  142.   
  143.         // 合并第三行到第五行的率先列  
  144.         sheet.addMergedRegion(new Region(2, (short) 0, 4, (short) 0));  
  145.   
  146.         // 合并第三行到第五行的第二列  
  147.         sheet.addMergedRegion(new Region(2, (short) 1, 4, (short) 1));  
  148.   
  149.         // 合併第三行的第三列到第AA钦命的列  
  150.         int aa = 2 * fialList.size() + 1;  
  151.         sheet.addMergedRegion(new Region(2, (short) 2, 2, (short) aa));  
  152.   
  153.         int start = aa + 1;  
  154.   
  155.         sheet.addMergedRegion(new Region(2, (short) start, 2,  
  156.                 (short) (number – 1)));  
  157.   
  158.         // 循环归并第四行的行,并且是每2列合并成一列  
  159.         for (int i = 2; i < number; i = i + 2) {  
  160.             sheet.addMergedRegion(new Region(3, (short) i, 3, (short) (i + 1)));  
  161.   
  162.         }  
  163.   
  164.         // 根据列数奇偶数的分歧成立不一样的列标题  
  165.         for (int i = 2; i < number; i++) {  
  166.             if (i < 2 * fialList.size() + 2) {  
  167.   
  168.                 if (i % 2 == 0) {  
  169.                     HSSFCell cell = row4.createCell(i);  
  170.                     cell.setCellStyle(cellStyle);  
  171.                     cell.setCellValue(new HSSFRichTextString(“无效量”));  
  172.                 } else {  
  173.                     HSSFCell cell = row4.createCell(i);  
  174.                     cell.setCellStyle(cellStyle);  
  175.                     cell.setCellValue(new HSSFRichTextString(“占比”));  
  176.                 }  
  177.             } else {  
  178.                 if (i % 2 == 0) {  
  179.                     HSSFCell cell = row4.createCell(i);  
  180.                     cell.setCellStyle(cellStyle);  
  181.                     cell.setCellValue(new HSSFRichTextString(“拒绝量”));  
  182.                 } else {  
  183.                     HSSFCell cell = row4.createCell(i);  
  184.                     cell.setCellStyle(cellStyle);  
  185.                     cell.setCellValue(new HSSFRichTextString(“占比”));  
  186.                 }  
  187.             }  
  188.   
  189.         }  
  190.   
  191.         // 循环创造中间的单元格的各个的值  
  192.         for (int i = 5; i < number; i++) {  
  193.             HSSFRow row = sheet.createRow((short) i);  
  194.             for (int j = 0; j <= number; j++) {  
  195.                 exportExcel  
  196.                         .cteateCell(wb, row, (short) j,  
  197.                                 HSSFCellStyle.ALIGN_CENTER_SELECTION, String  
  198.                                         .valueOf(j));  
  199.             }  
  200.   
  201.         }  
  202.   
  203.         // 创立最一生机勃勃行的商谈行  
  204.         String[] cellValue = new String[number – 1];  
  205.         for (int i = 0; i < number – 1; i++) {  
  206.             cellValue[i] = String.valueOf(i);  
  207.   
  208.         }  
  209.         exportExcel.createLastSumRow(1, cellValue);  
  210.   
  211.         exportExcel.outputExcel(“c:\闭门羹件总计.xls”卡塔尔(قطر‎;  
  212.   
  213.     }  
  214. }  

行使Apache开源项目POI达成数据库数量导出excel报表的知识。其实际Java世界里,有两套成熟的开源工具援助对Excel文件的操作:三个是Apache POI;另一个则是本文将在介绍的Java Excel API。Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读/写作用。该项目分为多少个构件,个中囊括贰个HSSF的零零器件,它是多个要命规范和审慎的API。利用HSSF,你能够用纯Java代码来读取、写入、改革Excel文件 。Java Excel API(JXL),它是风华正茂套纯粹使用Java开辟的Excel表格操作组件,使用它,尽管在非Windows操作系统下,程序猿也得以通过纯 Java 应用来创制Excel文件,并能够读取,写入,更新Excel中的内容,因而,基于JXL能够兑现对数据库中多少导入导出的操作。与POI比较,JXL具有越来越小的内部存款和储蓄器占用率和对粤语越来越好的帮助,所以那篇文字大家就来看一下数据库数据导入导出基于JXL的方法。顺便介绍一下jxl与POI的分别。其实从常理上,个人感到那二种方式很相通,就连代码也挺像。上边大家就来看一下精短的操作步骤吧。

 

jxl下载地址: 

骨干步骤:

1.创立一个职业薄

WritableWorkbook book=Workbook.createWorkbook(new File(“测试.xls”)); 

2.生出名称叫“第少年老成页”的工作表,参数0表示那是第意气风发页  

WritableSheet sheet=book.createSheet(“第一页”,0); 

3.开立单元格。在Label对象的布局方法中指明单元格地方是第一列第少年老成行(0,0卡塔尔以致单元格内容为test 

Label label=new Label(0,0,”test”); 

4.将定义好的单元格添加到办事表中  

sheet.addCell(label); 

 

Jxl提供了二个特地创建数字类型的单元格,生成贰个封存数字的单元格必需使用Number的完整包路线,不然有语法歧义单元格地方是第二列,第风流洒脱行,值为123.123*/

jxl.write.Number number=new
jxl.write.Number(1,0,123.123);sheet.addCell(number); 

5.写入数据并关闭文件  

book.write();

book.close(); 

关于Excle的生龙活虎部分操作:

1、 字串格式化

 字符串的格式化涉及到的是字体、粗细、字号等成分,那个职能主要由WritableFont和
 WritableCellFormat类来承当。要是我们在更改多少个满含字串的单元格时,使用如下语句,
 为实惠叙述,我们为每风流浪漫行命令加了号码:

 

  1. WritableFont font1 =   
  2.   new  WritableFont(WritableFont.TIMES, 16 ,WritableFont.BOLD); ①  
  3.   
  4.  WritableCellFormat format1 = new  WritableCellFormat(font1); ②  
  5.   
  6.  Label label = new  Label( 0 , 0 ,”data  4  test”,format1) ③   

 当中①钦点了字串格式:字体为TIMES,字号16,加粗展现。WritableFont有特别丰硕的
 布局子,供分裂情形下利用,jExcelAPI的java-doc中有详实列表,这里不再列出。

 ②处代码应用了WritableCellFormat类,那几个类特别主要,通过它能够钦赐单元格的种种
 属性,前边的单元格格式化中会有更多描述。

 ③处使用了Label类的布局子,钦赐了字串被给与那种格式。

在WritableCellFormat类中,还会有叁个很珍爱的主意是点名数量的对齐情势,譬如照准我们
 上边的实例,能够钦点:

   // 把水平对齐情势内定为居中 
  format1.setAlignment(jxl.format.Alignment.CENTRE);

  // 把垂直对齐情势钦定为居中 
  format1.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);

 

2、单元格操作

 Excel中很首要的生龙活虎有个别是对单元格的操作,举例行高、列宽、单元格合併等,所幸jExcelAPI
 提供了那么些补助。那一个操作相对比较容易,下边只介绍一下连锁的API。

 

 1)、 合併单元格

  WritableSheet.mergeCells( int  m, int  n, int  p, int  q); 

  // 功用是从(m,n卡塔尔(قطر‎到(p,q卡塔尔的单元格全体合併,比方: 
  WritableSheet sheet = book.createSheet(“第一页”, 0 );

  // 合併第一列第一行到第六列第意气风发行的具备单元格 
  sheet.mergeCells( 0 , 0 , 5 , 0 );

 合并不只能够是横向的,也得以是纵向的。合并后的单元格不能够重复张开联合,不然会触发至极。

 

 2)、 行高和列宽

  WritableSheet.setRowView( int  i, int  height);

  // 功效是点名第i+1行的中度,比方:

  // 将率先行的万丈设为200 
  sheet.setRowView( 0 , 200 );

 WritableSheet.setColumnView( int  i, int  width);

  // 成效是钦点第i+1列的大幅度,举个例子:

  // 将第一列的增进率设为30 
  sheet.setColumnView( 0 , 30 );

 

jxl还会有任何的部分职能,举个例子插入图片等,这里就不再大器晚成一介绍,读者能够本身探求。

POI和jxl区别:

从JVM设想机内部存款和储蓄器消耗的意况.

数据量3000条数据,每条60列.JVM设想机内部存款和储蓄器大小64M.

使用POI:运转到2800条左右就报内存溢出.

行使JXL:3000条全体出来,并且内部存储器还会有21M的空间.

简单来说,在对内部存款和储蓄器的损耗方面差别照旧挺大的.

兴许是出于JXL在对财富回笼利用方面做的还挺不错的.

 

从提供的法力的状态

JXL相对弱了点.未有提供像POI那样复杂的效率,比如增多图片功能。所以生龙活虎旦要兑现的功力比较复杂的情状下能够虚构使用POI

末尾来看三个小例子:

 

  1. import java.io.File;  
  2. import java.io.FileOutputStream;  
  3. import java.io.OutputStream;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8. import java.sql.Statement;  
  9. import jxl.Workbook;  
  10. import jxl.write.Label;  
  11. import jxl.write.WritableCellFormat;  
  12. import jxl.write.WritableFont;  
  13. import jxl.write.WritableSheet;  
  14. import jxl.write.WritableWorkbook;  
  15. public class DateToExcel {  
  16.  private String driverClass = “com.mysql.jdbc.Driver”;  
  17.  private String url = “jdbc:MySQL://localhost/boutiquecourse”;  
  18.  private String user = “root”;  
  19.  private String password = “”;  
  20.  private Connection connection;  
  21.  public void exportClassroom(OutputStream os) {  
  22.   try {  
  23.    WritableWorkbook wbook = Workbook.createWorkbook(os); // 建立excel文件  
  24.    WritableSheet wsheet = wbook.createSheet(“测量试验调换”, 0卡塔尔(قطر‎; // 职业表名称  
  25.    //设置Excel字体  
  26.    WritableFont wfont = new WritableFont(WritableFont.ARIAL, 16,  
  27.     WritableFont.BOLD, false,  
  28.    jxl.format.UnderlineStyle.NO_UNDERLINE,  
  29.    jxl.format.Colour.BLACK);  
  30.    WritableCellFormat titleFormat = new WritableCellFormat(wfont);  
  31.      
  32.    String[] title = { “测量试验编号”, “测量检验名称”};//假使还应该有字段的话,依此类推  
  33.    // 设置Excel表头  
  34.    for (int i = 0; i < title.length; i++) {  
  35.     Label excelTitle = new Label(i, 0, title[i], titleFormat);  
  36.     wsheet.addCell(excelTitle);  
  37.    }  
  38.    int c = 1; // 用于循环时Excel的行号  
  39.    Connection con = openConnection();  
  40.    Statement st = con.createStatement();  
  41.    String sql = “select * from test”;  
  42.    ResultSet rs = st.executeQuery(sql卡塔尔国; // 那些是从数据库中得到要导出的数额  
  43.    while (rs.next()) {  
  44.     Label content1 = new Label(0, c, (String) rs.getString(“testid”));  
  45.     Label content2 = new Label(1, c, (String) rs.getString(“testname”));  
  46.     //假使还应该有的话,就那样推算  
  47.     wsheet.addCell(content1);  
  48.     wsheet.addCell(content2);  
  49.     //假设还可能有的话,依此类推  
  50.     c++;  
  51.    }  
  52.    wbook.write(卡塔尔(قطر‎; // 写入文件  
  53.    wbook.close();  
  54.    os.close();  
  55.    System.out.println(“导入成功!”卡塔尔国;  
  56.   } catch (Exception e) {  
  57.    e.printStackTrace();  
  58.   }  
  59.  }  
  60.  public Connection openConnection() throws SQLException {  
  61.   try {  
  62.    Class.forName(driverClass).newInstance();  
  63.    connection = DriverManager.getConnection(url, user, password);  
  64.    return connection;  
  65.   } catch (Exception e) {  
  66.    throw new SQLException(e.getMessage());  
  67.   }  
  68.  }  
  69.  public void closeConnection() {  
  70.   try {  
  71.    if (connection != null)  
  72.     connection.close();  
  73.   } catch (Exception e) {  
  74.    e.printStackTrace();  
  75.   }  
  76.  }  
  77.  public static void main(String[] args) {  
  78.   DateToExcel te = new DateToExcel();  
  79.   File f = new File(“D:/kk.xls”);  
  80.   //File f = new File(“D:\kk.xls”);  
  81.   try {  
  82.    f.createNewFile();  
  83.    OutputStream os = new FileOutputStream(f);  
  84.    te.exportClassroom(os);  
  85.   } catch (Exception e) {  
  86.    e.printStackTrace();  
  87.   }  
  88.  }  
  89. }