1. package com.jianwu.util.excel;
  2.  
  3. import com.google.common.collect.Lists;
    import com.jianwu.exception.MobileException;
    import com.jianwu.util.excel.annotation.ExcelAttribute;
    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;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    import org.apache.poi.ss.usermodel.Cell;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
  4.  
  5. import java.io.*;
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.List;
  6.  
  7. /**
    * poi工具类
    * Created by tookbra on 2016/3/30.
    */
    public class PoiUtil<T> {
    private static final Logger logger = LoggerFactory.getLogger(PoiUtil.class);
    // private static final String templatePath = "excel/template.txt";
    private static String templatePath = "excel/template.txt";
  8.  
  9. Class<T> clazz;
  10.  
  11. public PoiUtil(Class<T> clazz) {
    this.clazz = clazz;
    }
  12.  
  13. public PoiUtil(Class<T> clazz, String templatePath) {
    this.clazz = clazz;
    this.templatePath = templatePath;
    }
  14.  
  15. public static List excelList = null;
  16.  
  17. static {
    if(excelList == null)
    excelList = read(templatePath);
    }
  18.  
  19. /**
    * 配置文件的读取
    *
    * @param fileName
    * 文件名称
    * @return List 文件内容存放code,name格式
    */
    public static List read(String fileName) {
    File file = new File(PoiUtil.class.getClassLoader().getResource(PoiUtil.templatePath).getFile());
    List list = Lists.newArrayList();
    if (file != null) {
    if (file.exists()) {
    try {
    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
    String str = null;
    while ((str=br.readLine())!=null) {
    list.add(str);
    }
    }
    catch (Exception e) {
    logger.error("读取excel文本错误:{}", e.getMessage());
    }
    }
    else {
    logger.error("读取excel文本错误,文件不存在");
    System.out.println(fileName + "not exits");
    }
    }
    return list;
    }
  20.  
  21. public static String subText(String str,String field) {
    try{
    if (str == null || str.length() == 0 || field == null || field.length() == 0)
    return str;
    for(int i = 0;i<str.length();i++){
    if(field.indexOf(str.charAt(i)) != -1){
    return str.substring(0,i);
    }
    }
    }catch(Exception ex){
    logger.error("分割截取字符串时发生错误:{}", ex.getMessage());
    }
    return str;
    }
  22.  
  23. /**
    * 获取单元格内值
    * @param cell 单元格
    * @return
    */
    public static String getCellValue(Cell cell) {
    Object obj = "";
    switch (cell.getCellType()) {
    case Cell.CELL_TYPE_STRING :
    obj = cell.getStringCellValue();
    break;
    case Cell.CELL_TYPE_NUMERIC :
    obj = cell.getNumericCellValue();
    break;
    case Cell.CELL_TYPE_ERROR :
    obj = cell.getErrorCellValue();
    break;
    case Cell.CELL_TYPE_FORMULA :
    obj = cell.getCellFormula();
    break;
    case Cell.CELL_TYPE_BOOLEAN :
    obj = cell.getBooleanCellValue();
    break;
    case Cell.CELL_TYPE_BLANK:
    break;
    }
    return String.valueOf(obj).trim();
    }
  24.  
  25. public HSSFWorkbook exportExcel(List<T> list) throws IOException, IllegalAccessException {
    // excel中每个sheet中最多有65536行
    int sheetSize = 65536;
  26.  
  27. HSSFWorkbook wb = new HSSFWorkbook();
    HSSFSheet sheet = wb.createSheet();
    int listSize = 0;
    if (list != null && list.size() >= 0) {
    listSize = list.size();
    }
    int endNo = Math.min(1 + sheetSize, listSize);
    HSSFRow row;
    // 得到所有定义字段
    Field[] allFields = clazz.getDeclaredFields();
    List<Field> fields = new ArrayList<Field>();
    // 得到所有field并存放到一个list中
    for (Field field : allFields) {
    if (field.isAnnotationPresent(ExcelAttribute.class)) {
    fields.add(field);
    }
    }
    HSSFCell cell;// 产生单元格
    row = sheet.createRow(0);// 产生一行
    // 写入各个字段的列头名称
    for (int i = 0; i < fields.size(); i++) {
    Field field = fields.get(i);
    ExcelAttribute attr = field
    .getAnnotation(ExcelAttribute.class);
    int col = getExcelCol(attr.column());// 获得列号
    cell = row.createCell(col);// 创建列
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);// 设置列中写入内容为String类型
    cell.setCellValue(attr.value());// 写入列名
    }
  28.  
  29. logger.info("导出{}条数据", endNo);
    for (int i = 0; i < endNo; i++) {
    row = sheet.createRow(i + 1);
    // 得到导出对象.
    T vo = (T) list.get(i);
    for (int j = 0; j < fields.size(); j++) {
    Field field = fields.get(j);// 获得field.
    field.setAccessible(true);// 设置实体类私有属性可访问
    ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
    if (attr.isExport()) {
    cell = row.createCell(getExcelCol(attr.column()));// 创建cell
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellValue(field.get(vo) == null ? ""
    : String.valueOf(field.get(vo)));// 如果数据存在就填入,不存在填入空格.
    //sheet.autoSizeColumn(j);//自动列宽
    }
    }
    }
    return wb;
    }
  30.  
  31. /**
    *
    * @param templatePath
    * @param sheetName
    * @param list
    * @throws IOException
    * @throws IllegalAccessException
    */
    public HSSFWorkbook exportExcel(String templatePath, String sheetName, List<T> list)
    throws IOException, IllegalAccessException {
    // excel中每个sheet中最多有65536行
    int sheetSize = 65536;
    File file = new File(this.getClass().getClassLoader().getResource(templatePath).getFile());
    if(!file.exists()){
    System.out.println("模板文件:" + templatePath + "不存在!");
    throw new MobileException("","");
    }
    POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(file));
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheet(sheetName);
    int listSize = 0;
    if (list != null && list.size() >= 0) {
    listSize = list.size();
    }
    int endNo = Math.min(2 + sheetSize, listSize);
    HSSFRow row;
    // 得到所有定义字段
    Field[] allFields = clazz.getDeclaredFields();
    List<Field> fields = new ArrayList<Field>();
    // 得到所有field并存放到一个list中
    for (Field field : allFields) {
    if (field.isAnnotationPresent(ExcelAttribute.class)) {
    fields.add(field);
    }
    }
    HSSFCell cell;// 产生单元格
    logger.info("导出{}条数据", endNo);
    for (int i = 0; i < endNo; i++) {
    row = sheet.createRow(i + 2);
    // 得到导出对象.
    T vo = (T) list.get(i);
    for (int j = 0; j < fields.size(); j++) {
    Field field = fields.get(j);// 获得field.
    field.setAccessible(true);// 设置实体类私有属性可访问
    ExcelAttribute attr = field.getAnnotation(ExcelAttribute.class);
    if (attr.isExport()) {
    cell = row.createCell(getExcelCol(attr.column()));// 创建cell
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
    cell.setCellValue(field.get(vo) == null ? ""
    : String.valueOf(field.get(vo)));// 如果数据存在就填入,不存在填入空格.
    }
    }
    }
    return wb;
    }
  32.  
  33. /**
    * 将EXCEL中A,B,C,D,E列映射成0,1,2,3
    *
    * @param col
    */
    public static int getExcelCol(String col) {
    col = col.toUpperCase();
    // 从-1开始计算,字母重1开始运算。这种总数下来算数正好相同。
    int count = -1;
    char[] cs = col.toCharArray();
    for (int i = 0; i < cs.length; i++) {
    count += (cs[i] - 64) * Math.pow(26, cs.length - 1 - i);
    }
    return count;
    }
  34.  
  35. }

excel导出工具类的更多相关文章

  1. 基于jdk1.7实现的excel导出工具类

    通用excel导出工具类,基于泛型.反射.hashmap 以及基于泛型.反射.bean两种方式 import java.io.*;import java.lang.reflect.Field;impo ...

  2. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  3. EXCEL导出工具类及调用

    一.Excel导出工具类代码 package com.qiyuan.util; import java.io.OutputStream; import java.io.UnsupportedEncod ...

  4. 自己写的java excel导出工具类

    最近项目要用到excel导出功能,之前也写过类似的代码.因为这次项目中多次用到excel导出.这次长了记性整理了一下 分享给大伙 欢迎一起讨论 生成excel的主工具类: public class E ...

  5. 一个很好的通用 excel 导出工具类

    此类用主要 jxl +注解+流 实现扩展性很强,jxl性能会比poi好一点,值得我们学习. package oa.common.utils; import java.io.OutputStream; ...

  6. 一个基于POI的通用excel导入导出工具类的简单实现及使用方法

    前言: 最近PM来了一个需求,简单来说就是在录入数据时一条一条插入到系统显得非常麻烦,让我实现一个直接通过excel导入的方法一次性录入所有数据.网上关于excel导入导出的例子很多,但大多相互借鉴. ...

  7. Java基础学习总结(49)——Excel导入导出工具类

    在项目的pom文件中引入 <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifac ...

  8. 使用Apache poi来编写导出excel的工具类

    在JavaWeb开发的需求中,我们会经常看到导出excel的功能需求,然后java并没有提供操作office文档的功能,这个时候我们就需要使用额外的组件来帮助我们完成这项功能了. 很高兴Apache基 ...

  9. 通用Excel文件导出工具类

    1:Excel格式 2:ExcelUtil.java import java.io.ByteArrayOutputStream; import java.io.IOException; import ...

随机推荐

  1. maven打包时加入依赖包及加入本地依赖包

    maven打包的时候默认是不加入依赖的jar包的,所以想打出一个独立的可运行jar包的话直接mvn clean install package是不行的.需要略改动下pom文件,加入如下plugin & ...

  2. C# 反射只获取自己定义的属性,不获取父类的属性

    PropertyInfo[] p = user.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public | Bi ...

  3. 使用AsParallel 进行并行化处理数据

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  4. node.js express安装问题

    Windows下安装npm和express 1.如果不能在线安装,可以下载npm的zip解压到本地,然后把下面的bin目录加入到path中. 2.搞定npm后,执行了npm install expre ...

  5. python selenium --处理下拉框

    下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项. drop_down.html <html&g ...

  6. 英文版windows乱码问题(win7/8/10)

  7. boost thread

    #include <cassert> #include <iostream> #include <boost/ref.hpp> #include <boost ...

  8. 0050 MyBatis关联映射--一对多关系

    一对多关系更加常见,比如用户和订单,一个用户可以有多个订单 DROP TABLE IF EXISTS customer; /*用户表*/ CREATE TABLE customer( `pk` INT ...

  9. Linux之手动设置IP地址

    一.引言 有时候我们装好了机器却发现网络没有设置,而服务器的机器一般都是没有界面的,那么该如何设置IP呢? 二.步骤 root用户,#vi /etc/sysconfig/network-scripts ...

  10. 堆积木----vector防止内存超限

    蒜头君有 nn 块积木,编号分别为 11 到 nn.一开始,蒜头把第 ii 块积木放在位置 ii.蒜头君进行 mm 次操作,每次操作,蒜头把位置 bb 上的积木整体移动到位置 aa 上面.比如 11  ...