• excel导出工具类


    package com.jianwu.util.excel;

    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;

    import java.io.*;
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.List;

    /**
    * 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";

    Class<T> clazz;

    public PoiUtil(Class<T> clazz) {
    this.clazz = clazz;
    }

    public PoiUtil(Class<T> clazz, String templatePath) {
    this.clazz = clazz;
    this.templatePath = templatePath;
    }


    public static List excelList = null;

    static {
    if(excelList == null)
    excelList = read(templatePath);
    }


    /**
    * 配置文件的读取
    *
    * @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;
    }

    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;
    }

    /**
    * 获取单元格内值
    * @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();
    }

    public HSSFWorkbook exportExcel(List<T> list) throws IOException, IllegalAccessException {
    // excel中每个sheet中最多有65536行
    int sheetSize = 65536;

    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());// 写入列名
    }

    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;
    }

    /**
    *
    * @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;
    }

    /**
    * 将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;
    }

    }
  • 相关阅读:
    成为java程序员的学习过程
    解决自动添加局域网内打印机的问题
    通过主机标头实现多个SharePoint Web应用程序共用一个端口
    MSDN教学短片WPF 3(WPF的图形透明效果)
    MSDN 教学短片 WPF 14(2D动画之—Trigger)
    MSDN 教程短片 WPF 8(WPF样式与资源)
    MSDN 教学短片WPF 5(Linear/RadialGradientBrush)
    MSDN 教学短片 WPF 12(画布)
    MSDN 教学短片WPF 4(笔刷)
    MSDN 教程短片 WPF 17(简单播放器的制作)
  • 原文地址:https://www.cnblogs.com/YuyuanNo1/p/8441054.html
Copyright © 2020-2023  润新知