poi读取excel模板,并填充数据

一、POI介绍

        Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

基本功能:

HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。

下载地址:

1、Apache官网:https://poi.apache.org/download.html
2、https://archive.apache.org/dist/poi/release/bin/


二、功能详解

        首先,在项目内部有一个excel表格模板,本项目后缀名使用的是.xlsx,在WebRoot目录下新建一个文件夹formmb,存放这个表格模板,此表格模板内无数据,但有一些相应的列名作为解释,目的就是读取这个模板,然后把从数据库取出的数据填充到相应的表格。
        读取表格模板后,有两种方式填充数据
一种是,需要填充数据的单元格固定,有具体的坐标;
另一种是,需要填充的单元格以行的形式,根据数据的条数逐条增行.

解释:

在表格中的sheet页数,从0开始,即第一个sheet页为0;
行数和列数也是从0开始
比如:(1.2.1) 表示:第二个sheet页第三行第二列


三、代码演示:

1、准备工作

前提准备:先把表格模板放在新建的文件下
如图:
在这里插入图片描述
表格中有种方式需要读取并填充数据,这里展示两种样式:
1、固定坐标填充数据
poi读取excel模板,并填充数据_第1张图片

2、以行形式填充
poi读取excel模板,并填充数据_第2张图片

2、具体代码

       项目采用ssm框架,因此这里有控制器和mapper文件,但是模式可能传统的模式不太一样,比如传参等,大体上还是一致的,废话不多说,看代码

ForWardFormsController.java

package com.sinosoft.controller.business.infodisclosure;

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 javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.util.HSSFColor;
import org.springframework.stereotype.Repository;

import com.sinosoft.controller.base.BaseController;
import com.sinosoft.entity.Page;
import com.sinosoft.service.business.infodisclosure.ForWardFormsService;
import com.sinosoft.utils.PageData;
import com.sinosoft.utils.WriteExcelUtil;

import net.sf.json.JSONObject;

@Repository(value="forWardFormsController")
public class ForWardFormsController implements BaseController {
	protected Logger logger = Logger.getLogger(this.getClass());
	
	@Resource(name = "forWardFormsService")
	private ForWardFormsService forwardFormsService;

	@Override
	public String dispanse(String funcId, Page pageReq, HttpServletRequest request) {
		String returnStr = "";
		if("exchangeBuyBackQuery".equals(funcId)){					//读取管理人报告信息excel模板
			returnStr = exchangeBuyBackQuery(pageReq,request);
		}
		return returnStr;
	}
	
	/**
	 * 读取管理人报告信息excel模板
	 * @param pageReq
	 * @param request
	 * @return
	 */
	private String exchangeBuyBackQuery(Page pageReq, HttpServletRequest request) {
		// 存放结果集
		List>> queryValue = new ArrayList>>();
		// 存放sheet页
		List sheetList = new ArrayList();
		// 存放开始行数
		List rowList = new ArrayList();
		List> fs = null;
		List colors = new ArrayList();

		PageData pd_result = new PageData();
		PageData pd = new PageData();
		pd = new PageData(request);
		pageReq.setPd(pd);

		Map resultMap = new HashMap();
		
		try {
	    	//1计划资产净值和收益情况
	    	fs = forwardFormsService.SheetOnePage(pageReq);
	    	if(fs.size() != 0 ){
	    		queryValue.add(fs);
		    	sheetList.add("0");
		    	 /*真对坐标固定的sheet,将开始行写成"tuoguan-sheetone",
		    	  在EXCEL导出方法内会解析开始行,
		    	  若其中包含“tuoguan”,则进入key值与坐标一一对应的方法,
		    	  “sheetone”用于到配置文件获取具体坐标*/
		    	 
		    	 		    	
		    	rowList.add("tuoguan-sheetone");
		    	colors.add( HSSFColor.WHITE.index);
            }
	    	
	    	//2计划投资资产分布情况
	    	fs=null;
	    	fs = forwardFormsService.SheetTwoPage(pageReq);
	    	if(fs.size() != 0 ){
	    		queryValue.add(fs);
		    	sheetList.add("1");
		    	 /*真对坐标固定的sheet,将开始行写成"tuoguan-sheettwo",
		    	  在EXCEL导出方法内会解析开始行,
		    	  若其中包含“tuoguan”,则进入key值与坐标一一对应的方法,
		    	  “sheettwo”用于到配置文件获取具体坐标*/
		    	 
		    	 		    	
		    	rowList.add("tuoguan-sheettwo");
		    	colors.add( HSSFColor.WHITE.index);
            }
	    	
	    	//3计划管理费用
	    	fs=null;
	    	fs = forwardFormsService.SheetThreePage(pageReq);
	    	if(fs.size() != 0 ){
	    		queryValue.add(fs);
		    	sheetList.add("2");
		    	 /*真对坐标固定的sheet,将开始行写成"tuoguan-sheettwo",
		    	  在EXCEL导出方法内会解析开始行,
		    	  若其中包含“tuoguan”,则进入key值与坐标一一对应的方法,
		    	  “sheettwo”用于到配置文件获取具体坐标*/
		    	 
		    	 		    	
		    	rowList.add("tuoguan-sheetthree");
		    	colors.add( HSSFColor.WHITE.index);
            }
	    	
	    	//4计划管理费用明细
	    	fs=null;
	    	fs = forwardFormsService.SheetFourPage(pageReq);
	    	if(fs.size() != 0 ){
	    		queryValue.add(fs);
		    	sheetList.add("3");
		    	 /*真对坐标固定的sheet,将开始行写成"tuoguan-sheettwo",
		    	  在EXCEL导出方法内会解析开始行,
		    	  若其中包含“tuoguan”,则进入key值与坐标一一对应的方法,
		    	  “sheettwo”用于到配置文件获取具体坐标*/
		    	 
		    	 		    	
		    	rowList.add("tuoguan-sheetfour");
		    	colors.add( HSSFColor.WHITE.index);
            }
	    	
	    	//5资产负债表
	    	fs=null;
	    	fs = forwardFormsService.SheetFivePage(pageReq);
	    	if(fs.size() != 0 ){
	    		queryValue.add(fs);
		    	sheetList.add("4");
		    	 /*真对坐标固定的sheet,将开始行写成"tuoguan-sheettwo",
		    	  在EXCEL导出方法内会解析开始行,
		    	  若其中包含“tuoguan”,则进入key值与坐标一一对应的方法,
		    	  “sheettwo”用于到配置文件获取具体坐标*/
		    	 
		    	 		    	
		    	rowList.add("tuoguan-sheetfive");
		    	colors.add( HSSFColor.WHITE.index);
            }
	    	
	    	//6净资产变动表
	    	fs=null;
	    	fs = forwardFormsService.SheetSixPage(pageReq);
	    	if(fs.size() != 0 ){
	    		queryValue.add(fs);
		    	sheetList.add("5");
		    	 /*真对坐标固定的sheet,将开始行写成"tuoguan-sheettwo",
		    	  在EXCEL导出方法内会解析开始行,
		    	  若其中包含“tuoguan”,则进入key值与坐标一一对应的方法,
		    	  “sheettwo”用于到配置文件获取具体坐标*/
		    	 
		    	 		    	
		    	rowList.add("tuoguan-sheetsix");
		    	colors.add( HSSFColor.WHITE.index);
            }
	    	
	    	//7养老金产品分布
	    	fs=null;
	    	//每月成本统计-展示计提当月列 
	    	fs = forwardFormsService.SheetSevenPage(pageReq);
	    	if(fs.size() != 0){
		    	queryValue.add(fs);
		    	sheetList.add("6");
		    	rowList.add("2");
		    	colors.add( HSSFColor.WHITE.index);
	    	}
	    	
			String[] sheet = new String[sheetList.size()];
			sheetList.toArray(sheet);
			String[] row = new String[rowList.size()];
			rowList.toArray(row);
			
			Date date = new Date();
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
			String time = sdf.format(date);
			String modeName = pd.getString("modeName");   //模板文件名
			String downLoadName = pd.getString("filename");  //填完数据后生成的文件的文件名
			String fileDownloadName = downLoadName + time+ ".xlsx";
	    	
	    	/*excel导出方法
			 * modeName:模板名称。
			 * sheet:sheet页的序号
			 * row:写入的开始行数(类似主表的位置已经确定的,需要传入)
			 * queryValue:所有数值的集合
			 * fileDownloadName:下载至文件服务器的文件的名称
			 * 
			 * */
			if(queryValue.size()==0){
				//文件下载路径
				//String fileDownloadPath=resultMap.get("fileDownloadPath");
				pd_result.put("err_code", "");
		        pd_result.put("err_message", "");
				pd_result.put("fileDownloadPath", "");
				
			}else{
				resultMap=WriteExcelUtil.GetExcelAddredds(request, modeName, sheet, row, queryValue,fileDownloadName,colors);
				//文件下载路径
				String fileDownloadPath=resultMap.get("fileDownloadPath");
				pd_result.put("err_code", "");
		        pd_result.put("err_message", "");
				pd_result.put("fileDownloadPath", fileDownloadPath);
			}
	    	
		}catch(Exception e) {
			e.printStackTrace();
			logger.error(e);
	        pd_result.put("err_code", "error");
	        pd_result.put("err_message", e.getCause().getMessage());
	        pd_result.put("totalCount", 0);
	        pd_result.put("queryValue", null);
		}
		
		
		return JSONObject.fromObject(pd_result).toString();
	}

}

通过WriteExcelUtil.GetExcelAddredds(request, modeName, sheet, row, queryValue,fileDownloadName,colors);读取模板

需要在config.properties中配置模板中的固定坐标

#文件生成地址
downLoadFormPath=D:/data/form/

#1计划资产净值和收益情况   固定坐标
sheetonekey=A3,B3,C3,D3,E3,F3
sheetonecoord=0.2.0,0.2.1,0.2.2,0.2.3,0.2.4,0.2.5

#2计划投资资产分布情况
sheettwokey=C2,D2,E2,C3,D3,C4,D4,C5,D5,C6,D6,C7,D7,C8,D8,C9,D9,C10,D10,C11,D11,C12,D12,C13,D13,C14,D14,C15,D15,C16,D16,C17,D17,C18,D18,C19,D19,C20,D20,C21,D21,C22,D22,C23,D23,C24,D24,C25,D25,C26,D26,C27,D27,C28,D28,C29,D29,C30,D30,C31,D31,C32,D32,C33,D33,C34,D34,C35,D35,E11,E27,E34
sheettwocoord=1.1.2,1.1.3,1.1.4,1.2.2,1.2.3,1.3.2,1.3.3,1.4.2,1.4.3,1.5.2,1.5.3,1.6.2,1.6.3,1.7.2,1.7.3,1.8.2,1.8.3,1.9.2,1.9.3,1.10.2,1.10.3,1.11.2,1.11.3,1.12.2,1.12.3,1.13.2,1.13.3,1.14.2,1.14.3,1.15.2,1.15.3,1.16.2,1.16.3,1.17.2,1.17.3,1.18.2,1.18.3,1.19.2,1.19.3,1.20.2,1.20.3,1.21.2,1.21.3,1.22.2,1.22.3,1.23.2,1.23.3,1.24.2,1.24.3,1.25.2,1.25.3,1.26.2,1.26.3,1.27.2,1.27.3,1.28.2,1.28.3,1.29.2,1.29.3,1.30.2,1.30.3,1.31.2,1.31.3,1.32.2,1.32.3,1.33.2,1.33.3,1.34.2,1.34.3,1.10.4,1.26.4,1.33.4

#3计划管理费用
sheetthreekey=B2,C2,B3,C3,B4,C4
sheetthreecoord=2.1.1,2.1.2,2.2.1,2.2.2,2.3.1,2.3.2

#4计划管理费用明细
sheetfourkey=B1,B4,B5,B6,B7,B8,B9,B10,B11,B12,C5,C6,C7
sheetfourcoord=3.0.1,3.3.1,3.4.1,3.5.1,3.6.1,3.7.1,3.8.1,3.9.1,3.10.1,3.11.1,3.4.2,3.5.2,3.6.2

#5资产负债表
sheetfivekey=B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16,B17,B18,B19,B20,B21,B22,B23,B24,B25,B26,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23,C24,C25,C26,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,E18,E19,E21,E22,E23,E24,E26,F5,F6,F7,F8,F9,F10,F11,F12,F13,F14,F15,F16,F17,F18,F19,F21,F22,F23,F24,F26
sheetfivecoord=4.4.1,4.5.1,4.6.1,4.7.1,4.8.1,4.9.1,4.10.1,4.11.1,4.12.1,4.13.1,4.14.1,4.15.1,4.16.1,4.17.1,4.18.1,4.19.1,4.20.1,4.21.1,4.22.1,4.23.1,4.24.1,4.25.1,4.4.2,4.5.2,4.6.2,4.7.2,4.8.2,4.9.2,4.10.2,4.11.2,4.12.2,4.13.2,4.14.2,4.15.2,4.16.2,4.17.2,4.18.2,4.19.2,4.20.2,4.21.2,4.22.2,4.23.2,4.24.2,4.25.2,4.4.4,4.5.4,4.6.4,4.7.4,4.8.4,4.9.4,4.10.4,4.11.4,4.12.4,4.13.4,4.14.4,4.15.4,4.16.4,4.17.4,4.18.4,4.20.4,4.21.4,4.22.4,4.23.4,4.25.4,4.4.5,4.5.5,4.6.5,4.7.5,4.8.5,4.9.5,4.10.5,4.11.5,4.12.5,4.13.5,4.14.5,4.15.5,4.16.5,4.17.5,4.18.5,4.20.5,4.21.5,4.22.5,4.23.5,4.25.5

#6净资产变动表
sheetsixkey=B2,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16,B17,B18,B19,B20,B21,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,C21
sheetsixcoord=5.1.1,5.3.1,5.4.1,5.5.1,5.6.1,5.7.1,5.8.1,5.9.1,5.10.1,5.11.1,5.12.1,5.13.1,5.14.1,5.15.1,5.16.1,5.17.1,5.18.1,5.19.1,5.20.1,5.3.2,5.4.2,5.5.2,5.6.2,5.7.2,5.8.2,5.9.2,5.10.2,5.11.2,5.12.2,5.13.2,5.14.2,5.15.2,5.16.2,5.17.2,5.18.2,5.19.2,5.20.2

WriteExcelUtil.java

package com.sinosoft.utils;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


public class WriteExcelUtil {
	private static Logger logger = Logger.getLogger(WriteExcelUtil.class);
	
	/**
	 * EXCEL导出方法:
	 * 1、将查询结果集的key值替换为坐标
	 * 2、使用XSSFWorkbook读取模板EXCEL
	 * 3、使用SXSSFWorkbook将模板EXCEL和查询结果集整体写入到一个新的EXCEL,并生成流
	 * 4、将流写入文件服务器,并返回生成EXCEL的地址名称。
	 * 
	 * 注:由于XSSFWorkbook在写入大量数据的EXCEL时会占用大量内存甚至造成内存溢出,所以需要选用SXSSFWorkbook写EXCEL
	 */
    public static HashMap GetExcelAddredds(HttpServletRequest request, String modeName,
    		String sheet[], String[] row, List>> queryValue,String fileDownloadName,
    		List colors){
    	//获取模版路径
    	String modelPath = request.getSession().getServletContext().getRealPath("/formmb")
    			+ File.separator + modeName;
    	logger.info(modeName + ":" + modelPath);
    	//下载文件的名称
		String[] ExcelAddredds = new String[queryValue.size()];
		List> values = new ArrayList>();
		Properties getProperties = PropertyUitls.getProperties("config.properties");
		String path =getProperties.getProperty("downLoadFormPath");
    	
		//将查询结果集的key值替换为坐标
		for(int i = 0 ; i < queryValue.size() ; i ++){
        	//定义集合,需要转换
        	Map valuesTemp = new HashMap();
        	String Addredds ="";
        	//固定坐标的sheet页的
        	if(row[i].indexOf("tuoguan")!=-1){
        		String sheetN = row[i].substring(8);
        		//key值
        		String key =getProperties.getProperty(sheetN+"key");
        		//坐标值
        		String coord =getProperties.getProperty(sheetN+"coord");
        		String[] a =key.split(",");
        		String[] b =coord.split(",");
        		System.out.println(queryValue.get(i).get(0));
                //将查询结果集中的key替换为坐标coord
        		Map result1 = (Map) replaceKeys2( (Map) queryValue.get(i).get(0), a, b);
                
        		valuesTemp = mapValuesZB(result1,sheet[i],row[i]);
                Addredds = coord;
        	}else{
        		valuesTemp = mapValues(queryValue.get(i),sheet[i],row[i]);
        		Addredds = getAddredds(queryValue.get(i), sheet[i], row[i]);
        	}
        	
        	ExcelAddredds[i] = Addredds;
        	values.add(valuesTemp);       	
    	}
		return downloadFile(values,ExcelAddredds,row,modelPath, fileDownloadName,path,colors);
    }
    
    /**
	 * 获取具体坐标(通用方法)
	 * @param List> queryeResult
	 * @return
	 */	
	public static String getAddredds(List> queryeResult,String sheet,String startRow){
		//定义地址
		StringBuffer addres = new StringBuffer();
		//循环存入全部的坐标
		for (int i = 0 ; i < queryeResult.size() ; i ++){
			//获取第一个map的key值,列
			Map mapTemp = queryeResult.get(i);
			//存放到一个数组中,得到需要写入的列
			String [] cols = new String[mapTemp.size()];
			int colIndex = 0;
			for (String key : mapTemp.keySet()) {
				cols[colIndex++] = key;
			}
			for (int j = 0 ; j < cols.length ; j ++){
				//存入开始sheeet页
				addres.append(sheet);
				addres.append(".");
				//行坐标自动递增
				addres.append(Integer.parseInt(startRow)+i);
				addres.append(".");
				//列坐标按查询字段结束数字取值
				Pattern p = Pattern.compile("[^0-9]"); 
				Matcher m = p.matcher(cols[j]);
				addres.append(m.replaceAll(""));
				if(j < cols.length-1){
					addres.append(",");
				}
			}
			if(i < queryeResult.size()-1){
				addres.append(",");
			}
		}
		return addres.toString();
	}
    
    /**
	 * 替换map的key值
	 * 以实际需要的格式返回map数据,格式为{"0.0.0=value,..."}
	 * @param listMap	List>
	 * @param sheet		写入的sheet页
	 * @param startRow	开始写入的行数
	 * @return
	 */
    public static Map mapValues(List> listMap,String sheet,String startRow){
    	// 替换map的key值
    	if(listMap.get(0) == null || listMap.get(0).size() == 0){
    		return null;
    	}
    	Map map = new HashMap();
    	String[] address = getAddreddsArray(listMap, sheet, startRow);
    	int index = 0;
    	for(int i = 0 ; i < listMap.size() ; i ++){
			Map mapTemp = listMap.get(i);
			for (String key : mapTemp.keySet()) {
				map.put(address[index++], mapTemp.get(key));
			}
		}
		return map;
    }
    
    /**
	 * 获取坐标 传入的 List>
	 * @param queryeResult		List>		list
	 * @param sheet				String							写入sheet页
	 * @param startRow			String							开始行数
	 * @return
	 */
	public static String[] getAddreddsArray(List> queryeResult,String sheet,String startRow){
		//定义长度----------针对与报表导出,数据  总行数*总列数 < 200万	使用int类型(最大返回数据单元999999999)
		int length = 0;
		//获取长度----------返回的map可能是长短不一的
		for(int i = 0 ; i < queryeResult.size() ; i ++){
			if(queryeResult.get(i).size() == 0 || queryeResult.get(i) == null){
				String[] s = {""};
				return s;
			}
			length += queryeResult.get(i).size();
		}
		//定义地址
		String[] address = new String[length];
		int index = 0;
		//循环存入全部的坐标
		for (int i = 0 ; i < queryeResult.size() ; i ++){
			//获取第i个map的key值,列
			Map mapTemp = queryeResult.get(i);
			//获取需要写入的列,存放到一个数组中
			String [] cols = new String[mapTemp.size()];
			int colIndex = 0;
			for (String key : mapTemp.keySet()) {
				cols[colIndex++] = key;
			}
			for (int j = 0 ; j < cols.length ; j ++){
				String str = "";
				//存入开始sheeet页
				str += sheet + ".";
				//行坐标自动递增
				str += Integer.parseInt(startRow)+i+"" + "." ;
				//列坐标按查询字段结束数字取值
				Pattern p = Pattern.compile("[^0-9]"); 
				Matcher m = p.matcher(cols[j]);
				str += m.replaceAll("");
				address[index++] = str;
			}
		}
		return address;
	}
    
    /**
     * EXCEL导入文件服务器
     * @param values		结果集
     * @param execlPoint	写入坐标
     * @param row		开始行
     * @param modelFile		模板
     * @param fileDownloadName		生成文件名
     * @param path		文件服务器路径
     * @return
     */	

    private static HashMap downloadFile(List> values, String[] execlPoint,String[] row,
    		String modelFile,String fileDownloadName,  String path,List colors) {
		// 下载报表
		BufferedInputStream bis = null;
		BufferedOutputStream bos = null;
		HashMap resultMap =new HashMap();
		try {
			//EXCEL写入方法,生成流
			ByteArrayOutputStream os = writeDataToExecl(modelFile, execlPoint, row, values, colors, fileDownloadName);

			byte[] content = os.toByteArray();
			InputStream is = new ByteArrayInputStream(content);
			String fileDownloadPath = path+fileDownloadName;
			File f = new File(fileDownloadPath);
			resultMap.put("fileDownloadPath", fileDownloadPath);
			FileOutputStream down = new FileOutputStream(f);
			bis = new BufferedInputStream(is);
			bos = new BufferedOutputStream(down);
			byte[] buff = new byte[2048];
			int bytesRead;
			while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
				bos.write(buff, 0, bytesRead);
			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e);
		} finally {
			if (bis != null) {
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (bos != null) {
				try {
					bos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return resultMap;
	}
    
    /**
     * 读取EXCEL模板并写入数据
     * @param modelFile		模板excel名称
     * @param execlPoint	写入坐标
     * @param values		写入值
     * @return
     */
    public static ByteArrayOutputStream writeDataToExecl(String modelFile, String[] execlPoint, String[] row, 
    		List> values,List colors, String fileDownloadName) {
        ByteArrayOutputStream os = null;
        FileInputStream input = null;
        try {
        	os = new ByteArrayOutputStream();
        	logger.info(modelFile);
        	input = new FileInputStream(new File(modelFile));
        	XSSFWorkbook workBook = new XSSFWorkbook(new BufferedInputStream(input));
        	SXSSFWorkbook SworkBook = new SXSSFWorkbook(100);
        	
        	for(int i = 0 ; i < values.size() ; i ++){
            	//如果没有数据,那么不执行写的操作
            	if(values.get(i).size()==0 || values.get(i) == null){
            		continue;
            	}
                String[] ss = execlPoint[i].split(",");
                //获取结束的列
                String endCell = getEndCell(values.get(i));
                //写EXCEL
                Short color=null;
                if(colors.size()>i){
                    color =colors.get(i);
                }
                
                workBook = SwriteWorkBook(SworkBook,workBook,ss, values.get(i),endCell, row[i],color);
              
            }
        	workBook.write(os);
            os.flush();
        } catch (Exception e) {
        	logger.info(e);
            e.printStackTrace();
        }finally {
			try {
				if(os != null){
					os.close();
				}
			} catch (IOException e) {
				logger.info(e);
				e.printStackTrace();
			}
			try {
				if(input != null){
					input.close();
				}
			} catch (IOException e) {
				logger.info(e);
				e.printStackTrace();
			}
		}
        return os;  
    }
    
    /**
     * 写入EXCEL
     * @param workBook  XSSFWorkbook  一个工作薄
     * @param ss		String[]  绝对坐标
     * @param values	Map  与绝对值对应的map集合
     * @return
	 * @throws IOException 
     */
    public static XSSFWorkbook SwriteWorkBook(SXSSFWorkbook SworkBook,XSSFWorkbook workBook,String[] ss,
    		Map values,String endCell,String row,Short color) throws IOException {

		// 设置公共单元格样式,包括单元格的四周框线、单元格格式,背景色
		if (color == null) {
			color = 0;
		}
		// 一次性将统一创建样式相对于每个单元格分别创建样式,可提高写入效率
		Map styleMap = new HashMap();
		CellStyle styleSL = NMCellStyle(workBook, color);
		for (int i = 0; i < ss.length; i++) {
			String[] sss = ss[i].split("\\.");

			/*
			 * 思路: 1、判断该值(即坐标sss)所在的sheet模板是否已经写入SworkBook 2、
			 * 若没有写入sheet模板,将sheet模板写入SworkBook(包括样式),并将该值写入对应坐标
			 * 3、若已经读取sheet页模板,则判断是否已经写入该值所在的行 3.1、若该行已经存在,则插入数值 3.2、若该行不存在,则生成该行,并插入数据
			 * 
			 */
			XSSFSheet sheetMB = workBook.getSheetAt(Integer.parseInt(sss[0]));
			String sheetName = sheetMB.getSheetName();
			int lastRows = sheetMB.getLastRowNum();
//            SXSSFSheet sheetS = (SXSSFSheet) SworkBook.getSheet(sheetName);
			XSSFSheet sheetS1 = (XSSFSheet) workBook.getSheet(sheetName);
			// sheet页已经存在,模板已经读取,则根据坐标写入数据XSSFRow
//        	SXSSFRow RowS = (SXSSFRow) sheetS.getRow(Integer.parseInt(sss[1]));
//        	SXSSFCell cellS = (SXSSFCell) RowS.getCell(Integer.parseInt(sss[2]));

			XSSFRow RowS = (XSSFRow) sheetS1.getRow(Integer.parseInt(sss[1]));
			if (RowS == null) {
				RowS = (XSSFRow) sheetS1.createRow(Integer.parseInt(sss[1]));
				int lastCell = Integer.parseInt(endCell);
				for (int k = 0; k < lastCell + 1; k++) {
					XSSFCell cellS = (XSSFCell) RowS.getCell(k);

					if (cellS == null) {
						cellS = (XSSFCell) RowS.createCell(k);
					}
					String value = null;
					if (k == Integer.parseInt(sss[2])) {
						if (values.get(ss[i]) != null) {
							value = values.get(ss[i]).toString();
						}
					}
					cellS = setCell(workBook, cellS, RowS, value, styleSL);
				}
			} else {

				XSSFCell cellS = (XSSFCell) RowS.getCell(Integer.parseInt(sss[2]));

				if (cellS == null) {
					cellS = (XSSFCell) RowS.createCell(Integer.parseInt(sss[2]));
				}

				String value = null;
				if (values.get(ss[i]) != null) {
					value = values.get(ss[i]).toString();
				}
				cellS = setCell(workBook, cellS, RowS, value, styleSL);
			}
		}
		return workBook;
    }
    
  //设置cell的值和样式
    public static XSSFCell setCell(XSSFWorkbook SworkBook,XSSFCell cellS,XSSFRow RowS ,String value,CellStyle styleSL ){
    		//给单元格赋值
		if (value == null) {
			cellS.setCellValue("-");// 给单元格赋值
			cellS.setCellStyle(styleSL);
        } else {  	
        	cellS.setCellValue(value+"");// 给单元格赋String值
//    		cellS.setCellStyle(styleSL);
        }
		return cellS;
    }
    
    //设置cell的值和样式
    public static SXSSFCell setCell1(SXSSFWorkbook SworkBook,SXSSFCell cellS,SXSSFRow RowS ,String value,Map styleMap ){
    		//给单元格赋值
		if (value == null) {
			cellS.setCellValue("-");// 给单元格赋值
			cellS.setCellStyle(styleMap.get("0"));
        } else {
        	String val="";
        	
        	cellS.setCellValue(value+"");// 给单元格赋String值
    		cellS.setCellStyle(styleMap.get("0"));
        }
		return cellS;
    }
    
    
    /**
     * 获取结束列
     * @param values
     * @return
     */
    private static String getEndCell(Map values) {
    	Integer endCell = 0;
		for (String key : values.keySet()) {
			String[] keys = key.split("\\.");
    		if(endCell < Integer.parseInt(keys[2])){
    			endCell = Integer.parseInt(keys[2]);
    		}
		}
		return endCell.toString();
	}
        
    
    /*
	 * 用于处理坐标明确的sheet页,
	 * 将查询结果集的key值与坐标进行替换
	 * */
    public static Map mapValuesZB(Map listMap,String sheet,String startRow){
    	if(listMap == null || listMap.size() == 0){
    		return null;
    	}
    	Map map = new HashMap();
    		
				for(String key : listMap.keySet()){
					map.put(key, listMap.get(key));
				}
    		return map;
    }
    
    
    public static Map replaceKeys2(Map map,
			String[] a, String[] b) {
		Map result = new HashMap();
        for (String key : map.keySet()) {
            System.out.println("key= "+ key + " and value= " + map.get(key));
            for (int i = 0 ; i< a.length;i++){
                if (key.equals(a[i])){
                    result.put(b[i],map.get(key));
                }
            }
        }
        return result;
	}
    
  //设置通用Cell样式
    public static CellStyle NMCellStyle(XSSFWorkbook workBook,short color){
    	
    	
    	CellStyle style =  workBook.createCellStyle();
    	/*if(color!=0&&color!=HSSFColor.WHITE.index){
    		style.setFillPattern(CellStyle.SOLID_FOREGROUND);
        	style.setFillForegroundColor(color);
    	}*/
    	
    	style.setBorderBottom(CellStyle.BORDER_THIN);
    	style.setBorderLeft(CellStyle.BORDER_THIN);
    	style.setBorderRight(CellStyle.BORDER_THIN);
    	style.setBorderTop(CellStyle.BORDER_THIN);
    	Font sfont =  workBook.createFont();//单元格字体
    	//常规字符类型的
    	Short high = 14;
    	sfont.setFontHeightInPoints(high);//字体大小
    	sfont.setFontName("宋体");//字体类型
    	
    	style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
    	style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
    	style.setFont(sfont);
    	return style;
    }

}

ForWardFormsService.java

package com.sinosoft.service.business.infodisclosure;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import com.sinosoft.dao.DaoSupport;
import com.sinosoft.entity.Page;

@Service("forWardFormsService")
public class ForWardFormsService {
	protected static Logger logger = Logger.getLogger(ForWardFormsService.class);

    @Resource(name = "daoSupport")
    private DaoSupport dao;
    
    /*
     * description:1计划资产净值和收益情况
     * author: Penghui Su
     * time: 2018/11/29 09:13:00
     * forWardFormsMapper
     */
    public List> SheetOnePage(Page page)throws Exception{
    	return (List>) dao.findForList("noticeGenerateMapper.SheetOne", page);
    }
    
    /*
     * description:2计划投资资产分布情况
     * author: Penghui Su
     * time: 2018/11/29 09:13:00
     * forWardFormsMapper
     */
    public List> SheetTwoPage(Page page)throws Exception{
    	return (List>) dao.findForList("noticeGenerateMapper.SheetTwo", page);
    	
    }
    
    /*
     * description:3计划管理费用
     * author: Penghui Su
     * time: 2018/11/29 09:13:00
     * forWardFormsMapper
     */
    public List> SheetThreePage(Page page)throws Exception{
    	return (List>) dao.findForList("noticeGenerateMapper.SheetThree", page);
    	
    }
    
    /*
     * description:4计划管理费用明细
     * author: Penghui Su
     * time: 2018/11/29 09:13:00
     * forWardFormsMapper
     */
    public List> SheetFourPage(Page page)throws Exception{
    	return (List>) dao.findForList("noticeGenerateMapper.SheetFour", page);
    	
    }
    
    /*
     * description:5资产负债表
     * author: Penghui Su
     * time: 2018/11/29 09:13:00
     * forWardFormsMapper
     */
    public List> SheetFivePage(Page page)throws Exception{
    	return (List>) dao.findForList("noticeGenerateMapper.SheetFive", page);
    	
    }
    
    /*
     * description:6净资产变动表
     * author: Penghui Su
     * time: 2018/11/29 09:13:00
     * forWardFormsMapper
     */
    public List> SheetSixPage(Page page)throws Exception{
    	return (List>) dao.findForList("noticeGenerateMapper.SheetSix", page);
    	
    }
    
    /*
     * description:7养老金产品分布
     * author: Penghui Su
     * time: 2018/11/29 09:13:00
     * forWardFormsMapper
     */
    public List> SheetSevenPage(Page page)throws Exception{
    	return (List>) dao.findForList("noticeGenerateMapper.SheetSeven", page);
    	
    }
    
    

}

NoticeGenerateMapper.xml




	
		
	
		
		
		
	
	
	
	
	
	
		
		
		
		
		
		
	
	
	
	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
	
	
	
	
	
		
		
		
		
		
		
	
	
	
	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
	
	
	
	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
	
	
	
	
	
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
		
	
	
	
	
	
	
		
		
		
		
		
		
		
		
		
		
		
		
	
	

js页面
需要把以下两个参数传到控制器,具体方式这里就不说了,有很多种

modeName:"tuoguanhuizong.xlsx",    //表格模板名
filename:"createLate"     		//填充完数据生成一个新的文件名

通过以上代码就能完成读取一个空的模板,然后把数据填充上,使用数据为了演示效果而做,效果如下:
poi读取excel模板,并填充数据_第3张图片

poi读取excel模板,并填充数据_第4张图片


author:su1573

你可能感兴趣的:(技术之路,poi,excel,读取模板,填充数据)