bb2bc5f0fc2e74dfb78016dceccd6a95cec853f0.svn-base 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. package UIB.UIB03.ZBS;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import jxl.Range;
  6. import jxl.write.Label;
  7. import jxl.write.WritableImage;
  8. import jxl.write.WritableSheet;
  9. /**
  10. *
  11. * @desc B类模板,元素占据4个单元格
  12. * @author meiguiping
  13. * @date 2010 1:51:12 PM
  14. */
  15. public class QltyGuaranteeBuilderA implements IQltyGuaranteeBuilder
  16. {
  17. private int columns; //总行数
  18. private int rows; //总列数
  19. private WritableSheet wSheet;
  20. // private int fixedChemRow;
  21. // private int fixedQltyRow;
  22. public QltyGuaranteeBuilderA()
  23. {
  24. }
  25. public QltyGuaranteeBuilderA(WritableSheet sheet)
  26. {
  27. wSheet = sheet;
  28. columns = wSheet.getColumns();
  29. rows = wSheet.getRows();
  30. }
  31. /**
  32. * 1、填充模板行
  33. * 2、填充实际值(表头、成分、材质)
  34. * 3、合并单元格
  35. * 4、填充备注
  36. * @author meiguiping
  37. * @date Sep 20, 2010
  38. */
  39. public void buildQltyGuarantee(String tmplNO , HashMap mapHead ,DataRowList[] drlChem , DataRowList[] drlQlty) throws Exception
  40. {
  41. //获取配置参数
  42. QltyTmplParser qtp = new QltyTmplParser();
  43. HashMap hm = qtp.getParamer();
  44. if(hm.size() <= 0)
  45. {
  46. System.out.println("参数配置出错,请检查!");
  47. return;
  48. }
  49. HashMap map = (HashMap)hm.get(tmplNO+"ATT");
  50. int maxCoilNo = Integer.parseInt(map.get("maxCoilNo").toString()); //质保书最多容纳卷数
  51. int chemTmplRow = StringFormat.getNumber(map.get("chemTmplRow").toString());//成分模板行位置
  52. int qltyTmplRow = StringFormat.getNumber(map.get("qltyTmplRow").toString());//性能模板行位置
  53. int headStartRow = StringFormat.getNumber(map.get("headStartRow").toString());//表头开始行
  54. int headEndRow = StringFormat.getNumber(map.get("headEndRow").toString());//表头结束行
  55. int chemCDRow = StringFormat.getNumber(map.get("chemCDRow").toString());//元素名填充的行
  56. int chemValStartRow = StringFormat.getNumber(map.get("chemValStartRow").toString());//成分值开始填充行
  57. int chemValStartCol = StringFormat.getNumber(map.get("chemValStartCol").toString());//成分开始列
  58. int qltyValStartRow = StringFormat.getNumber(map.get("qltyValStartRow").toString());//性能开始行
  59. int qltyValStartCol = StringFormat.getNumber(map.get("qltyValStartCol").toString());//性能开始列
  60. int qltyGigNameRow = StringFormat.getNumber(map.get("qltyGigNameRow").toString());//性能大名称开始行
  61. int qltySmallNameRow = StringFormat.getNumber(map.get("qltySmallNameRow").toString());//性能小名称开始行
  62. int qltyExtCodeRow = StringFormat.getNumber(map.get("qltyExtCodeRow").toString());//性能附加信息填充行
  63. int rmkStartRow = StringFormat.getNumber(map.get("rmkStartRow").toString());//备注开始行
  64. int rmkStartCol = StringFormat.getNumber(map.get("rmkStartCol").toString());//备注开始列
  65. int tabulatorRow = StringFormat.getNumber(map.get("tabulatorRow").toString());//质表人开始行
  66. int tabulatorCol = StringFormat.getNumber(map.get("tabulatorCol").toString());//质表人开始列
  67. if(drlChem == null) throw new Exception("质保书异常,缺少成分记录。");
  68. int coilCount = drlChem.length; //SQL查询出来的实际卷数
  69. if(maxCoilNo < coilCount) throw new Exception("质保书最大容纳卷数小于实际质保书卷数");
  70. ///补充拉力项目
  71. RowSetConverter.replenishPullItem(drlQlty[0]);//补充拉力项目
  72. ///填充模板行
  73. setChemTmpl( drlChem[0] , chemTmplRow , chemValStartCol , chemCDRow);//增加行操作对于元素代码填充行无影响,元素代码填充
  74. setQltyTmpl( drlQlty[0] , qltyTmplRow , qltyValStartCol , qltySmallNameRow );//模板行(材质)填充
  75. ///填充实绩值
  76. setHeader( mapHead , headStartRow , headEndRow );//质保书表头填充
  77. setChem(drlChem , chemValStartRow , chemTmplRow , map);//成分填充
  78. setQlty(drlQlty , qltyValStartRow , qltyTmplRow , map);//材质填充
  79. //合并单元格
  80. mergeQltyCells(qltySmallNameRow);//材质小名称行
  81. mergeQltyCells(qltyGigNameRow);//材质大名称行
  82. ///填充备注,制表人等
  83. wSheet.addCell( new Label(rmkStartCol, rmkStartRow, mapHead.get("CRET_NO_RMK")==null?"": mapHead.get("CRET_NO_RMK").toString(),wSheet.getCell(rmkStartCol, rmkStartRow).getCellFormat() ) );
  84. wSheet.addCell( new Label(tabulatorCol, tabulatorRow, mapHead.get("USERID")==null?"": mapHead.get("USERID").toString(),wSheet.getCell(tabulatorCol, tabulatorRow).getCellFormat() ) );
  85. }
  86. /**
  87. * 模板行的成分信息填充
  88. * @param tmplRow 原模板上录入成分实绩的行在当前操作副本上的行数,也就是成分开始的行
  89. * @param chemValStartCol 成分开始列
  90. */
  91. public void setChemTmpl(DataRowList drl , int tmplRow , int chemValStartCol , int chemCDRow) throws Exception
  92. {
  93. String key = "";
  94. String value = "";
  95. String extCode = "";
  96. for(int index =0 ; index < drl.size(); index++)
  97. {
  98. key = drl.getKey(index).toString();
  99. value = drl.getValue(index).toString();
  100. extCode = drl.getExtCode(index).toString();
  101. if("".equals(extCode))continue;//只填充元素名称
  102. for(int col = chemValStartCol ; col < columns; col++)
  103. {
  104. if( "".equals(wSheet.getCell(col, tmplRow).getContents().trim()))//判断是否已填充,只有成分元素才填充
  105. {
  106. wSheet.addCell(new Label(col , chemCDRow , key , ExcelStyleSeter.getChemValuetyle()));//元素代码行,元素名称填充
  107. wSheet.addCell(new Label(col , tmplRow , key , ExcelStyleSeter.getChemValuetyle()));//模板行
  108. break;//因为首先是按元素名循环,所以元素被填充后,需要进入大循环的下一个元素循环
  109. }
  110. }
  111. }
  112. }
  113. /**
  114. * 模板行的材质信息填充
  115. * @param tmplRow 材质模板行
  116. * @param qltyValStartCol 材质开始列
  117. * @param qltySmallNameRow材质小名称开始行
  118. */
  119. public void setQltyTmpl(DataRowList drl , int tmplRow , int qltyValStartCol , int qltySmallNameRow ) throws Exception
  120. {
  121. String key = "";
  122. String smallName = "";
  123. String bigName = "";
  124. String extCode = "";
  125. for(int index =0 ; index < drl.size(); index++)
  126. {
  127. key = drl.getKey(index).toString();
  128. // value = drl.getValue(index).toString();
  129. smallName = drl.getSmallName(index).toString();//小名称不可以为空,所以不判断,若为空则直接抛出异常
  130. bigName = drl.getBigName(index)==null?"":drl.getBigName(index).toString();
  131. extCode = drl.getExtCode(index)==null?"":drl.getExtCode(index).toString();
  132. for(int col = qltyValStartCol ; col < columns; col++)
  133. {
  134. if( "".equals(wSheet.getCell(col, tmplRow).getContents().trim())
  135. && !"".equals(smallName) )//判断是否已填充,只有材质、位置等才填充,对钢卷号等信息不填充
  136. {
  137. wSheet.addCell(new Label(col , qltySmallNameRow-1 , bigName , ExcelStyleSeter.getQltyNameStyle() ));//大名称
  138. wSheet.addCell(new Label(col , qltySmallNameRow , smallName , ExcelStyleSeter.getQltyNameStyle() ));//材质名称行
  139. wSheet.addCell(new Label(col , qltySmallNameRow+1 , extCode , ExcelStyleSeter.getQltyNameStyle() ));//补充码
  140. wSheet.addCell(new Label(col , tmplRow , key , ExcelStyleSeter.getChemValuetyle()/*,wSheet.getCell(col, 16).getCellFormat()*/));//模板行
  141. break;//某一列被填充后退出列的循环,进入下一个元素的循环。否则第一个元素将填满模板
  142. }
  143. }
  144. }
  145. }
  146. /**
  147. * @desc 表头填充
  148. * @param map 表头数据如合同号均在该map中
  149. * @param startRow 表头数据开始填充行
  150. * @param endRow 表头数据结束填充行
  151. * @throws Exception
  152. */
  153. public void setHeader(HashMap map , int startRow , int endRow) throws Exception
  154. {
  155. String key = "";
  156. //对表头所有的单元格进行循环,获取需要的质保书数据要求
  157. for(int row = 0 ; row <= endRow; row++)
  158. {
  159. for(int col = 0 ; col <= columns; col++)
  160. {
  161. key = wSheet.getCell(col, row).getContents().trim();//获取EXCEL中的文本内容
  162. if(key.equals(""))//EXCEL中内容为空,则进入下个循环处理
  163. continue;
  164. key = key.replaceFirst("\\[", "").replaceFirst("\\]", "").trim();//将EXCEL中用"[]"括起来的内容提取出来
  165. if(map.get(key) == null)//map中可能不包含所要求的内容,进入下个循环。
  166. continue;
  167. wSheet.addCell(new Label(col , row , map.get(key).toString() ,wSheet.getCell(col, row).getCellFormat()));
  168. }
  169. }
  170. }
  171. /**
  172. * @param chemValStartRow 成分实绩值填充起始行
  173. * @param tmplRow 成分模板行
  174. * @param chemCDRow 成分代码填充行(C、Si等名称)
  175. */
  176. public void setChem(DataRowList[] drl , int currentRow , int tmplValueRow ,HashMap map) throws Exception
  177. {
  178. String labelContent = "";//模板中的内容
  179. //成分行数据填充,包括钢卷号等
  180. for(int i = 0; i < drl.length; i++)
  181. {
  182. for(int col = 0 ; col < columns; col++)
  183. {
  184. labelContent = wSheet.getCell(col, tmplValueRow).getContents().trim();
  185. if("".equals(labelContent))//若模板中成分行的内容为空
  186. continue;
  187. if(drl[i].getValue(labelContent)==null)//为null则进入下次循环
  188. continue;
  189. //元素值
  190. wSheet.addCell(new Label(col , currentRow+i , drl[i].getValue(labelContent).toString() , ExcelStyleSeter.getCommStyle()) );
  191. }
  192. }
  193. }
  194. /**
  195. *
  196. * @param drl
  197. * @param qltyValStartRow 材质实绩值填充起始行
  198. * @param tmplRow 材质模板行
  199. * @throws Exception
  200. */
  201. public void setQlty(DataRowList[] drl , int qltyValStartRow , int tmplRow , HashMap map) throws Exception
  202. {
  203. Label label = null;
  204. String labelContent = "";//模板中的内容
  205. for(int i = 0; i < drl.length; i++)
  206. {
  207. for(int col = 0 ; col < columns ; col++)
  208. {
  209. labelContent = wSheet.getCell(col, tmplRow).getContents().trim();
  210. if("".equals(labelContent))//为空则进行下一次循环
  211. continue;
  212. if(drl[i].getValue(labelContent) == null)//DataRowList中可能不包含所要求的内容,进入下个循环。
  213. continue;
  214. label = new Label( col,qltyValStartRow+i ,drl[i].getValue(labelContent).toString() ,ExcelStyleSeter.getQltyValueStyle());
  215. wSheet.addCell(label);
  216. }
  217. }
  218. }
  219. public void setImage(ArrayList al )throws Exception
  220. {
  221. int imageNO = al.size()-1;//初始为行、列参数的定义,所以要减掉一个
  222. HashMap m = null;
  223. for(int i = 1 ; i <= imageNO; i++)
  224. {
  225. m = (HashMap)al.get(i);//不可从get(0)开始,0为行、列等的参数定义
  226. int col = StringFormat.getNumber(m.get("col").toString());
  227. int row = StringFormat.getNumber(m.get("row").toString());
  228. int width = StringFormat.getNumber(m.get("width").toString());
  229. int height = StringFormat.getNumber(m.get("height").toString());
  230. // System.out.println(col+"-------"+row+"----------"+"width"+"---------------"+height);
  231. String filePath= Thread.currentThread().getContextClassLoader().getResource("").getPath()+m.get("name").toString();
  232. File file = new File(filePath);
  233. WritableImage wi = new WritableImage(col,row,width,height , file);
  234. wSheet.addImage(wi);
  235. }
  236. }
  237. /**
  238. * @param currentRow 需要合并的行
  239. * @throws Exception
  240. */
  241. public void mergeQltyCells(int currentRow) throws Exception
  242. {
  243. String labelContent = "";
  244. String labelContentBefore = "";
  245. int count = 0;
  246. for(int col = 0; col <= columns; col++)
  247. {
  248. labelContent = wSheet.getCell(col , currentRow).getContents().trim();//当前单元格的值
  249. labelContentBefore = wSheet.getCell(col-1 , currentRow).getContents().trim();//之前一个单元格的值
  250. if(!labelContentBefore.equals(labelContent) && !"".equals(labelContentBefore))//
  251. {
  252. if((col-1)-count == col-1)
  253. continue;
  254. wSheet.mergeCells((col-1)-count, currentRow, col-1, currentRow );
  255. count = 0;//合并后,重新归0
  256. }
  257. else
  258. {
  259. count++;
  260. }
  261. }
  262. }
  263. }