文档章节

java使用POI处理EXCEL的核心类(二)

卯金刀GG
 卯金刀GG
发布于 2016/10/13 16:39
字数 832
阅读 19
收藏 0

接上一篇写了使用poi导出excel,今天把读取excel的方法补上,核心类如下:

package cn.qazit.common.utils;

import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; 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.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.internal.runners.statements.ExpectException;

import cn.qazit.app.core.charge.model.ZywsptGfxwjb; import cn.qazit.common.bean.ExportFiledsBean;

/**

  • 导出的公共类

  • @ClassName:ExportUtil.java

  • @Title:ExportUtil.java

  • @Description:

  • @CopyRight:CopyRight(c)2016

  • @Company:www.qazit.cn

  • @author

  • @date 2016年10月11日 下午7:14:05

  • @version:v1.0 */ public class ExportUtil {

    /**

    • 导出的通用方法

    • @param sheet1

    • @param title

    • @param clazz

    • @param list

    • @return

    • @throws IOException

    • @throws ClassNotFoundException

    • @throws SecurityException

    • @throws NoSuchMethodException

    • @throws IllegalArgumentException

    • @throws Exception */ public static byte[] export(String sheet1, String title, Class<?> clazz,List<?> list) throws IOException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, Exception{ ByteArrayOutputStream out = new ByteArrayOutputStream(); // 第一步,创建一个webbook,对应一个Excel文件
      HSSFWorkbook wb = new HSSFWorkbook(); // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
      HSSFSheet sheet = wb.createSheet(sheet1); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short

      HSSFRow row = sheet.createRow((int) 0); // 第四步,创建单元格,并设置值表头 设置表头居中
      HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式

      //设置表头
      List<ExportFiledsBean> excelHead = getExcelHead(clazz); Class _class = createClazz(clazz);

      HSSFCell cell = null; // excel头
      for (int i = 0; i < excelHead.size(); i++) {
      ExportFiledsBean exportFiledsBean = excelHead.get(i); cell = row.createCell(i);
      cell.setCellValue(exportFiledsBean.getName());
      cell.setCellStyle(style); }

      for (int i = 0;i<list.size();i++) { row = sheet.createRow((int) i + 1); Object obj = (Object) list.get(i); for(int j=0;j<excelHead.size();j++) { ExportFiledsBean exportFiledsBean = excelHead.get(j); String getFuncName = exportFiledsBean.getGetFuncName();

       	Method addMethod = _class.getMethod(getFuncName);
       	Object result = addMethod.invoke(obj);
       	if(result==null)
       	{
       		row.createCell((int) j).setCellValue("");
       	}else{
       		row.createCell((int) j).setCellValue(result.toString());
       	}
       }
      

      } wb.write(out); // 第五步,写入实体数据 实际应用中这些数据从数据库得到 return out.toByteArray(); }

    private static List<ExportFiledsBean> getExcelHead(Class<?> clazz){ return AunotationUtil.getExportFileds(clazz); }

    private void insertCell(HSSFRow row,int i,Object object){
    if(object==null){
    row.createCell(i).setCellValue("");
    }else{
    row.createCell(i).setCellValue(object.toString());
    }

    }

    /**

    • 读取excel

    • @param fileName

    • @param clazz

    • @return

    • @throws ClassNotFoundException

    • @throws SecurityException

    • @throws NoSuchMethodException

    • @throws IllegalArgumentException

    • @throws Exception

    • @throws InvocationTargetException */ public static List<?> readExport(String fileName,Class<?> clazz) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, Exception, InvocationTargetException{ List<Object> list = new ArrayList<Object>(); List<ExportFiledsBean> excelHead = getExcelHead(clazz);

      Class _class = createClazz(clazz);

      boolean isE2007 = false; //判断是否是excel2007格式
      if(fileName.endsWith("xlsx"))
      isE2007 = true;
      try {
      InputStream input = new FileInputStream(fileName); //建立输入流 Workbook wb = creatWorkbook(isE2007,input);
      //根据文件格式(2003或者2007)来初始化
      Sheet sheet = wb.getSheetAt(0); //获得第一个表单
      Iterator<Row> rows = sheet.rowIterator(); //获得第一个表单的迭代器
      while (rows.hasNext()) {
      Row row = rows.next(); //获得行数据
      int rowNum = row.getRowNum(); if(rowNum>0) { Object obj = _class.newInstance(); Iterator<Cell> cells = row.cellIterator(); //获得第一行的迭代器
      while (cells.hasNext()) {
      Cell cell = cells.next();

                   int cellColumnIndex = cell.getColumnIndex();
      
                   for(int i=0;i<excelHead.size();i++)
                   {   
                   	ExportFiledsBean exportFiledsBean = excelHead.get(i);
                   	int order = exportFiledsBean.getOrder();
                   	if(order==cellColumnIndex)
                   	{  
                   		String fitFuncName =  exportFiledsBean.getFitFuncName();
                           obj = addObjctList(cell,fitFuncName,obj,_class);
                   	}
                   }
               } 
               list.add(obj);
           }
       }  
      

      } catch (IOException ex) {
      ex.printStackTrace();
      }
      return list; }

    private static Workbook creatWorkbook(boolean isE2007,InputStream input) throws IOException { Workbook wb = null; if(isE2007)
    wb = new XSSFWorkbook(input);
    else
    wb = new HSSFWorkbook(input);

    return wb;
    

    } /**

    • 使用反射机制创建对象
    • @param clazz
    • @return
    • @throws ClassNotFoundException */ private static Class createClazz(Class<?> clazz) throws ClassNotFoundException { String clazzName = clazz.getName(); Class _class = Class.forName(clazzName); return _class; }

    /**

    • 对象赋值
    • @param cell
    • @param addMethod
    • @param obj
    • @return
    • @throws IllegalArgumentException
    • @throws IllegalAccessException
    • @throws InvocationTargetException
    • @throws NoSuchMethodException
    • @throws SecurityException / private static Object addObjctList(Cell cell,String fitFuncName,Object obj,Class _class) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException, SecurityException, NoSuchMethodException{ Method addMethod = null; switch (cell.getCellType()) { //根据cell中的类型来输出数据
      case HSSFCell.CELL_TYPE_NUMERIC:
      addMethod = _class.getMethod(fitFuncName,new Class[]{double.class}); addMethod.invoke(obj,cell.getNumericCellValue()); break;
      case HSSFCell.CELL_TYPE_STRING:
      addMethod = _class.getMethod(fitFuncName,new Class[]{String.class}); addMethod.invoke(obj,cell.getStringCellValue()); break;
      case HSSFCell.CELL_TYPE_BOOLEAN:
      addMethod = _class.getMethod(fitFuncName,new Class[]{boolean.class}); addMethod.invoke(obj,cell.getBooleanCellValue()); break;
      case HSSFCell.CELL_TYPE_FORMULA:
      addMethod = _class.getMethod(fitFuncName,new Class[]{String.class}); addMethod.invoke(obj,cell.getCellFormula()); break;
      default:
      addMethod = _class.getMethod(fitFuncName,new Class[]{String.class}); addMethod.invoke(obj,""); break;
      }
      return obj; } public static void main(String[] args) throws SecurityException, IllegalArgumentException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, Exception { List<ZywsptGfxwjb> list = (List<ZywsptGfxwjb>) readExport("D:/05download/例子/职业病基础知识.xls", ZywsptGfxwjb.class); System.out.println("结果对象
      **"); for(ZywsptGfxwjb z:list) { System.out.println(z.getMc()); } }

}

© 著作权归作者所有

卯金刀GG
粉丝 26
博文 266
码字总数 73176
作品 0
昌平
程序员
私信 提问
使用 Apache POI 和 OpenOffice API 在 Linux 中统计 Office 文档的页数

简介: 在实际的项目开发中经常会遇到需要在不同的操作系统平台上统计 Microsoft Office 系列文档页数的要求。Apache POI 提供了一套完整的用于访问微软格式文档的 Java API。但是 Apache P...

IBMdW
2012/10/26
1K
0
Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表

在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式。不仅仅简单的读取office中的数据.尤其是在生产管理...

长平狐
2012/11/12
1K
0
使用 Apache 的 POI 和 HSSF 将 Excel 电子表格数据加载到 DB2

简介 在 developerWorks DB2 上本文的 先行篇 中,我们研究了 Apache 的 POI 项目的开放源代码产品。期间,我们开始在了解 SQL 的技术专家和通常将电子表格选作工具的商务专家之间架起一座桥...

红薯
2008/12/05
956
0
使用 Apache POI 处理 Microsoft Office 文档

原文同步至:http://www.waylau.com/apache-poi-handle-microsoft-documents/ POI 概述 Apache POI 项目的使命是创造和维护 Java API 操纵各种格式的文件,其中包括基于 Office Open XML 标准...

waylau
2015/02/01
1K
3
Java Apache POI 操作 Excel 导出

版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82655653 Java Apache POI 操作 Excel 导出 Java 可以通过 Apache POI......

asing1elife
2018/09/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
9
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部