package com.yxcheng.token.utils;

import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.DataFormat;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/** 
 * ClassName:ExcelExportUtil 
 * Function: TODO ADD FUNCTION. 
 * Date:     2016年11月15日 上午11:52:50  
 * @author   wangjin 
 * @see  
 * param 最后一个参数-合并的单元格需要边框传入1 不需要边框传入2     
 */
public class ExcelExportUtil {
	
	/**
	 * 方法描述:填写表格的合并行
	 * @param workbook
	 * @param sheet
	 * @param text
	 * @param startrow
	 * @param endrow
	 * @param startcell
	 * @param endcell
	 * @param align
	 * @param index
	 * @return
	 * @version:v1.0
	 * @author:wangjin
	 * @date:2016年12月31日 下午5:13:13
	 */
	public static int drawMerge(HSSFWorkbook workbook,HSSFSheet sheet,String text,int startrow,int endrow,int startcell,int endcell,short align,int index){
		HSSFCellStyle style = workbook.createCellStyle();  
        // 设置这些样式  
        style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);  
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
        if(index==1){
	        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
	        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
	        style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
	        style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
        }
        style.setAlignment(align);  //HSSFCellStyle.ALIGN_CENTER
        // 生成一个字体  
        HSSFFont font = workbook.createFont();  
        font.setColor(HSSFColor.BLACK.index);  
        font.setFontHeightInPoints((short) 12);  
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
        // 把字体应用到当前的样式  
        style.setFont(font); 
		if(text != null && !"".equals(text)){
			HSSFRow row = sheet.createRow(startrow); 
	        sheet.addMergedRegion(new CellRangeAddress(startrow,endrow,startcell,endcell)); 
	        HSSFCell titlecell = row.createCell(0);  
	        titlecell.setCellStyle(style); 
	        titlecell.setCellValue(text);
	        endrow++;
		}
        return endrow;
	}
	 
	/**
	 * drawHeader:产生表格标题行  
	 * @author wangjin 
	 * @param sheet
	 * @param headers
	 */
	public static int drawHeader(HSSFWorkbook workbook,HSSFSheet sheet,String[] headers,int[] columnWidths,int index){
		HSSFCellStyle style = workbook.createCellStyle();  
        // 设置这些样式  
        style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);  
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
        // 生成一个字体  
        HSSFFont font = workbook.createFont();  
        font.setColor(HSSFColor.BLACK.index);  
        font.setFontHeightInPoints((short) 12);  
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
        // 把字体应用到当前的样式  
        style.setFont(font); 
		 
        HSSFRow row = sheet.createRow(index);  
        for (short i = 0; i < headers.length; i++){ 
        	 HSSFCell cell = row.createCell(i);  
            cell.setCellStyle(style);  
            //HSSFRichTextString text = new HSSFRichTextString(headers[i]);  
            cell.setCellValue(headers[i]);  
            if(columnWidths != null){
        		sheet.setColumnWidth(i,columnWidths[i]);
        	}else{
        		//sheet.autoSizeColumn(i, true);
        		sheet.setColumnWidth(i,4000);
        	}
        }  
        index++;
        return index;
	}
	
	/**
	 * 方法描述:填写表格数据行
	 * @param workbook
	 * @param sheet
	 * @param jsonarray
	 * @param fields
	 * @param columnWidths
	 * @param index
	 * @return
	 * @version:v1.0
	 * @author:wangjin
	 * @date:2016年12月31日 下午5:13:49
	 */
	public static int drawDataRows(HSSFWorkbook workbook,HSSFSheet sheet,JSONArray jsonarray,String[] fields,int[] columnWidths,int index){
		HSSFCellStyle style = workbook.createCellStyle();  
		style.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);  
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
		style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
		HSSFFont font = workbook.createFont();  
        font.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);  
        style.setFont(font);
        HSSFRow row = null;

        DataFormat format = workbook.createDataFormat();
        style.setDataFormat(format.getFormat("@"));
        
		for(int i=0;i<jsonarray.size();i++){
			row = sheet.createRow(index);   
			JSONObject rowjson = (JSONObject) jsonarray.get(i);
			for(int j=0;j<fields.length;j++){
				String field = fields[j];
				Object cellvalue = rowjson.get(field);
				HSSFCell cell = row.createCell(j); 
				cell.setCellStyle(style);  
				cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				cell.setCellValue(String.valueOf(cellvalue));
				//判断是0 把宽度写死，是0 自适应
				if(columnWidths != null&&0!=columnWidths[j] ){
	        		sheet.setColumnWidth(j,columnWidths[j]);
	        	}else{
	        		sheet.autoSizeColumn(j, true);
	        	}
				
			}
			index++;
		}
		return index;
	} 
	
	/**

	 * 填写EXCEL模版内的示例数据

	 * add by miaoyu 2017年12月8日 20:45:53

	 * @param wb workbook

	 * @return wb workbook

	 */
	public static HSSFWorkbook editExcelInfo(HSSFWorkbook wb){

		HSSFCellStyle myCellStyle = wb.createCellStyle();
		
		myCellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框    
		myCellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框    
		myCellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框    
		myCellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框  
		
		// 读取了模板内所有sheet内容
		HSSFSheet sheet = wb.createSheet("模板填写示例");
		sheet.setColumnWidth(0, 5000);
		sheet.setColumnWidth(1, 5000);
		sheet.setColumnWidth(2, 5000);
		sheet.setColumnWidth(3, 5000);
		sheet.setColumnWidth(4, 9000);
		sheet.setColumnWidth(5, 5000);
		sheet.setColumnWidth(6, 5000);
		sheet.setColumnWidth(7, 5000);
		sheet.setColumnWidth(8, 5000);
		sheet.setColumnWidth(9, 5000);
		sheet.setColumnWidth(10, 5000);
		sheet.setColumnWidth(11, 5000);
		sheet.setColumnWidth(12, 5000);
		sheet.setColumnWidth(13, 5000);
		sheet.setColumnWidth(14, 40000);
		//填写标题
		HSSFRow row = sheet.getRow(0);

			if (null == row) {
				row = sheet.createRow(0);
			}

			HSSFCell cell0 = row.getCell(0);

			if (null == cell0) {
				cell0 = row.createCell(0);
			}

			
			HSSFFont font = wb.createFont();
			HSSFCellStyle tmpStyle = wb.createCellStyle();
			font.setFontName("宋体");
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示    
			font.setFontHeightInPoints((short)16);
			font.setColor(HSSFColor.BLACK.index);
			tmpStyle.setFont(font);
			cell0.setCellStyle(tmpStyle);
			cell0.setCellValue(new HSSFRichTextString("验收对账单模板填写示例"));
			//第二行数据
			HSSFRow row1 = sheet.createRow(1);
			
			if (null == row1) {
				row1 = sheet.createRow(1);
			}
			
			HSSFCell cell1 = row1.getCell(0);

			if (null == cell1) {
				cell1 = row1.createCell(0);
			}
			HSSFCellStyle tmpStyle2 = wb.createCellStyle();
			HSSFFont font2 = wb.createFont();
			font2.setFontName("宋体");
			font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//粗体显示  
			font2.setFontHeightInPoints((short)11);
			font2.setColor(HSSFColor.BLACK.index);
			tmpStyle2.setFont(font2);
			cell1.setCellStyle(tmpStyle2);
			cell1.setCellValue(new HSSFRichTextString("1.一个验收单对应一张发票或多个验收单对应一张发票"));
			//创建第三行
			
			HSSFRow row2 = sheet.createRow(2);
			
			if (null == row2) {
				row2 = sheet.createRow(2);
			}

			
			//HSSFCell cell2 = row2.getCell(0);
			//填写表头数据
			List<Object> infoList = new ArrayList<Object>();
			infoList.add("批次号");
			infoList.add("供应商");
			infoList.add("核算主体");
			infoList.add("签约影城");
			infoList.add("合同名称");
			infoList.add("合同金额");
			infoList.add("验收单号");
			infoList.add("验收日期");
			infoList.add("类型");
			infoList.add("验收金额");
			infoList.add("修正金额");
			infoList.add("发票代码");
			infoList.add("发票号码");
			infoList.add("价税合计");
			ExcelExportUtil.addExcelData(row2,infoList,"head",myCellStyle,tmpStyle2);
			infoList.clear();
			//填写第一行实际模板数据
			infoList.add("201711270001");
			infoList.add("北京京东世纪信息技术有限公司");
			infoList.add("万达电影财务服务");
			infoList.add("财务业务处理中心");
			infoList.add("万达电影股份有限公司XX合同订单");
			infoList.add("8000");
			infoList.add("A001");
			infoList.add("2017/10/1");
			infoList.add("经营");
			infoList.add("8000");
			infoList.add("0");
			infoList.add("5000153560");
			infoList.add("24057352");
			infoList.add("8000");
			String otherStr = "第4行数据：一张验收单对应一张发票";
			HSSFRow row3 = sheet.createRow(3);
			//设置红色字体
			HSSFCellStyle redFontStyle = wb.createCellStyle();
			HSSFFont fontRed = wb.createFont();
			fontRed.setFontHeightInPoints((short)11);
			fontRed.setColor(HSSFColor.RED.index);
			redFontStyle.setFont(fontRed);
			
			ExcelExportUtil.addExcelData(row3,infoList,otherStr,myCellStyle,redFontStyle);
			
			infoList.clear();
			//第二行数据
			infoList.add("201711270001");
			infoList.add("北京京东世纪信息技术有限公司");
			infoList.add("万达电影财务服务");
			infoList.add("CBD影城");
			infoList.add("万达电影股份有限公司YY合同订单");
			infoList.add("3000");
			infoList.add("A002");
			infoList.add("2017/10/3");
			infoList.add("经营");
			infoList.add("3000");
			infoList.add("0");
			infoList.add("5000153560");
			infoList.add("24057353");
			infoList.add("8000");
			otherStr = "第5、6行数据：多张验收单对应一张发票，含税金额填写发票票面的含税金额";
			HSSFRow row4 = sheet.createRow(4);
			ExcelExportUtil.addExcelData(row4,infoList,otherStr,myCellStyle,redFontStyle);
			
			infoList.clear();
			//第三行数据
			infoList.add("201711270001");
			infoList.add("北京京东世纪信息技术有限公司");
			infoList.add("万达电影财务服务");
			infoList.add("丰台影城");
			infoList.add("万达电影股份有限公司ZZ合同订单");
			infoList.add("5000");
			infoList.add("A003");
			infoList.add("2017/10/5");
			infoList.add("经营");
			infoList.add("5000");
			infoList.add("0");
			infoList.add("5000153560");
			infoList.add("24057353");
			infoList.add("8000");
			HSSFRow row5 = sheet.createRow(5);
			ExcelExportUtil.addExcelData(row5,infoList,"",myCellStyle,null);
			
			//插入3空行
			HSSFRow row6 = sheet.createRow(6);
			row6.createCell(0).setCellValue(" ");
			HSSFRow row7 = sheet.createRow(7);
			row7.createCell(0).setCellValue(" ");
			HSSFRow row8 = sheet.createRow(8);
			row8.createCell(0).setCellValue(" ");
			
			HSSFRow row9 = sheet.createRow(9);
			
			HSSFCell cell9 = row9.createCell(0);
			cell9.setCellStyle(tmpStyle2);
			cell9.setCellValue("2.一个验收单对应多张发票");
			
			infoList.clear();
			//插入2.0表头
			infoList.add("批次号");
			infoList.add("供应商");
			infoList.add("核算主体");
			infoList.add("签约影城");
			infoList.add("合同名称");
			infoList.add("合同金额");
			infoList.add("验收单号");
			infoList.add("验收日期");
			infoList.add("类型");
			infoList.add("验收金额");
			infoList.add("修正金额");
			infoList.add("发票代码");
			infoList.add("发票号码");
			infoList.add("价税合计");
			HSSFRow row10 = sheet.createRow(10);
			ExcelExportUtil.addExcelData(row10,infoList,"head",myCellStyle,tmpStyle2);
			infoList.clear();
			
			//插入excel表内12行数据
			infoList.add("201711270001");
			infoList.add("北京京东世纪信息技术有限公司");
			infoList.add("万达电影财务服务");
			infoList.add("财务业务处理中心");
			infoList.add("万达电影股份有限公司XX合同订单");
			infoList.add("8000");
			infoList.add("A001");
			infoList.add("2017/10/1");
			infoList.add("经营");
			infoList.add("8000");
			infoList.add("0");
			infoList.add("5000153560");
			infoList.add("24057352");
			infoList.add("10000");
			HSSFRow row11 = sheet.createRow(11);
			ExcelExportUtil.addExcelData(row11,infoList,"",myCellStyle,null);
			
			infoList.clear();
			//插入Excel第13行数据
			infoList.add("201711270001");
			infoList.add("北京京东世纪信息技术有限公司");
			infoList.add("万达电影财务服务");
			infoList.add("CBD影城");
			infoList.add("万达电影股份有限公司YY合同订单");
			infoList.add("3000");
			infoList.add("A002");
			infoList.add("2017/10/3");
			infoList.add("经营");
			infoList.add("3000");
			infoList.add("0");
			infoList.add("5000153560");
			infoList.add("24057352");
			infoList.add("10000");
			HSSFRow row12 = sheet.createRow(12);
			otherStr = "第12到15行数据：一张验收单对应多张发票。这种情况下，复制新增一行该验收单，填写对应的发票代码、发票号码、含税金额。含税金额填写发票票面的含税金额";
			ExcelExportUtil.addExcelData(row12,infoList,otherStr,myCellStyle,redFontStyle);
			
			infoList.clear();
			//插入Excel第14行数据
			infoList.add("201711270001");
			infoList.add("北京京东世纪信息技术有限公司");
			infoList.add("万达电影财务服务");
			infoList.add("CBD影城");
			infoList.add("万达电影股份有限公司YY合同订单");
			infoList.add("3000");
			infoList.add("A002");
			infoList.add("2017/10/3");
			infoList.add("经营");
			infoList.add("3000");
			infoList.add("0");
			infoList.add("5000153560");
			infoList.add("24057353");
			infoList.add("6000");
			HSSFRow row13 = sheet.createRow(13);
			ExcelExportUtil.addExcelData(row13,infoList,"",myCellStyle,null);
			
			infoList.clear();
			//插入Excel中第15行数据
			infoList.add("201711270001");
			infoList.add("北京京东世纪信息技术有限公司");
			infoList.add("万达电影财务服务");
			infoList.add("丰台影城");
			infoList.add("万达电影股份有限公司ZZ合同订单");
			infoList.add("5000");
			infoList.add("A003");
			infoList.add("2017/10/5");
			infoList.add("经营");
			infoList.add("5000");
			infoList.add("0");
			infoList.add("5000153560");
			infoList.add("24057353");
			infoList.add("6000");
			HSSFRow row14 = sheet.createRow(14);
			ExcelExportUtil.addExcelData(row14,infoList,"",myCellStyle,null);
			
			//插入3空行后，填写模版说明
			HSSFRow row15 = sheet.createRow(15);
			row15.createCell(0).setCellValue(" ");
			HSSFRow row16 = sheet.createRow(16);
			row16.createCell(0).setCellValue(" ");
			HSSFRow row17 = sheet.createRow(17);
			row17.createCell(0).setCellValue(" ");
			//插入模版说明
			HSSFRow row18 = sheet.createRow(18);

			HSSFCell cell18 = row18.createCell(4);
			HSSFCellStyle cellStyle = wb.createCellStyle();
			cellStyle.setWrapText(true);
			HSSFFont font4 = wb.createFont();
			font4.setColor(HSSFColor.RED.index);
			cellStyle.setFont(font4);
			cell18.setCellStyle(cellStyle);
			cell18.setCellValue(new HSSFRichTextString("验收对账单模板填写说明：1.请供应商按验收单实际开具的发票信息填写三个栏位：发票代码、发票号码、含税金额。"+
			"2.若存在一张发票对应多张验收单，含税金额请填写发票票面开具的总含税金额。  3.修正金额由万达填写，对于工程类验收，可能存在发票金额大于本次验收金额，将发票金额-验收金额的值填入修正金额"+
					"。发票系统校验金额逻辑：同一批次号合计（验收单金额+修正金额）=厂商填报的发票合计含税金额"));
		
		return wb;
	}
	
	/**
	 * 传入行元素，填写没一个单元格内数据
	 * @param row2
	 */
	private static void addExcelData(HSSFRow row2,List<Object>infoList,String otherStr,HSSFCellStyle myCellStyle,HSSFCellStyle fontStyle) {
		
		if("head".equals(otherStr)){
			fontStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框    
			fontStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框    
			fontStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框    
			fontStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框  
		}
		
		HSSFCell cell0 = row2.createCell(0);
		cell0.setCellValue(infoList.get(0).toString());
		if("head".equals(otherStr)){
			cell0.setCellStyle(fontStyle);
		}else{
			cell0.setCellStyle(myCellStyle);
		}
		
		HSSFCell cell1 = row2.createCell(1);
		cell1.setCellValue(infoList.get(1).toString());
		if("head".equals(otherStr)){
			cell1.setCellStyle(fontStyle);
		}else{
			cell1.setCellStyle(myCellStyle);
		}
		HSSFCell cell2 = row2.createCell(2);
		cell2.setCellValue(infoList.get(2).toString());
		if("head".equals(otherStr)){
			cell2.setCellStyle(fontStyle);
		}else{
			cell2.setCellStyle(myCellStyle);
		}
		HSSFCell cell3 = row2.createCell(3);
		cell3.setCellValue(infoList.get(3).toString());
		if("head".equals(otherStr)){
			cell3.setCellStyle(fontStyle);
		}else{
			cell3.setCellStyle(myCellStyle);
		}
		HSSFCell cell4 = row2.createCell(4);
		cell4.setCellValue(infoList.get(4).toString());
		if("head".equals(otherStr)){
			cell4.setCellStyle(fontStyle);
		}else{
			cell4.setCellStyle(myCellStyle);
		}
		HSSFCell cell5 = row2.createCell(5);
		cell5.setCellValue(infoList.get(5).toString());
		if("head".equals(otherStr)){
			cell5.setCellStyle(fontStyle);
		}else{
			cell5.setCellStyle(myCellStyle);
		}
		HSSFCell cell6 = row2.createCell(6);
		cell6.setCellValue(infoList.get(6).toString());
		if("head".equals(otherStr)){
			cell6.setCellStyle(fontStyle);
		}else{
			cell6.setCellStyle(myCellStyle);
		}
		HSSFCell cell7 = row2.createCell(7);
		cell7.setCellValue(infoList.get(7).toString());
		if("head".equals(otherStr)){
			cell7.setCellStyle(fontStyle);
		}else{
			cell7.setCellStyle(myCellStyle);
		}
		HSSFCell cell8 = row2.createCell(8);
		cell8.setCellValue(infoList.get(8).toString());
		if("head".equals(otherStr)){
			cell8.setCellStyle(fontStyle);
		}else{
			cell8.setCellStyle(myCellStyle);
		}
		HSSFCell cell9 = row2.createCell(9);
		cell9.setCellValue(infoList.get(9).toString());
		if("head".equals(otherStr)){
			cell9.setCellStyle(fontStyle);
		}else{
			cell9.setCellStyle(myCellStyle);
		}
		HSSFCell cell10 = row2.createCell(10);
		cell10.setCellValue(infoList.get(10).toString());
		if("head".equals(otherStr)){
			cell10.setCellStyle(fontStyle);
		}else{
			cell10.setCellStyle(myCellStyle);
		}
		HSSFCell cell11 = row2.createCell(11);
		cell11.setCellValue(infoList.get(11).toString());
		if("head".equals(otherStr)){
			cell11.setCellStyle(fontStyle);
		}else{
			cell11.setCellStyle(myCellStyle);
		}
		HSSFCell cell12 = row2.createCell(12);
		cell12.setCellValue(infoList.get(12).toString());
		if("head".equals(otherStr)){
			cell12.setCellStyle(fontStyle);
		}else{
			cell12.setCellStyle(myCellStyle);
		}
		HSSFCell cell13 = row2.createCell(13);
		cell13.setCellValue(infoList.get(13).toString());
		if("head".equals(otherStr)){
			cell13.setCellStyle(fontStyle);
		}else{
			cell13.setCellStyle(myCellStyle);
		}
		if(!"".equals(otherStr)&&!"head".equals(otherStr)){
			HSSFCell cell14 = row2.createCell(14);
			cell14.setCellStyle(fontStyle);
			cell14.setCellValue(otherStr);
		}
	}
}
  