工作用到的的两种报表导入方法

工作用到的的两种报表导入方法 

两种方法都是给予poi的

the one:

工作需要,导入几分不同的excel 文件 ,然后一个前辈给了一个半成品的工具类,用了一下,发现只有一部分功能,后来又自己重写成了一个通用的工具类,可以自动将excel数据封装成bean

不多说直接贴代码

package com.yida.common.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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 com.yida.ad.budget1.entity.DiffActualBudget;
import com.yida.xmlfee.entity.TBudgetSummary;

public class ExcelReaderUtil {

    private POIFSFileSystem fs;
    private HSSFWorkbook wb;
    private HSSFSheet sheet;
    private HSSFRow row;

    /**
     * 读取Excel表格表头的内容
     *
     * @param InputStream
     * @param titNum
     *            标题所在的行号
     * @return String 表头内容的数组
     */
    public String[] readExcelTitle(InputStream is, int titNum) {
        try {
            fs = new POIFSFileSystem(is);
            wb = new HSSFWorkbook(fs);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);
        row = sheet.getRow(titNum);

        // 标题总列数
        int colNum = row.getPhysicalNumberOfCells();
        System.out.println("colNum:" + colNum);
        String[] title = new String[colNum];
        for (int i = 0; i < colNum; i++) {
            // title[i] = getStringCellValue(row.getCell((short) i));
            title[i] = getCellFormatValue(row.getCell(i));
        }
        return title;
    }

    /**
     * 读取Excel数据内容
     *
     * @param InputStream
     * @param dataRow
     *            数据开始的行号
     * @return Map 包含单元格数据内容的Map对象
     */
    public Map<Integer, String> readExcelContent(InputStream is, int dataRow,int rowCount) {
        Map<Integer, String> content = new HashMap<Integer, String>();
        String str = "";
        try {
            fs = new POIFSFileSystem(is);
            wb = new HSSFWorkbook(fs);
        } catch (IOException e) {
            e.printStackTrace();
        }
        sheet = wb.getSheetAt(0);

        // 得到总行数
        int rowNum = sheet.getLastRowNum();

        row = sheet.getRow(0);
        int colNum = rowCount;

        // 正文内容应该从第二行开始,第一行为表头的标题
        for (int i = dataRow; i <= rowNum; i++) {
            row = sheet.getRow(i);
            int j = 0;
            while (j < colNum) {
                if(row ==null||row.getCell(0)==null||"".equals(row.getCell(0))){
                    break;
                }
                // 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据
                // 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean
                // str += getStringCellValue(row.getCell((short) j)).trim() +
                // "-";
                str += getCellFormatValue(row.getCell(j)).trim() + "-";
                j++;
            }
            content.put(i, str);
            str = "";
        }
        return content;
    }

    /**
     * 获取单元格数据内容为字符串类型的数据
     *
     * @param cell
     *            Excel单元格
     * @return String 单元格数据内容
     */
    public String getStringCellValue(HSSFCell cell) {
        String strCell = "";
        switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING:
            strCell = cell.getStringCellValue();
            break;
        case HSSFCell.CELL_TYPE_NUMERIC:
            strCell = String.valueOf(cell.getNumericCellValue());
            break;
        case HSSFCell.CELL_TYPE_BOOLEAN:
            strCell = String.valueOf(cell.getBooleanCellValue());
            break;
        case HSSFCell.CELL_TYPE_BLANK:
            strCell = "";
            break;
        default:
            strCell = "";
            break;
        }
        if (strCell.equals("") || strCell == null) {
            return "";
        }
        if (cell == null) {
            return "";
        }
        return strCell;
    }

    /**
     * 获取单元格数据内容为日期类型的数据
     *
     * @param cell
     *            Excel单元格
     * @return String 单元格数据内容
     */
    private String getDateCellValue(HSSFCell cell) {
        String result = "";
        try {
            int cellType = cell.getCellType();
            if (cellType == HSSFCell.CELL_TYPE_NUMERIC) {
                Date date = cell.getDateCellValue();
                result = (date.getYear() + 1900) + "-" + (date.getMonth() + 1)
                        + "-" + date.getDate();
            } else if (cellType == HSSFCell.CELL_TYPE_STRING) {
                String date = getStringCellValue(cell);
                result = date.replaceAll("[年月]", "-").replace("日", "").trim();
            } else if (cellType == HSSFCell.CELL_TYPE_BLANK) {
                result = "";
            }
        } catch (Exception e) {
            System.out.println("日期格式不正确!");
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 根据HSSFCell类型设置数据
     *
     * @param cell
     * @return
     */
    public String getCellFormatValue(HSSFCell cell) {
        String cellvalue = "?";
        if (cell != null) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
            // 如果当前Cell的Type为NUMERIC
            case HSSFCell.CELL_TYPE_NUMERIC:
            case HSSFCell.CELL_TYPE_FORMULA: {
                // 判断当前的cell是否为Date
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    // 如果是Date类型则,转化为Data格式

                    // 方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
                    // cellvalue = cell.getDateCellValue().toLocaleString();

                    // 方法2:这样子的data格式是不带带时分秒的:2011-10-12
                    Date date = cell.getDateCellValue();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    cellvalue = sdf.format(date);
                }
                // 如果是纯数字
                else {
                    // 取得当前Cell的数值
                    cellvalue = String.valueOf(cell.getNumericCellValue());
                }
                break;
            }
            // 如果当前Cell的Type为STRIN
            case HSSFCell.CELL_TYPE_STRING: {
                // 取得当前的Cell字符串
                if ("".equals(cell.getRichStringCellValue().getString().trim())) {
                    cellvalue = "?";
                } else
                    cellvalue = cell.getRichStringCellValue().getString();
                break;
            }
            // 默认的Cell值
            default:
                cellvalue = "?";
            }
        } else {
            cellvalue = "?";
        }
        return cellvalue;
    }

    /**
     *
     * @param c    需要转换的类型
     * @param parmsName   excel的数据对应bean的字段  {"findex","projectName","baoshenyusuan","gaisuanpifu","hejianMoney","remark"}
     * @param map         readExcelContent()生成的map对象
     * @param startCount  开始读的行  从0开始
     * @return
     */
    public static <T> List<T> getExcelBean(Class<T> c, String[] parmsName,
            Map map,int startCount) {
        List<T> list = new ArrayList<T>();

        for (int j = startCount; j <= map.size()+startCount-1; j++) {
            String values = (String) map.get(j);
            String[] value = values.split("-");

            T object = null;
            try {
                object = c.newInstance();

                for (int i = 0; i < parmsName.length; i++) {
                    if (!"?".equals(value[i])) {
                        Method readMethod = ReflectUtils.getReadMethod(c,
                                parmsName[i]);              //这里用了一些同事写好的工具类,获得该参数的get方法,拿去用的时候可以自己写一个生成get方法的方法
                        Class<?> fieldClass = readMethod.getReturnType();         //获得返回值类型的class对象
                        Method writeMethod = ReflectUtils.getWriteMethod(c,      //获得set方法
                                parmsName[i], fieldClass);
                        if (fieldClass.isAssignableFrom(Integer.class)) {             //根据不同的返回对象插入不同的数据
                            int aa = Integer.parseInt(value[i]);
                            writeMethod.invoke(object, aa);
                        } else if (fieldClass.isAssignableFrom(String.class)) {
                            writeMethod.invoke(object, value[i]);
                        } else if (fieldClass
                                .isAssignableFrom(BigDecimal.class)) {
                            BigDecimal aa = new BigDecimal(value[i]);
                            writeMethod.invoke(object, aa);
                        } else if (fieldClass.isAssignableFrom(Date.class)) {
                            SimpleDateFormat sdf = new SimpleDateFormat(
                                    "yyyy-MM-dd HH:mm:ss");
                            Date date = sdf.parse(value[i]);
                            writeMethod.invoke(object, date);
                        } else if (fieldClass.isAssignableFrom(Float.class)) {
                            Float aa = Float.parseFloat(value[i]);
                            writeMethod.invoke(object, aa);
                        }

                    }
                }
                list.add(object);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return list;
    }

    public static void main(String[] args) {
        try {
            // 对读取Excel表格标题测试
            InputStream is = new FileInputStream("e:\\222.xls");
            ExcelReaderUtil excelReader = new ExcelReaderUtil();
            String[] title = excelReader.readExcelTitle(is, 1);
            System.out.println("获得Excel表格的标题:");
            for (String s : title) {
                System.out.print(s + " ");
            }

            System.out.println("");
            System.out.println("==========================");
            // 对读取Excel表格内容测试
            InputStream is2 = new FileInputStream("e:\\222.xls");
            int startCount=2;
            String[] parmsName=new String[]{"num","projectName","authorizedAmount","trialAmount",
                     "diffTrialAmount","approvalAmount","diffApprovalAmount",
                     "budgetAmount","diffBudgetAmount","guokuAmount"};
            int rowCount=parmsName.length;
            Map<Integer, String> map =excelReader.readExcelContent(is2,startCount,rowCount);
            List<DiffActualBudget> list=ExcelReaderUtil.getExcelBean(DiffActualBudget.class,
                    parmsName,
                    map,startCount);
        } catch (FileNotFoundException e) {
            System.out.println("未找到指定路径的文件!");
            e.printStackTrace();
        }
    }
}

以上代码有一大部分是网络上一些大神的贡献的,在此谢谢他们的无私

the tow  根据模板导入数据生成bean,使用jxsl ,但是jsls还是基于 poi的

一,导入 jxls jar包 

二, 需要封装的bean

package E;
//一个简单的猫
public class Cat {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Cat [name=" + name + ", age=" + age + "]";
    }

}

EXCEL导入模板

<?xml version="1.0" encoding="utf-8" ?>
<workbook>
    <worksheet name="Sheet1">
        <section startRow="0" endRow="1"/>    <!--循环遍历 从index为2的行开始循环 -->
        <loop startRow="2" endRow="2" items="list" var="i" varType="E.Cat">
            <section startRow="2" endRow="2">
                <mapping row="2" col="0">i.name</mapping>
                <mapping row="2" col="1">i.age</mapping>
            </section>
<!-- 一旦每一行的第一列为空,则结束循环--> 
            <loopbreakcondition>
                <rowcheck offset="0">
                <cellcheck offset="0"></cellcheck>
                </rowcheck>
            </loopbreakcondition>
        </loop>
    </worksheet>

</workbook>

开始导入

package E;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jxls.reader.ReaderBuilder;
import net.sf.jxls.reader.XLSReader;
public class ExcelDemo {
 public static void main(String[] args) throws Exception{
        FileInputStream inputXLS=new FileInputStream(new File("d:\\cat.xls"));
        InputStream inputXML = new BufferedInputStream(Cat.class.getResourceAsStream("cat.xml"));    //读取上面的模板文件
        XLSReader mainReader = ReaderBuilder.buildFromXML(inputXML);
        //项目概况
        List<Cat> items1 = new ArrayList<>();
        Map<String, Object> beans = new HashMap<>();
        beans.put("list", items1);
        mainReader.read(inputXLS, beans);                 //将数据导入集合中
        for(Cat c:items1){
            System.out.println(c.toString());
        }
    }

}

两种方式都可以方便的导入excel文件,可自行选择

 

时间: 2024-10-11 04:51:12

工作用到的的两种报表导入方法的相关文章

Jmeter 的两种脚本录制方法

Jmeter 的两种脚本录制方法有一.通过badboy工具录制:二.通过Jmeter代理录制 一.通过badboy工具录制 1).工具下载地址:www.badboy.com.au/ 2).下载安装完成后,打开工具(工具默认开启录制),在地址栏输入被测项目的地址,点击右侧箭头即可录制 3).录制完成后,点击结束按钮,选择File--Export Jmeter ,最后的文件格式为.jmx类型 4).打开Jmeter工具,选择文件--打开,选择上一步保存的文件,文件即可成功导入进Jmeter 5).练

Android两种旋转Bitmap方法比较

方法1. 利用Bitmap.createBitmap Bitmap adjustPhotoRotation(Bitmap bm, final int orientationDegree) { Matrix m = new Matrix(); m.setRotate(orientationDegree, ( float ) bm.getWidth() / 2, ( float ) bm.getHeight() / 2); try { Bitmap bm1 = Bitmap.createBitmap

OnClickListener两种监听方法

1 //1种:接口OnClickListener ,在onclick响应 2 public class MainActivity extends Activity implements OnClickListener { //这个类前提要接口OnClickListener 3 4 private Button receive; //按钮的初始化 5 private Button falsewifiButton; 6 7 public void init(){ 8 receive=(Button)

Android——Fragment介绍及两种基本使用方法

今天在调ViewPager的时候,感觉ViewPager+Fragment这种做法更灵活,所以,现在拿出来Fragment再整理下. 一,为什么要用Fragment 1,灵活布局 Fragment表现Activity中用UI的一个行为或者一部分.可以组合多个fragment放在一个单独的activity中来创建一个多界面区域的UI,并可以在多个activity里重用某一个fragment.把fragment想象成一个activity的模块化区域,有它自己的生命周期,接收属于它的输入事件,并且可以

矩阵或多维数组两种常用实现方法 - python

在python中,实现多维数组或矩阵,有两种常用方法: 内置列表方法和numpy 科学计算包方法. 下面以创建10*10矩阵或多维数组为例,并初始化为0,程序如下: # Method 1: list arr1 = [[0]*10 for i in range(10)] arr1[0][0] = 1 print "Method 1:\n", arr1 arr2 = [[0 for i in range(10)] for i in range(10)] arr2[0][0] = 1 pri

UWP开发中两种网络图片缓存方法

通常情况下,我们的程序需要从服务器读取图片,但如果需要不止一次读取某一张图片的话,就需要做本地缓存了,这样既为用户省一点流量,又能显得你的APP很快. 假如你已经知道了某一张图片的地址,那么第一件事就是要把这张图片下载下来:当然如果是一次性读取的话,可以直接把图片地址给Image控件或者给Bitmapimage对象(实际上这二者是没有去别的),但这无法存到本地,只作为显示用:但是我们要做的是保存到本地,这样肯定是不行的.现在我们就要用到HTTP的东西了,请看下面的代码: async static

【iOS开发-网络】两种常用的方法解析XML数据

解析XML数据常用的有两种方法 第一种 使用Google的GDataXMLNode解析XML数据 使用的是DOM方式解析 先把xml一口吞掉 然后一点一点的解析 第二种 使用苹果自带的NSXMLParser解析XML数据 使用的是SAX方式解析 一个标记一个标记的解析 第一种使用步骤 第一步 首先把GDataXML文件夹放入项目中 第二步 更改Bulid Setting里面的东西 更改头文件搜索路径 在Header Search Paths里面添加路径/usr/include/libxml2 在

velocity两种map遍历方法

velocity 中list遍历比较简单,那么map遍历呢,这里举出两种velocity Map 遍历方法. 两种velocity遍历map java代码: soft属性:数量num,名字name Soft soft = new Soft("3","爱奇艺app"); softTypeMap{1,soft} 前端代码: 1: #foreach($item in $!softTypeMap.entrySet()) <option value="$!{i

Python中两种处理错误方法的比较

我所说的处理错误的方法,其实是try:,except和raise这两种. 首先抛出一个实例, dictt={'a':1,'b':2,'c':3} try: if dictt['d']>1: #字典中没有'd' print("right!") except KeyError: print("there is no 'd'") 该程序的运行结果: there is no 'd' 而改为raise时,执行结果却是: 显然,由于'f'是不存在的,所以if无法执行,导致