package UIB.UIB03.ZBS; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import jxl.Range; import jxl.write.Label; import jxl.write.WritableImage; import jxl.write.WritableSheet; /** * * @desc B类模板,元素占据4个单元格 * @author meiguiping * @date 2010 1:51:12 PM */ public class QltyGuaranteeBuilderA implements IQltyGuaranteeBuilder { private int columns; //总行数 private int rows; //总列数 private WritableSheet wSheet; // private int fixedChemRow; // private int fixedQltyRow; public QltyGuaranteeBuilderA() { } public QltyGuaranteeBuilderA(WritableSheet sheet) { wSheet = sheet; columns = wSheet.getColumns(); rows = wSheet.getRows(); } /** * 1、填充模板行 * 2、填充实际值(表头、成分、材质) * 3、合并单元格 * 4、填充备注 * @author meiguiping * @date Sep 20, 2010 */ public void buildQltyGuarantee(String tmplNO , HashMap mapHead ,DataRowList[] drlChem , DataRowList[] drlQlty) throws Exception { //获取配置参数 QltyTmplParser qtp = new QltyTmplParser(); HashMap hm = qtp.getParamer(); if(hm.size() <= 0) { System.out.println("参数配置出错,请检查!"); return; } HashMap map = (HashMap)hm.get(tmplNO+"ATT"); int maxCoilNo = Integer.parseInt(map.get("maxCoilNo").toString()); //质保书最多容纳卷数 int chemTmplRow = StringFormat.getNumber(map.get("chemTmplRow").toString());//成分模板行位置 int qltyTmplRow = StringFormat.getNumber(map.get("qltyTmplRow").toString());//性能模板行位置 int headStartRow = StringFormat.getNumber(map.get("headStartRow").toString());//表头开始行 int headEndRow = StringFormat.getNumber(map.get("headEndRow").toString());//表头结束行 int chemCDRow = StringFormat.getNumber(map.get("chemCDRow").toString());//元素名填充的行 int chemValStartRow = StringFormat.getNumber(map.get("chemValStartRow").toString());//成分值开始填充行 int chemValStartCol = StringFormat.getNumber(map.get("chemValStartCol").toString());//成分开始列 int qltyValStartRow = StringFormat.getNumber(map.get("qltyValStartRow").toString());//性能开始行 int qltyValStartCol = StringFormat.getNumber(map.get("qltyValStartCol").toString());//性能开始列 int qltyGigNameRow = StringFormat.getNumber(map.get("qltyGigNameRow").toString());//性能大名称开始行 int qltySmallNameRow = StringFormat.getNumber(map.get("qltySmallNameRow").toString());//性能小名称开始行 int qltyExtCodeRow = StringFormat.getNumber(map.get("qltyExtCodeRow").toString());//性能附加信息填充行 int rmkStartRow = StringFormat.getNumber(map.get("rmkStartRow").toString());//备注开始行 int rmkStartCol = StringFormat.getNumber(map.get("rmkStartCol").toString());//备注开始列 int tabulatorRow = StringFormat.getNumber(map.get("tabulatorRow").toString());//质表人开始行 int tabulatorCol = StringFormat.getNumber(map.get("tabulatorCol").toString());//质表人开始列 if(drlChem == null) throw new Exception("质保书异常,缺少成分记录。"); int coilCount = drlChem.length; //SQL查询出来的实际卷数 if(maxCoilNo < coilCount) throw new Exception("质保书最大容纳卷数小于实际质保书卷数"); ///补充拉力项目 RowSetConverter.replenishPullItem(drlQlty[0]);//补充拉力项目 ///填充模板行 setChemTmpl( drlChem[0] , chemTmplRow , chemValStartCol , chemCDRow);//增加行操作对于元素代码填充行无影响,元素代码填充 setQltyTmpl( drlQlty[0] , qltyTmplRow , qltyValStartCol , qltySmallNameRow );//模板行(材质)填充 ///填充实绩值 setHeader( mapHead , headStartRow , headEndRow );//质保书表头填充 setChem(drlChem , chemValStartRow , chemTmplRow , map);//成分填充 setQlty(drlQlty , qltyValStartRow , qltyTmplRow , map);//材质填充 //合并单元格 mergeQltyCells(qltySmallNameRow);//材质小名称行 mergeQltyCells(qltyGigNameRow);//材质大名称行 ///填充备注,制表人等 wSheet.addCell( new Label(rmkStartCol, rmkStartRow, mapHead.get("CRET_NO_RMK")==null?"": mapHead.get("CRET_NO_RMK").toString(),wSheet.getCell(rmkStartCol, rmkStartRow).getCellFormat() ) ); wSheet.addCell( new Label(tabulatorCol, tabulatorRow, mapHead.get("USERID")==null?"": mapHead.get("USERID").toString(),wSheet.getCell(tabulatorCol, tabulatorRow).getCellFormat() ) ); } /** * 模板行的成分信息填充 * @param tmplRow 原模板上录入成分实绩的行在当前操作副本上的行数,也就是成分开始的行 * @param chemValStartCol 成分开始列 */ public void setChemTmpl(DataRowList drl , int tmplRow , int chemValStartCol , int chemCDRow) throws Exception { String key = ""; String value = ""; String extCode = ""; for(int index =0 ; index < drl.size(); index++) { key = drl.getKey(index).toString(); value = drl.getValue(index).toString(); extCode = drl.getExtCode(index).toString(); if("".equals(extCode))continue;//只填充元素名称 for(int col = chemValStartCol ; col < columns; col++) { if( "".equals(wSheet.getCell(col, tmplRow).getContents().trim()))//判断是否已填充,只有成分元素才填充 { wSheet.addCell(new Label(col , chemCDRow , key , ExcelStyleSeter.getChemValuetyle()));//元素代码行,元素名称填充 wSheet.addCell(new Label(col , tmplRow , key , ExcelStyleSeter.getChemValuetyle()));//模板行 break;//因为首先是按元素名循环,所以元素被填充后,需要进入大循环的下一个元素循环 } } } } /** * 模板行的材质信息填充 * @param tmplRow 材质模板行 * @param qltyValStartCol 材质开始列 * @param qltySmallNameRow材质小名称开始行 */ public void setQltyTmpl(DataRowList drl , int tmplRow , int qltyValStartCol , int qltySmallNameRow ) throws Exception { String key = ""; String smallName = ""; String bigName = ""; String extCode = ""; for(int index =0 ; index < drl.size(); index++) { key = drl.getKey(index).toString(); // value = drl.getValue(index).toString(); smallName = drl.getSmallName(index).toString();//小名称不可以为空,所以不判断,若为空则直接抛出异常 bigName = drl.getBigName(index)==null?"":drl.getBigName(index).toString(); extCode = drl.getExtCode(index)==null?"":drl.getExtCode(index).toString(); for(int col = qltyValStartCol ; col < columns; col++) { if( "".equals(wSheet.getCell(col, tmplRow).getContents().trim()) && !"".equals(smallName) )//判断是否已填充,只有材质、位置等才填充,对钢卷号等信息不填充 { wSheet.addCell(new Label(col , qltySmallNameRow-1 , bigName , ExcelStyleSeter.getQltyNameStyle() ));//大名称 wSheet.addCell(new Label(col , qltySmallNameRow , smallName , ExcelStyleSeter.getQltyNameStyle() ));//材质名称行 wSheet.addCell(new Label(col , qltySmallNameRow+1 , extCode , ExcelStyleSeter.getQltyNameStyle() ));//补充码 wSheet.addCell(new Label(col , tmplRow , key , ExcelStyleSeter.getChemValuetyle()/*,wSheet.getCell(col, 16).getCellFormat()*/));//模板行 break;//某一列被填充后退出列的循环,进入下一个元素的循环。否则第一个元素将填满模板 } } } } /** * @desc 表头填充 * @param map 表头数据如合同号均在该map中 * @param startRow 表头数据开始填充行 * @param endRow 表头数据结束填充行 * @throws Exception */ public void setHeader(HashMap map , int startRow , int endRow) throws Exception { String key = ""; //对表头所有的单元格进行循环,获取需要的质保书数据要求 for(int row = 0 ; row <= endRow; row++) { for(int col = 0 ; col <= columns; col++) { key = wSheet.getCell(col, row).getContents().trim();//获取EXCEL中的文本内容 if(key.equals(""))//EXCEL中内容为空,则进入下个循环处理 continue; key = key.replaceFirst("\\[", "").replaceFirst("\\]", "").trim();//将EXCEL中用"[]"括起来的内容提取出来 if(map.get(key) == null)//map中可能不包含所要求的内容,进入下个循环。 continue; wSheet.addCell(new Label(col , row , map.get(key).toString() ,wSheet.getCell(col, row).getCellFormat())); } } } /** * @param chemValStartRow 成分实绩值填充起始行 * @param tmplRow 成分模板行 * @param chemCDRow 成分代码填充行(C、Si等名称) */ public void setChem(DataRowList[] drl , int currentRow , int tmplValueRow ,HashMap map) throws Exception { String labelContent = "";//模板中的内容 //成分行数据填充,包括钢卷号等 for(int i = 0; i < drl.length; i++) { for(int col = 0 ; col < columns; col++) { labelContent = wSheet.getCell(col, tmplValueRow).getContents().trim(); if("".equals(labelContent))//若模板中成分行的内容为空 continue; if(drl[i].getValue(labelContent)==null)//为null则进入下次循环 continue; //元素值 wSheet.addCell(new Label(col , currentRow+i , drl[i].getValue(labelContent).toString() , ExcelStyleSeter.getCommStyle()) ); } } } /** * * @param drl * @param qltyValStartRow 材质实绩值填充起始行 * @param tmplRow 材质模板行 * @throws Exception */ public void setQlty(DataRowList[] drl , int qltyValStartRow , int tmplRow , HashMap map) throws Exception { Label label = null; String labelContent = "";//模板中的内容 for(int i = 0; i < drl.length; i++) { for(int col = 0 ; col < columns ; col++) { labelContent = wSheet.getCell(col, tmplRow).getContents().trim(); if("".equals(labelContent))//为空则进行下一次循环 continue; if(drl[i].getValue(labelContent) == null)//DataRowList中可能不包含所要求的内容,进入下个循环。 continue; label = new Label( col,qltyValStartRow+i ,drl[i].getValue(labelContent).toString() ,ExcelStyleSeter.getQltyValueStyle()); wSheet.addCell(label); } } } public void setImage(ArrayList al )throws Exception { int imageNO = al.size()-1;//初始为行、列参数的定义,所以要减掉一个 HashMap m = null; for(int i = 1 ; i <= imageNO; i++) { m = (HashMap)al.get(i);//不可从get(0)开始,0为行、列等的参数定义 int col = StringFormat.getNumber(m.get("col").toString()); int row = StringFormat.getNumber(m.get("row").toString()); int width = StringFormat.getNumber(m.get("width").toString()); int height = StringFormat.getNumber(m.get("height").toString()); // System.out.println(col+"-------"+row+"----------"+"width"+"---------------"+height); String filePath= Thread.currentThread().getContextClassLoader().getResource("").getPath()+m.get("name").toString(); File file = new File(filePath); WritableImage wi = new WritableImage(col,row,width,height , file); wSheet.addImage(wi); } } /** * @param currentRow 需要合并的行 * @throws Exception */ public void mergeQltyCells(int currentRow) throws Exception { String labelContent = ""; String labelContentBefore = ""; int count = 0; for(int col = 0; col <= columns; col++) { labelContent = wSheet.getCell(col , currentRow).getContents().trim();//当前单元格的值 labelContentBefore = wSheet.getCell(col-1 , currentRow).getContents().trim();//之前一个单元格的值 if(!labelContentBefore.equals(labelContent) && !"".equals(labelContentBefore))// { if((col-1)-count == col-1) continue; wSheet.mergeCells((col-1)-count, currentRow, col-1, currentRow ); count = 0;//合并后,重新归0 } else { count++; } } } }