POI 报表技术(导出Excel表格)

POI报表技术

1.导入Apache POI的JAR包

(Apache官网中可以直接下载)POI JAR 包

2.熟悉常用对象

  1. HSSFSheet excel的表单
  2. HSSFRow excel的行
  3. HSSFCell excel的格子单元
  4. HSSFFont excel字体
  5. HSSFDataFormat 日期格式
  6. HSSFHeader sheet头
  7. HSSFFooter sheet尾
  8. HSSFCellStyle cell样式
  9. HSSFDateUtil 日期
  10. HSSFPrintSetup 打印
  11. HSSFErrorConstants 错误信息表

3.简单范例练练手

生成一个空白的Excel表格

public class ExcelSample1 {

    public static void main(String[] args) throws IOException {
        //创建一个excel文件
        HSSFWorkbook wb= new HSSFWorkbook();
        FileOutputStream fileOut= new FileOutputStream("c:\\workbook.xls");
// FileOutputStream fileOut= new FileOutputStream("c:/workbook.xls");
        wb.write(fileOut);
        fileOut.close();
    }
}

4.生成一个具有内容和格式的表格

public class CreateCells
{
public static void main(String[] args) throws IOException
{
HSSFWorkbook wb = new HSSFWorkbook();    //建立新HSSFWorkbook对象
HSSFSheet sheet = wb.createSheet("new sheet");  //建立新的sheet对象
HSSFRow row = sheet.createRow((short)0);
//在sheet里创建一行,参数为行号(第一行,此处可想象成数组)
HSSFCell cell = row.createCell((short)0);      
//在row里建立新cell(单元格),参数为列号(第一列)
cell.setCellvalue(1);                       //设置cell的整数类型的值
row.createCell((short)1).setCellvalue(1.2);     //设置cell浮点类型的值
row.createCell((short)2).setCellvalue("test");   //设置cell字符类型的值
row.createCell((short)3).setCellvalue(true);    //设置cell布尔类型的值 
HSSFCellStyle cellStyle = wb.createCellStyle(); //建立新的cell样式
cellStyle.setDataFormat(HSSFDataFormat. getBuiltinFormat("m/d/yy h:mm"));
//设置cell样式为定制的日期格式
HSSFCell dCell =row.createCell((short)4);
dCell.setCellvalue(new Date());            //设置cell为日期类型的值
dCell.setCellStyle(cellStyle);              //设置该cell日期的显示格式
HSSFCell csCell =row.createCell((short)5);
csCell.setEncoding(HSSFCell.ENCODING_UTF_16);
//设置cell编码解决中文高位字节截断
csCell.setCellvalue("中文测试_Chinese Words Test");  //设置中西文结合字符串
row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);
//建立错误cell
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
}
}

当然,还有一些其他使用的方法,比如说,
合并单元格:sheet.addMergedRegion(new Region(1,(short)1,2,(short)4));
设置对齐方式:HSSFCellStyle cellstyle = wb.createCellStyle();
cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);

冻结一个窗口:sheet.createFreezePane(1,2);(说实话,不知道这个有什么作用!-_-)

5.将数据库中的数据导出,生成一个Excel表格

1.写一个继承的方法类:

import java.io.OutputStream;
import java.util.ArrayList;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ExcelFileGenerator {

    private final int SPLIT_COUNT = 1500; // Excel每个工作簿的行数

    private ArrayList fieldName = null; // excel标题数据集(ArrayList里存放的是字符串)

    private ArrayList fieldData = null; // excel数据内容(ArrayList里存放的是List集合元素)

    private HSSFWorkbook workBook = null;

    /**
     * 构造器
     * 
     * @param fieldName
     *            结果集的字段名
     * @param data
     */
    public ExcelFileGenerator(ArrayList fieldName, ArrayList fieldData) {

        this.fieldName = fieldName;
        this.fieldData = fieldData;
    }

    /**
     * 创建HSSFWorkbook对象
     * 
     * @return HSSFWorkbook
     */
    public HSSFWorkbook createWorkbook() {

        workBook = new HSSFWorkbook();
        int rows = fieldData.size();
        int sheetNum = 0;

        if (rows % SPLIT_COUNT == 0) {
            sheetNum = rows / SPLIT_COUNT;
        } else {
            sheetNum = rows / SPLIT_COUNT + 1;
        }

        for (int i = 1; i <= sheetNum; i++) {// 创建sheet
            HSSFSheet sheet = workBook.createSheet("Page " + i);
            HSSFRow headRow = sheet.createRow((short) 0); // 创建Row
            for (int j = 0; j < fieldName.size(); j++) {// 创建Cell
                HSSFCell cell = headRow.createCell((short) j);
                // 添加样式
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                // 防止中文高位截断
                cell.setEncoding(HSSFCell.ENCODING_UTF_16);
                if (fieldName.get(j) != null) {
                    cell.setCellValue((String) fieldName.get(j));
                } else {
                    cell.setCellValue("-");
                }
            }

            for (int k = 0; k < (rows < SPLIT_COUNT ? rows : SPLIT_COUNT); k++) {
                HSSFRow row = sheet.createRow((short) (k + 1));
                // 将数据内容放入excel单元格(filedData内存放的为集合元素,所以可以转型为ArrayList)
                ArrayList rowList = (ArrayList) fieldData.get((i - 1) * SPLIT_COUNT + k);
                for (int n = 0; n < rowList.size(); n++) {
                    HSSFCell cell = row.createCell((short) n);
                    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
                    if (rowList.get(n) != null) {
                        cell.setCellValue((String) rowList.get(n).toString());
                    } else {
                        cell.setCellValue("");
                    }
                }
            }
        }
        return workBook;
    }

    public void expordExcel(OutputStream os) throws Exception {
        workBook = createWorkbook();
        workBook.write(os);
        os.close();
    }

}

2.模仿从数据库中取得的数据,进行操作

package demo;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import oracle.net.aso.l;

public class TestExcelFileGenerator {
     public static void main(String[] args) throws Exception {
        ArrayList fieldName=new ArrayList<>();
        fieldName.add("名字");
        fieldName.add("学号");
        fieldName.add("地址");
        ArrayList fieldData=new ArrayList();
        List list=new ArrayList<>();
        List list2=new ArrayList<>();
        List list3=new ArrayList<>();
        //定义一个User对象,这个就明显可以从数据库中取得
        User user=new User("cole","123","cc");
        User user2=new User("steve", "123", "bb");
        User user3=new User("red", "123", "dd");
        list.add(user.getName());
        list.add(user2.getNumber());
        list.add(user3.getAddress());
        fieldData.add(list);
        list2.add(user.getName());
        list2.add(user2.getNumber());
        list2.add(user3.getAddress());
        fieldData.add(list2);//fieldData存储的数据类型是一个集合类型,其一个数据就代表一行

        ExcelFileGenerator fileGenerator=new ExcelFileGenerator(fieldName, fieldData);

        OutputStream os=new FileOutputStream(new File("D:/test/users.xls"));
        fileGenerator.expordExcel(os);
    }
}

PS:报表技术在实际开发中还是有一定的需求的。有任何问题,欢迎进行交流。

你可能感兴趣的:(技术交流)