poi excel下载工具类优化(利用LinkedHashMap和反射getDeclaredMethod)

25 篇文章 0 订阅
2 篇文章 0 订阅

目的:源代码重复代码过多,所以准备提取工具类。考虑用过数组等,但是Excel需要标题(中文)和对象属性对应关系,所以考虑LinkedHashMap方法按顺序提取,后利用getDeclaredMethod("show", null); 第一个参数时String方法名,第二个参数时输入参数,没有为空,后进行优化,根据属性得到get方法(getUsername 改为username 属性名)。

一、未优化前代码
 public static HSSFWorkbook excelExport(HSSFWorkbook workbook,List<LenovoShopAuthenticateClassResultVo> resultlist){
        //新建sheet
        HSSFSheet sheet = workbook.createSheet("sheet001");
        //设置行宽,列高
        sheet.setDefaultColumnWidth(20);
        sheet.setDefaultRowHeightInPoints(20);
        //新建标题行
        HSSFRow row0 =sheet.createRow(0);
        Cell cell0 = row0.createCell(0);
        cell0.setCellValue("编号");
        Cell cell1 = row0.createCell(1);
        cell1.setCellValue("名称");
        Cell cell2 = row0.createCell(2);
        cell2.setCellValue("类型");
        Cell cell3 = row0.createCell(3);
        cell3.setCellValue("申请级别");
        Cell cell4 = row0.createCell(4);
        cell4.setCellValue("上季度认证级别");
        Cell cell5 = row0.createCell(5);
        cell5.setCellValue("创建时间");
        Cell cell6 = row0.createCell(6);
        cell6.setCellValue("申请时间");
        Cell cell7 = row0.createCell(7);
       
        //给数据列赋值
        for (int i = 0; i < resultlist.size(); i++) {
            Row row =sheet.createRow(i+1);
            LenovoShopAuthenticateClassResultVo resultVo = resultlist.get(i);
            Cell cell11 = row.createCell(0);
            cell11.setCellValue(resultVo.getShopid());

            Cell cell12 = row.createCell(1);
            cell12.setCellValue(resultVo.getShopname());

            Cell cell13 = row.createCell(2);
            cell13.setCellValue(resultVo.getShoptype());

            Cell cell14 = row.createCell(3);
            cell14.setCellValue(resultVo.getShoplevelname());

            Cell cell15 = row.createCell(4);
            cell15.setCellValue(resultVo.getAuthenticateclassname());

            Cell cell16 = row.createCell(5);
            cell16.setCellValue(resultVo.getShopcreatedate().substring(0, 19));

            Cell cell17 = row.createCell(6);
            cell17.setCellValue(resultVo.getCreatedate().substring(0, 19));

            Cell cell18 = row.createCell(7);
            cell18.setCellValue(resultVo.getAuthenticatedate().substring(0, 19));

            }
        return workbook;
    }

2.按put顺序的map   

hashMap、treeMap和linkedHashMap,但是,要达到我们的要求:按添加顺序保存元素的,就只有LinkedHashMap

 

@Test
    public  void main(String[] args) {
        Map<String, Integer> hashMap = Maps.newHashMap();
        Map<String, Integer> treeMap = Maps.newTreeMap();
        Map<String, Integer> linkedHashMap = Maps.newLinkedHashMap();
        System.out.println("--------------test hashMap");
        testMap(hashMap);
        System.out.println("--------------test treeMap");
        testMap(treeMap);
        System.out.println("--------------test linkedHashMap");
        testMap(linkedHashMap);
    }

    private  void testMap(Map<String, Integer> map) {
        map.put("asd", 1);
        map.put("2das", 2);
        map.put("3das", 3);
        map.put("4das", 4);
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }

}

3.利用反射获取方法执行

public class AuthenticateClassServiceImpl {
@Test
    public void AuthenticateClass() throws Exception {
        // 创建一个Excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();

        List<Object> userModels = new ArrayList<>();
        UserModel zhangsan = new UserModel("zhangsan", "123");

    UserModel lishi = new UserModel("lisi", "456");
    UserModel o = new UserModel("uiooo", "8");
    UserModel ee = new UserModel("eee", "123");
    UserModel ff = new UserModel("ff", "123");
        userModels.add(zhangsan);
        userModels.add(lishi);
    userModels.add(o);
    userModels.add(ee);
    userModels.add(ff);

         Map<String,String> linkedHashMap = Maps.newLinkedHashMap();
         linkedHashMap.put("姓名","getUsername");
         linkedHashMap.put("密码","getPassword");

            for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }




        //取数据
        workbook = excelExport(workbook, userModels, linkedHashMap);

    }

    public static HSSFWorkbook excelExport(HSSFWorkbook workbook, List<Object> resultlist, Map<String,String> linkedHashMap) throws Exception {

        //新建sheet
        HSSFSheet sheet = workbook.createSheet("sheet001");
        //设置行宽,列高
        sheet.setDefaultColumnWidth(20);
        sheet.setDefaultRowHeightInPoints(20);
        //新建标题行



        for (int k= 0; k <= resultlist.size(); k++) {
            HSSFRow row = sheet.createRow(k);
            if (k == 0) {
                int i = 0;
                for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {

                    row.createCell(i).setCellValue(entry.getKey());

                    System.out.print(i + entry.getKey());
                    i++;
                    System.out.println("========");
                }
            } else {

                //给数据列赋值
                int j = 0;
                Object resultVo = resultlist.get(k-1);
                for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
                    //获取方法
                    Method m = resultVo.getClass().getDeclaredMethod(entry.getValue(),null);
                    //调用方法
                    String result = (String) m.invoke(resultVo);

                    row.createCell(j).setCellValue(result);

                    System.out.print(j + "--------"+result);
                    j++;
                    System.out.println("========");
                }

            }
        }

        return workbook;
    }
}

4.改进 

getUsername 改为username 属性名

 Map<String,String> linkedHashMap = Maps.newLinkedHashMap();
         linkedHashMap.put("姓名","username");
         linkedHashMap.put("密码","password");


import com.google.common.collect.Maps;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Test;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class AuthenticateClassServiceImpl {
@Test
    public void ShopAuthenticateClass() throws Exception {
        // 创建一个Excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();

        List<Object> userModels = new ArrayList<>();
        UserModel zhangsan = new UserModel("zhangsan", "123");

    UserModel lishi = new UserModel("lisi", "456");
    UserModel o = new UserModel("uiooo", "8");
    UserModel ee = new UserModel("eee", "123");
    UserModel ff = new UserModel("ff", "123");
        userModels.add(zhangsan);
        userModels.add(lishi);
    userModels.add(o);
    userModels.add(ee);
    userModels.add(ff);

         Map<String,String> linkedHashMap = Maps.newLinkedHashMap();
         linkedHashMap.put("姓名","username");
         linkedHashMap.put("密码","password");

            for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
                System.out.println(entry.getKey() + ":" + entry.getValue());
            }




        //取数据
        workbook = excelExport(workbook, userModels, linkedHashMap);

    }

    public static HSSFWorkbook excelExport(HSSFWorkbook workbook, List<Object> resultlist, Map<String,String> linkedHashMap) throws Exception {

        //新建sheet
        HSSFSheet sheet = workbook.createSheet("sheet001");
        //设置行宽,列高
        sheet.setDefaultColumnWidth(20);
        sheet.setDefaultRowHeightInPoints(20);
        //新建标题行



        for (int k= 0; k <= resultlist.size(); k++) {
            HSSFRow row = sheet.createRow(k);
            if (k == 0) {
                int i = 0;
                for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {

                    row.createCell(i).setCellValue(entry.getKey());

                    System.out.print(i + entry.getKey());
                    i++;
                    System.out.println("========");
                }
            } else {

                //给数据列赋值
                int j = 0;
                Object resultVo = resultlist.get(k-1);
                for (Map.Entry<String, String> entry : linkedHashMap.entrySet()) {
                    String result = null;
                    Method[] m = resultVo.getClass().getMethods();
                    for(int i = 0;i < m.length;i++){
                        if(("get"+entry.getValue()).toLowerCase().equals(m[i].getName().toLowerCase())){
                            result=(String)m[i].invoke(resultVo);
                        }
                    }


                    row.createCell(j).setCellValue(result);

                    System.out.print(j + "--------"+result);
                    j++;
                    System.out.println("========");
                }

            }
        }

        return workbook;
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
POI(Poor Obfuscated Implementation)是一款用于操作Microsoft Office格式文件的Java API库。它的目标是提供一种简单、快速、可靠的方式来读取、创建和编辑这些类型的文件,包括Excel、Word和PowerPoint等。 POI库中的HSSFWorkbook类用于操作Excel文件。开发者可以使用该类在内存中创建一个Excel文件,并将数据填充到不同的工作表和单元格中。此外,HSSFWorkbook也可以打开现有的Excel文件,以便进行编辑和保存。 为了将POI带入Excel,我们可以使用POI提供的API来实现Excel文件的下载。首先,我们需要创建一个HSSFWorkbook对象,并设置工作表的名字。然后,可以利用HSSFWorkbook对象创建一个或多个工作表,并填充所需的数据。最后,我们将HSSFWorkbook写入OutputStream或将其保存到本地文件中。这样,使用我们编写的代码,用户就可以下载包含所需数据的Excel文件。 例如,假设我们要从数据库中获取一些用户信息,并将其导出到Excel文件中进行下载。我们可以使用POI库提供的API来实现这个需求。首先,我们连接数据库并查询所需的用户信息。然后,我们创建一个HSSFWorkbook对象并设置一个工作表名称,比如“用户信息”。接下来,我们使用结果集将用户信息逐行填充到工作表的不同单元格中。最后,我们将HSSFWorkbook写入到OutputStream中,并将其作为一个可下载的文件返回给用户。 总之,POI是一个非常实用的工具类,可以帮助我们在Java应用程序中操作Excel文件。无论是创建、读取还是编辑ExcelPOI库都提供了简单且丰富的API来满足我们的需求。通过将POI带入Excel,我们可以方便地实现Excel文件的下载功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

javafanwk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值