导出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 @Test 11 public void outPutExcel() throws IOException{ 12 FileOutputStream fos=new FileOutputStream("D://data.xls"); 13 //写入excel的数据,这个数据你根据自己的情况,从数据库中读取。 14 String[][] data={{"0001","xx局","00"},{"0002","xx局A机构","00"},{"0003","xx局B机构","00"}}; 15 HSSFWorkbook workBook=null; 16 String[] title={"单位代码","单位名称","上级单位代码"}; //excel第一行的标题 17 workBook=new HSSFWorkbook(); //创建Excel 18 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 //写入数据到excel 27 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 @Autowired 10 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=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(); //创建Excel 51 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 //写入数据到excel 60 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
时间: 2024-10-11 17:52:48