WordTemplate.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. var controlObj;
  2. var reg=new RegExp("\{(.*?)_0_(.*?)\}","gi");
  3. /**
  4. * 填充主表数据
  5. * @param main
  6. */
  7. function initMainTable(main){
  8. controlObj = OfficePlugin.officeObjs[0].controlObj;
  9. var bookMarks = controlObj.ActiveDocument.BookMarks;
  10. var bookMarkCount = bookMarks.Count;
  11. for(var i=1;i<=bookMarks.Count;i++){
  12. var item = bookMarks.Item(i);
  13. var name = item.Name;
  14. if(name.indexOf('_0_')>0) continue;
  15. name = name.split('_1_')[0];
  16. var nameValue = main[name];
  17. if(nameValue==undefined || nameValue==null) continue;
  18. var currentRange = item.Range;
  19. currentRange.Text = nameValue ? nameValue : '';
  20. i--;// 因替换了一个书签,所以需要减一,否则bookMarks.Item(i)会取不到后面的书签
  21. }
  22. }
  23. /**
  24. * 填充子表。
  25. * @param subTables
  26. */
  27. function fillSubtables(subTables){
  28. //读取表的元数据
  29. var aryTableMeta=getMetaData();
  30. var tables = controlObj.ActiveDocument.Tables; //得到tables
  31. for(var i=0;i<aryTableMeta.length;i++){
  32. var tableMeta=aryTableMeta[i];
  33. var idx=tableMeta.tableIndex;
  34. var tableName=tableMeta.tableName;
  35. var currentTable = tables.Item(idx);
  36. var rows=subTables[tableName].dataList;
  37. //添加序号
  38. addRownumber(rows);
  39. debugger;
  40. //遍历加载每一个子表的数据。
  41. fillTable(currentTable,rows,tableMeta);
  42. }
  43. }
  44. /**
  45. * 列添加序列号
  46. * @param rows
  47. */
  48. function addRownumber(rows){
  49. for(var i=0;i<rows.length;i++){
  50. var obj=rows[i];
  51. obj.rn=i+1;
  52. }
  53. }
  54. /**
  55. * 填充子表
  56. * @param currentTable office表格
  57. * @param rows 子表对应的行数据
  58. * @param tableMeta 表格的元数据
  59. */
  60. function fillTable(currentTable,rows,tableMeta){
  61. var tbColMap=tableMeta.tbColMap;
  62. var rowCount = currentTable.rows.Count;
  63. var colCount = currentTable.columns.Count;
  64. //数据为空的情况
  65. if(rows.length==0){
  66. currentTable.rows(rowCount).Delete();
  67. }
  68. for(var i=0;i<rows.length;i++){
  69. var row=rows[i];
  70. //按照列填充。
  71. for(var col=1;col<=colCount;col++){
  72. var template=getTemplate(tbColMap,col);
  73. var rtn=template.replace(reg,function(p1,p2,p3){
  74. return row[p3];
  75. });
  76. var cell = currentTable.Cell(rowCount, col);
  77. cell.Range.Text=rtn;
  78. }
  79. //遍历到最后一行 不加数据。
  80. if(i<rows.length-1){
  81. currentTable.rows.add();
  82. rowCount++;
  83. }
  84. }
  85. }
  86. /**
  87. * 根据列编号获取列对应的模版。
  88. * @param tbColMap
  89. * @param col
  90. * @returns
  91. */
  92. function getTemplate(tbColMap,col){
  93. for(var i=0;i<tbColMap.length;i++){
  94. var obj=tbColMap[i];
  95. if(obj.colIndex==col){
  96. return obj.template;
  97. }
  98. }
  99. return "";
  100. }
  101. /**
  102. 读取表的元数据。
  103. *[
  104. * {
  105. * tableName:"",
  106. * tableIndex:1,
  107. * tbColMap:[{template:"{表名_0_字段名称1}",colIndex:1},{template:"{表名_0_字段名称2}",colIndex:1}]
  108. * }
  109. *]
  110. */
  111. function getMetaData(){
  112. var aryTableMeta=[];
  113. var tables = controlObj.ActiveDocument.Tables; //得到tables
  114. var tableCount = tables.Count; //得到table的数量
  115. if(tableCount==0) return aryTableMeta;
  116. for(var i=1;i<=tableCount;i++){
  117. var currentTable = tables.Item(i);
  118. // 表格列数
  119. var columnCount = currentTable.Columns.Count;
  120. var rowCount = currentTable.rows.Count;
  121. var isValidSubTalbe=isSubTable(currentTable);
  122. if(!isValidSubTalbe) continue;
  123. var tableMeta={};
  124. //表元数据索引
  125. tableMeta.tableIndex=i;
  126. var aryRowMeta=[];
  127. //列元数据读取
  128. for(var c=1; c<=columnCount;c++){
  129. var cell = currentTable.Cell(rowCount, c);
  130. var val = cell.Range.Text;
  131. var rowMetaObj={};
  132. rowMetaObj.colIndex=c;
  133. rowMetaObj.template=val.substring(0,val.length-2);
  134. aryRowMeta.push(rowMetaObj);
  135. }
  136. tableMeta.tbColMap=aryRowMeta;
  137. aryTableMeta.push(tableMeta);
  138. }
  139. handTableMeta(aryTableMeta);
  140. return aryTableMeta;
  141. }
  142. /**
  143. * 判断最后一行的第一个单元格内容是否包含_0_数据,如果包含则表示这是一个子表。
  144. * @param currentTable
  145. * @returns {Boolean}
  146. */
  147. function isSubTable(currentTable){
  148. // 表格列数
  149. var columnCount = currentTable.Columns.Count;
  150. var rowCount = currentTable.rows.Count;
  151. var cell = currentTable.Cell(rowCount, 1);
  152. var val = cell.Range.Text;
  153. return (val.indexOf("_0_")>-1) ;
  154. //_0_
  155. }
  156. function handTableMeta(aryTableMeta){
  157. //splice
  158. for(var i=aryTableMeta.length-1;i>=0;i--){
  159. var tableMeta=aryTableMeta[i];
  160. validTable(tableMeta);
  161. var isValid=tableMeta.isValid;
  162. if(!isValid){
  163. //删除无效元数据
  164. aryTableMeta.splice(i,1);
  165. }
  166. }
  167. }
  168. /**
  169. * 验证表的元数据。
  170. * @param tableMeta
  171. */
  172. function validTable(tableMeta){
  173. var aryCol=tableMeta.tbColMap;
  174. var rowMetaData={};
  175. var isValid=false;
  176. for(var i=0;i<aryCol.length;i++){
  177. var colObj=aryCol[i];
  178. var gridText=colObj.template;
  179. if(gridText.trim()=="") {
  180. continue;
  181. }
  182. var match = reg.exec(gridText);
  183. if(match==null) continue;
  184. tableMeta.tableName=match[1];
  185. isValid=true;
  186. if(isValid){
  187. break;
  188. }
  189. }
  190. tableMeta.isValid=isValid;
  191. }
  192. function printWord(){
  193. var oldOption;
  194. try
  195. {
  196. var objOptions = controlObj.ActiveDocument.Application.Options;
  197. oldOption = objOptions.PrintBackground;
  198. objOptions.PrintBackground = false;
  199. }
  200. catch(err){};
  201. controlObj.printout(true);
  202. try
  203. {
  204. var objOptions = controlObj.ActiveDocument.Application.Options;
  205. objOptions.PrintBackground = oldOption;
  206. }
  207. catch(err){};
  208. }