首页 > 代码库 > poi 架包导出excel,并下载

poi 架包导出excel,并下载

导出excel在许多系统中都有应用到,这里以两个简单例子作为介绍:

1、导入poi-3.9.jar,可以在官网下载http://poi.apache.org 。

2、先写一个简单的测试类,里面有详细的解释,代码如下: 

 1 import java.io.FileOutputStream; 2 import java.io.IOException; 3 import org.apache.poi.hssf.usermodel.HSSFCell; 4 import org.apache.poi.hssf.usermodel.HSSFRow; 5 import org.apache.poi.hssf.usermodel.HSSFSheet; 6 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 7 import org.junit.Test; 8  9 public class outputExcel {10     @Test11     public void outPutExcel() throws IOException{12         FileOutputStream fos=new FileOutputStream("D://data.xls");13         //写入excel的数据,这个数据你根据自己的情况,从数据库中读取。14         String[][] data=http://www.mamicode.com/{{"0001","xx局","00"},{"0002","xx局A机构","00"},{"0003","xx局B机构","00"}};15         HSSFWorkbook workBook=null;16         String[] title={"单位代码","单位名称","上级单位代码"}; //excel第一行的标题17         workBook=new HSSFWorkbook();   //创建Excel18         HSSFSheet sheet=workBook.createSheet("导出数据情况");     //工作表19         HSSFRow row=sheet.createRow(0);        //行,默认从0开始20         HSSFCell cell=null;     //列,和行对应,每次创建一行,就要创建与该行对应的列21         //第一行输入标题22         for(int j=0;j<title.length;j++){23             cell=row.createCell(j);24             cell.setCellValue(title[j]);25         }26         //写入数据到excel27         for(int t=0;t<data.length;t++){28             row=sheet.createRow(t+1);     //从第二行开始创建,前面已经创建过第一行标题29             for(int k=0;k<3;k++){30                 cell=row.createCell(k);31                 cell.setCellValue(data[t][k]);32             }33         }34         try {35             workBook.write(fos);    //将excel通过数据流写出36             fos.flush();37             fos.close();38         }finally{39             if(fos!=null){40                 fos.flush();41                 fos.close();42             }43         }44     }45 }

 

运行上面的代码就可以在D盘看到data.xls这个导出文件了。

打开如下:
技术分享

在这里还要强调一点:在为列设置值的时候有人往往使用 cell.setCellValue(new HSSFRichTextString(title[j])); 这是很不好的习惯,因为如果数据量很大,那么new HSSFRichTextString()就可能导致内存崩溃。

3、上面这种方式是写死的路径导出,而且在实际应用中往往不会这么写的,excel文件要么保存在服务器的某个文件下,要么从数据库中获取数据来创建,然后用户通过下载来获取。

下面就来介绍,在service层返回一个workBook给controller层实现下载,代码如下:

 1 @Service 2 public class OutPutExcelService { 3     @Autowired 4     private AccBookDao accBookDao; 5     @Autowired 6     private AssetCardDao assetCardDao; 7     @Autowired 8     private GlDefDao glDefDao; 9     @Autowired10     private IpCompanyDao ipCompanyDao;11     12     @SuppressWarnings("unchecked")13     public HSSFWorkbook outPutExcel(String nd,String co_code){14         HSSFWorkbook workBook=null;15         String[] title={"单位代码","单位名称","上级单位代码","公共档案","总账数据","固定资产数据"};16         //参数定义17         Map<String, Object> param=new HashMap<String, Object>();18         param.put("co_code", co_code);19         //获取单位代码、单位名称、上级单位代码20         List<PageVo> dwList=ipCompanyDao.findPageByCode(param);21         //根据dwList查询其他表数据22         List<String> data=http://www.mamicode.com/new ArrayList<String>();23         for(int i=0;i<dwList.size();i++){24             data.add(dwList.get(i).getCo_code());25             data.add(dwList.get(i).getCo_name());26             27             String dw_code=dwList.get(i).getCo_code();28             Map<String, Object> param2=new HashMap<String, Object>();29             param2.put("nd", nd);30             param2.put("dw_code", dw_code);31             32             data.add(ipCompanyDao.selectPCoCode(dw_code));33             34             if(accBookDao.selectAccBookNo(param2)!=null){35                 data.add("已导入");36             }else{37                 data.add("无");38             }39             if(glDefDao.selectAccBookNo(param2)!=null){                40                 data.add("已导入");41             }else{42                 data.add("无");43             }44             if(assetCardDao.selectAssetNo(param2)!=null){45                 data.add("已导入");                46             }else{47                 data.add("无");48             }49         }    50         workBook=new HSSFWorkbook();   //创建Excel51         HSSFSheet sheet=workBook.createSheet("导出数据情况");     //工作表52         HSSFRow row=sheet.createRow(0);        //53         HSSFCell cell=null;     //54         //第一行输入标题55         for(int j=0;j<title.length;j++){56             cell=row.createCell(j);57             cell.setCellValue(title[j]);58         }59         //写入数据到excel60         for(int t=0;t<data.size()/6;t++){61             row=sheet.createRow(t+1);62             for(int k=0;k<6;k++){63                 cell=row.createCell(k);64                 cell.setCellValue(data.get(t*6+k));65             }66         }67         return workBook;68     }69 }

 

这里返回一个workBook给controller层,然后controller层调用这个方法获取,实现获取前台数据和返回数据给前台。http://www.cnblogs.com/yaket/p/5830531.html

poi 架包导出excel,并下载