美文网首页
java生成excel文件(Jxl)

java生成excel文件(Jxl)

作者: 高举按下 | 来源:发表于2019-06-26 09:08 被阅读0次

       需要将查询到的数据写到excel文件中,所以写了一个工具类。使用的是Jxl实现。
       第一步,添加依赖到项目的pom文件中。

 <!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl -->
    <dependency>
        <groupId>net.sourceforge.jexcelapi</groupId>
        <artifactId>jxl</artifactId>
        <version>2.6</version>
    </dependency>

       第二步,设计工具类的方法头。public void generateXls(FileOutputStream os, String [] header, List<?> data),其中os是流,header是excel表格的表头,data是要写入的数据,此处List集合是泛型。
       美中不足的是,headers数组中表头元素的顺序要与写入List集合中的对象的元素定义的顺序一一对应,否则就会乱序。原因是我写的ReFlexObjectUtil 工具类是按顺序提取元素形成数组的。
代码如下:
    注:其中将List集合反射为数据的工具类ReFlexObjectUtil ,请参见上一篇文 将泛型List<?> data集合转化为数组、Map

package com.xxx.xxxx.utils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

/**
 * 生成excel文件的工具
 * generateXls()方法的注意点,要保证List<?> data中数据写入的顺序与excel表头String [] header中的顺序一致,
 * 因为ReFlexObjectUtil工具再将对象反射成数组时是按顺序获取数据的
 */
public class GenerateExcelFile {
    
    public void generateXls(FileOutputStream os, String [] header, List<?> data)throws WriteException,IOException {
        //创建工作薄
        WritableWorkbook book = Workbook.createWorkbook(os);
        //创建新的一页
        WritableSheet sheet = book.createSheet("excel表格一的名字", 0);
        //反射集合data为数组的工具
        ReFlexObjectUtil reFlexObject = new ReFlexObjectUtil();
        //Date类型的数据再进行格式转化
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        //创建要显示的内容      
        Label label;//表头
        Label content;//表内容
        if(!data.isEmpty()) {
            //写表头
            for(int i = 0; i < header.length; i ++) {
               //创建一个单元格,第一个参数为列坐标,第二个参数为行坐标,第三个参数为内容
                label = new Label(i, 0, header[i]); 
                sheet.addCell(label);
            }   
            //写数据
            //j从1开始,避免覆盖第一行表头
            for(int j = 1; j <= data.size(); j ++) {
                for(Object ob : data) {                 
                    Object[] array = reFlexObject.getArray(ob);
                    for(int i = 0; i < array.length; i++) {
                        // instanceof是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例
                        if(array[i] instanceof Date) {
                            content = new Label(i, j, dateFormat.format(array[i]));
                        }else {
                            content = new Label(i, j, array[i].toString());
                        }                       
                        sheet.addCell(content);
                    }
                }
            }
        }
        //把创建的内容写到输出流中,并关闭输出流
        book.write();
        book.close();
        os.close(); 
    }
}

       以上,如果你有更好的方法,欢迎留言交流,谢谢观看。

相关文章

网友评论

      本文标题:java生成excel文件(Jxl)

      本文链接:https://www.haomeiwen.com/subject/mckqcctx.html