java的文件处理(POI)

本文介绍如何利用Java的POI库导出Excel文件,包括处理单元格合并和表头信息,详细展示了在Controller中操作Excel的步骤。

1.java导出Excel文件:

  1. 在Controller控制器中获取前台传过来的一些参数:
    public void exportApplyerStExcel() {
    		if (!IsPost()) {
                ///获取一些要用的参数
    			int year = this.getParaToInt("year");	
    			int op = this.getParaToInt("op");	
    			int zcbtp = this.getParaToInt("zcbtp");	
    			String jgbm = getDefaultOrgId();
    			System.out.println("jgbm2===="+jgbm);	
                ///具体下载逻辑在service中实现
    			String fileName = ReportService.exportApplyerStExcel(year,jgbm,op,zcbtp);
                ///返回下载的文件
    			renderFile(fileName);
    		} else {
    			this.renderText("null");
    		}
    	}
  2. 需要下载使用的表格的格式如下图:根据表格的格式生成每一行每一列,包括单元格合并以及表头信息
  3. 正式的生成表格:
    public static String exportApplyerStExcel(int year, String gljg,int op,int zcbtp) {
    	//获取需要在表格中填写的数据,返回类型是Record 
    	ZcglYwJbqkModel model = new ZcglYwJbqkModel(); // 
    	List<Record> contentList = model.GetApplyerSt(op,year,zcbtp,gljg); // select查询结果
        
    	ZcglYwTjbbModel mdl = new ZcglYwTjbbModel().findJgmc(gljg);	
    	String jgmc = mdl.getStr("gljg_mc");
    
        String	strAppClass = "按职称系列";
    
    	//创建excel工作簿	
    	HSSFWorkbook workbook = new HSSFWorkbook();
    	//创建第一个sheet(页),命名为 sheet1	
    	HSSFSheet sheet = workbook.createSheet("sheet1");
    
    	// 设置表格默认列宽度为20个字节	
    	sheet.setDefaultColumnWidth((short) 6);
    
    	// 设置第一列字体的大小
    	int fontSize = 600;// 10号字体为600
    	sheet.setColumnWidth(0, fontSize * 10);
        //设置第二列的宽度,,,第几行(列)都是从0开始算起
    	sheet.setColumnWidth(1, fontSize * 10);
    
    		
    		String[] columnHeads = { "","", "受理人数", "未审人数", "已审人数", "通过人数", "不通过人数", "退回修改中人数" };
    
    	// 设置表格格式样式
    	HSSFCellStyle cellStyle = workbook.createCellStyle();
    	cellStyle.setAlignment(HorizontalAlignment.CENTER); // 居中
     
    	// 字体样式
    	HSSFFont font = workbook.createFont();
    	font.setBold(true);
    	cellStyle.setFont(font);
    
    				
    	// 表格标题合并单元格//合并//第0行到第0行,第0列到第7列  的单元格
    	CellRangeAddress cra = new CellRangeAddress(0, 0, 0, 7);//到第七列
    
    	// 创建单元格、也可以说添加上面合并的单元格,范围有上面cra限定了
    	sheet.addMergedRegion(cra); 
    
    	HSSFRow row = sheet.createRow(0); // 创建表的第一行
    	HSSFCell cell = row.createCell(0); // 创建第一行的第一个单元格
    	cell.setCellStyle(cellStyle); // 设置第一行第一个单元格的字体样式
    
        //设置第一行	内的数据
    	cell.setCellValue(year + "年度"  + "申报人数("+strAppClass+")统计表");
    	///以上第一行的创建就完成了
    		
    
    	// 第二行、用于显示   数据截止统计时间:
        //同理根据上图的表,第二行也需要合并,合并的范围是 首行1到 尾行1   首列0到 尾列7
    	CellRangeAddress craStamp1 = new CellRangeAddress(1, 1, 0, 7);
    
    	//在本页中添加这个单元格
    	sheet.addMergedRegion(craStamp1);
        //获取单元格行数为1 的这一行
    	row = sheet.createRow(1);
        //获取单元格第row行的列数为0的这一行
    	cell = row.createCell(0);
    
    	///往第row行第cell列填上时间,下面是获取时间
    	Calendar cal=Calendar.getInstance();    
    	int y=cal.get(Calendar.YEAR);    
    	int m=cal.get(Calendar.MONTH)+1; 
    	int d=cal.get(Calendar.DATE); 
    	String mon,d1;
    	if(m<10) mon="0"+m;else mon=m+"";
    	if(d<10) d1="0"+d;else d1=d+"";
        //要填的时间
    	String  nowtime=""+y+mon+d1;
    	
        //往第row行第cell列填上时间	
    	cell.setCellValue("数据截止统计时间:" + nowtime + "                          " );
    	///以上第二行也就是行数为1  的单元格建立好了。
    
    	
    	// 产生表格标题行	该行的行数为2	
    	int rowColumnTopicStart = 2;
        //标题内容1
    	String[] columnHeadsOne = { strAppClass,"申报总人数", "省职称办受理与审查情况 " };
        //标题内容2
    	String[] columnHeadsTwo = { "受理人数", "未审人数", "已审人数", "通过人数", "不通过人数", "退回修改中人数"};
        
        //创建行数为2的单元格的合并   行数为2-3行,列数为0-0列  的单元格的合并
    	cra = new CellRangeAddress(rowColumnTopicStart, rowColumnTopicStart + 1, 0, 0);
        //添加这样的单元格
    	sheet.addMergedRegion(cra);////职称系列
    		
    	////创建行数为2的单元格的合并   行数为2-3行,列数为1-1列  的单元格的合并
        cra = new CellRangeAddress(rowColumnTopicStart, rowColumnTopicStart + 1, 1, 1);/
    	sheet.addMergedRegion(cra);////申报总人数
    
    	////创建行数为2的单元格的合并   行数为2-3行,列数为2-7列  的单元格的合并	
    	cra = new CellRangeAddress(rowColumnTopicStart, rowColumnTopicStart, 2, 7); 	
    	sheet.addMergedRegion(cra);  ////省职称办受理与审查情况
    		
    	///以上第三行 就生成完毕	,该行的每一列还没赋值
    
       // 给第三行设置样式
    	row = sheet.createRow(rowColumnTopicStart);
    	// 生成一个样式
    	HSSFCellStyle headStyle = workbook.createCellStyle();
    	headStyle.setAlignment(HorizontalAlignment.CENTER);
    	headStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    	// 把字体应用到当前的样式
    	headStyle.setFont(font);
    	headStyle.setWrapText(true); // 自动换行
    
        ///生成第三行的表头  上面只是创建了第三行,还没给里面赋值
    	//                                //长度为8
    		for (short i = 0, j = 0; i < columnHeads.length; i++) {
    			HSSFCell cellTopic = row.createCell(i);///创造列
    			cellTopic.setCellStyle(headStyle);///添加样式
    			HSSFRichTextString text = new HSSFRichTextString(columnHeadsOne[j]);
    			cellTopic.setCellValue(text);////给第三行的i=2到7的这几列赋值
    			if (i == 2) {
    				i += 7;
    			}
    			j++;
    		}
    		
    		
    		////创建第四行  rowColumnTopicStart =2,代表行数为2 的那一行,也就是第三行
    		row = sheet.createRow(rowColumnTopicStart + 1);
    		// 设置columnHeadsTwo
            ////给第四行里面的每列赋值
    		for (short i = 2, j = 0; i < columnHeads.length; i++) {		
    			HSSFCell cellTopic = row.createCell(i);
    			cellTopic.setCellStyle(headStyle);
    			HSSFRichTextString text = new HSSFRichTextString(columnHeadsTwo[j]);
    			cellTopic.setCellValue(text);
    			j++;
    		}
    		
    		///////////////////////////以上表头都设置完毕
    
    		///////////////////////////// 下面是设置表格内容
    
            ///从行数为4即第5 行开始填数据
    		int rowContentStart = 4;
            //样式
    		HSSFCellStyle contentCellStyle = workbook.createCellStyle();
    		contentCellStyle.setAlignment(HorizontalAlignment.LEFT); // 靠左
    		contentCellStyle.setWrapText(true);// 自动换行
    		contentCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
    		
    		HSSFRow rows = sheet.createRow(rowContentStart); // 创建第5行--用于存表格内容
    
    		//所有的数据都存放在contentList,中,这是一个Record数组,每一个元素是JSON串
            //model1用于存这个数组的每一个元素方便操作
    		Record model1 = new ZcglYwJbqkModel().toRecord(); 
    		
    		
    		int rowIndex = rowContentStart;
    
            //分理出contentList中的每一个元素赋值给modle1方便读取
    		for (int listIndex = 0;listIndex < contentList.size()
                    && rowIndex < contentList.size() + rowContentStart; 
    				listIndex++) {
    
    	         //分理出contentList中的每一个元素赋值给modle1方便读取			
    			model1 = contentList.get(listIndex); // 得到结果集第listIndex条记录
    			int cellNum = 8;
    			// 统一设置单元格样式
    
                /////////////下面是获取每一行的数据////////////////////////
    			String name = model1.get("name");////职称系列或者评委会名字
    			 BigDecimal number = new BigDecimal(0);
    			 
    			///申报总人数
    			BigDecimal m1 = model1.get("n1");	if(m1==null) m1=number;	
    			int n1=m1.intValue();
    			
    			BigDecimal m2 = model1.get("n2");	if(m2==null) m2=number;	
    			int n2=m2.intValue();
    			
    			BigDecimal m3 = model1.get("n3");	if(m3==null) m3=number;	
    			int n3=m3.intValue();
    			
    			BigDecimal m4 = model1.get("n4");	if(m4==null) m4=number;	
    			int n4=m4.intValue();
    			
    			BigDecimal m5 = model1.get("n5");	if(m5==null) m5=number;	
    			int n5=m5.intValue();
    			
    			BigDecimal m6 = model1.get("n6");	if(m6==null) m6=number;	
    			int n6=m6.intValue();
    			
    			int slrs = n2 + n3 ;////受理人数
                 /////////////获取每一行的数据完毕////////////////////////
    			
    			rows = sheet.createRow(rowIndex); // 创建表格的第rowIndex行
    			rows.setRowStyle(contentCellStyle);///设置样式
    				
    			List<HSSFCell> cellList = new ArrayList<HSSFCell>();
                
                
    			///创建当前行的每一列	
    
    				for (int cellCI = 0; cellCI < cellNum; cellCI++) {////在第四行创建8列
    					HSSFCell contentCell = rows.createCell(cellCI);
    					contentCell.setCellStyle(contentCellStyle);
    					cellList.add(contentCell);
    				}
                   ///给当前行的每一列写入数据 
    			    cellList.get(0).setCellValue(name);
    				cellList.get(1).setCellValue(n1);///申报总人数
    				cellList.get(2).setCellValue(slrs);//受理人数
    				cellList.get(3).setCellValue(n2);//////未审人数
    				cellList.get(4).setCellValue(n3);////已审人数n3=n4+n5+n6
    				cellList.get(5).setCellValue(n4);//通过人数
    				cellList.get(6).setCellValue(n5);////不通过人数
    				cellList.get(7).setCellValue(n6);//退回修改中人数
    				rowIndex++;
    		}
    		
            //获取路径
    		String str = JFinal.me().getServletContext().getRealPath("/");
    		String fileName = "";
    		///设置下载的文件名
    		fileName = "申报人数(职称系列)统计表.xls";
    	
    
    		try { ///生成文件输出流  
    			FileOutputStream xlsStream = 
    new FileOutputStream(str + File.separator + "download" + File.separator + fileName);
                
                //把输出流写入Excel工作簿中
    			workbook.write(xlsStream);
    			xlsStream.close();
    			workbook.close();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		// 生成Excel-结束
    		return fileName;
    	}

     

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值