fcRep.js
上传用户:mingda
上传日期:2017-06-20
资源大小:27691k
文件大小:128k
源码类别:

OA系统

开发平台:

Java

  1. //2002.06.19 北京方成公司 梅勇
  2. //写隐藏div用于装表数据的备份
  3. document.write('<div id=tCopy style="DISPLAY: none; "></div>')
  4. //装入报表提示等待
  5. document.write('<div id=ShowWait  style="BACKGROUND-COLOR: antiquewhite;  COLOR: red; DISPLAY: none; FONT-SIZE: x-large; FONT-STYLE: normal; FONT-WEIGHT: bold; HEIGHT: 600px; LEFT:0px; position:absolute; TOP: 0px; WIDTH: 800px; Z-INDEX: 100">&nbsp;&nbsp;正在装入,请稍候...</div>')
  6. //装入用于开发的一排报表
  7. LoadButton()
  8. document.write('<TEXTAREA id=txt1 rows=3 style="DISPLAY: none; HEIGHT: 52px; LEFT: 132px; POSITION: absolute; TOP: 345px; WIDTH: 302px"></TEXTAREA>')
  9. var curKeyCode //用于webgrid中直接按键输入时运行timer时传递当前输入字符及原串
  10. var fc_wherexml="" //当前的XML条件串
  11. var fc_curpage=1 //当前页号
  12. var fc_allpages=1 //总页数
  13. //用于处理查询字段的输入和输出参数
  14. var sActFieldIn=""
  15. var sActFieldOut=""
  16. var blnMouseDown=false //在表格上mousedown时此变量为真
  17. //用于当移到边界外时捕获鼠标,自动滚动.
  18. var blnCapture=false
  19. var iTimeID=0
  20. var iTimeID1=0
  21. var iTimeID2=0
  22. var iTimeID3=0
  23. var tdEndSel //
  24. //---------------------
  25. //选择时,记录起止单元的坐标
  26. var sTop,sLeft,sWidth,sHeight,eTop,eLeft,eWidth,eHeight
  27. //记录选择时的起止单元格的物理位置
  28. var sRow,sCol,eRow,eCol
  29. //排好序后的位置
  30. var sRowSort,sColSort,eRowSort,eColSort
  31. //处于运行模式
  32. var blnRunMode=false
  33. //决定报表是否变化了
  34. var blnChange=false
  35. //不要运行表格的mouseup,thead_onclick时只运行在mousedown
  36. var NoRunMouseUp=false
  37. //当显示全部时要自动加行,将行数存此全局变量中
  38. var AutoAddLines=0
  39. //---------------------
  40. var lngUndo=-1
  41. var lngRedo=-1
  42. var oUndo
  43. oUndo=new ActiveXObject("Microsoft.XMLDOM")
  44. oUndo.async ="false";
  45. oUndo.loadXML("<root></root>")
  46. var oRedo
  47. oRedo=new ActiveXObject("Microsoft.XMLDOM")
  48. oRedo.async ="false";
  49. oRedo.loadXML("<root></root>")
  50. //---------------------
  51. var oFormula
  52. oFormula=new ActiveXObject("Microsoft.XMLDOM")
  53. oFormula.async ="false";
  54. oFormula.loadXML("<root></root>")
  55. var oGraph
  56. oGraph=new ActiveXObject("Microsoft.XMLDOM")
  57. oGraph.async ="false";
  58. oGraph.loadXML("<root></root>")
  59. //用于检查公式嵌套时ExpandFormula函数,传一个成功与失败的参数
  60. var bCheckFormula=false
  61. //保存公式嵌套错误信息的数组
  62. var arrCheckFormula=new Array()
  63. function ErrorFormula(sGetcell,sFormula,RC){
  64. this.sGetcell=sGetcell //"GETCELL(2,3)"
  65. this.sFormula=sFormula //"B2+B3"
  66. this.RC=RC //"C3"
  67. }
  68. /**
  69. *表格MOUSEDOWN事件处理,处理选择区域
  70. **/
  71. function t_onmousedown() {
  72. //show("t_onmousedown")
  73. var obj=event.srcElement 
  74. if (event.button ==2)
  75. return;
  76. if(obj.tagName=="TD"){
  77. //alert(grid.ReadOnly)
  78. //如果只读
  79. var s1=obj.getAttribute("pressenter")
  80. if(grid.ReadOnly && s1==null){
  81.  return
  82. }
  83. //-------
  84. if(t.rows(0).style.cursor=="default" && t.childNodes(0).childNodes(0).style.cursor=="default"){
  85. if(thead_onclick()){
  86. return
  87. }
  88. }
  89. }
  90. if(obj.id!="txtMyGrid"){
  91. if (obj.tagName!="TD" || obj.parentNode.rowIndex==0 || obj.cellIndex==0)
  92. return
  93. }
  94. //固定行上不能选择
  95. //if (blnFixRowDrap && obj.parentNode.rowIndex<lngFixRows) return
  96. //if (bShowMenu)
  97. showFontProperty(obj)
  98. blnMouseDown=true
  99. //if (t.rows(0).style.cursor =="move" || t.childNodes(0).childNodes(0).style.cursor =="move"){
  100. //}
  101. //else {
  102. if (blnCapture==false) {
  103. //show("Capture")
  104. blnCapture=true
  105. t.setCapture()
  106. }
  107. //}
  108. sLeft=obj.offsetLeft //初始位置
  109. sTop=obj.offsetTop 
  110. sWidth=obj.offsetWidth 
  111. sHeight=obj.offsetHeight 
  112. if(t.style.borderLeftStyle=="none")
  113. sLeft++
  114. if(t.style.borderTopStyle=="none")
  115. sTop++
  116. eLeft=sLeft 
  117. eTop=sTop 
  118. eWidth=sWidth 
  119. eHeight=sHeight 
  120. var i
  121. //下面两个循环计算起始行列值
  122. var tmp=1
  123. for (i=0;i<=t.rows(0).cells.length-1;i++)
  124. {
  125. if(t.childNodes(0).childNodes(i).style.pixelWidth>0) 
  126. tmp=tmp+t.childNodes(0).childNodes(i).style.pixelWidth
  127. if (tmp==sLeft)
  128. {
  129. sCol=i+1
  130. while (t.childNodes(0).childNodes(sCol).style.pixelWidth==0) {
  131. sCol=sCol+1
  132. if (sCol==t.rows(0).cells.length-1)
  133. break;
  134. }
  135. break;
  136. }
  137. }
  138. tmp=1
  139. for (i=0;i<t.rows.length;i++)
  140. {
  141. if (t.rows(i).style.display!="none") 
  142. tmp=tmp+t.rows(i).style.pixelHeight
  143. if (tmp==sTop)
  144. {
  145. sRow=i+1
  146. while (t.rows(sRow).style.display=="none") {
  147. sRow=sRow+1
  148. if (sRow==t.rows.length-1)
  149. break;
  150. }
  151. break;
  152. }
  153. }
  154. //当选中一个合并单元时
  155. var arr=PhyToLog(sRow,sCol)
  156. var iRowSpan=t.rows(arr[0]).cells(arr[1]).rowSpan
  157. var iColSpan=t.rows(arr[0]).cells(arr[1]).colSpan
  158. eRow=sRow+iRowSpan-1
  159. eCol=sCol+iColSpan-1
  160. sRowSort=sRow
  161. sColSort=sCol
  162. eRowSort=eRow
  163. eColSort=eCol
  164. showBlueRect()
  165. showBlueScale(sRow,sCol,sRow,sCol)
  166. //先运行控件外的onmousedown
  167. var curObjTmp=event.srcElement
  168. if(curObjTmp.tagName!="TD") return
  169. if (curObjTmp.parentNode.rowIndex>0 && curObjTmp.cellIndex>0) {
  170. //if(typeof curObj=="undefined") curObj=curObjTmp
  171. try {
  172. grid.actcellchange(curObjTmp)
  173. }
  174. catch (e){}
  175. //curObj=curObjTmp
  176. //mcurRow=curObj.parentNode.rowIndex
  177. //mcurCol=curObj.cellIndex
  178. grid.moveedit(curObjTmp)
  179. }
  180. }
  181. /**
  182. *表格MOUSEMOVE事件处理,处理选择区域
  183. **/
  184. function t_onmousemove() {
  185. if (event.button ==2)
  186. return;
  187. if (blnMouseDown && grid.autosize==false) {
  188. if  (event.y>grid.top+grid.height-17) {
  189. if (iTimeID==0) {
  190. iTimeID=window.setInterval("grid.Scroll(2)",200)
  191. }
  192. }
  193. else
  194. {
  195. if (iTimeID!=0) {
  196. window.clearInterval(iTimeID)
  197. }
  198. iTimeID=0
  199. }
  200. if  (event.y<grid.top) {
  201. if (iTimeID1==0) {
  202. iTimeID1=window.setInterval("grid.Scroll(1)",200)
  203. }
  204. }
  205. else
  206. {
  207. if (iTimeID1!=0) {
  208. window.clearInterval(iTimeID1)
  209. }
  210. iTimeID1=0
  211. }
  212. if  (event.x<=grid.left+35) {//35左边列宽
  213. if (iTimeID2==0) {
  214. iTimeID2=window.setInterval("grid.Scroll(3)",200)
  215. }
  216. }
  217. else
  218. {
  219. if (iTimeID2!=0) {
  220. window.clearInterval(iTimeID2)
  221. }
  222. iTimeID2=0
  223. }
  224. if  (event.x>=grid.left+grid.width-17) {//17右边滚动条宽
  225. if (iTimeID3==0) {
  226. iTimeID3=window.setInterval("grid.Scroll(4)",200)
  227. }
  228. }
  229. else
  230. {
  231. if (iTimeID3!=0) {
  232. window.clearInterval(iTimeID3)
  233. }
  234. iTimeID3=0
  235. }
  236. }
  237. t.style.cursor="default"
  238. var obj=event.srcElement 
  239. if (obj.tagName!="TD" || obj.parentNode.rowIndex==0 || obj.cellIndex==0)
  240. return
  241. if ( blnMouseDown==true){
  242. document.selection.clear()
  243. eLeft=obj.offsetLeft 
  244. eTop=obj.offsetTop 
  245. eWidth=obj.offsetWidth 
  246. eHeight=obj.offsetHeight 
  247. //show("sLeft="+sLeft+" sTop="+sTop+" sWidth="+sWidth+" sHeight="+sHeight
  248. //+" eLeft="+eLeft+" eTop="+eTop+" eWidth="+eWidth+" eHeight="+eHeight)
  249. tdEndSel=obj
  250. showBlueRect()
  251. }
  252. }
  253. /**
  254. *表格MOUSEUP事件处理,处理选择区域
  255. **/
  256. function t_onmouseup() {
  257. if(NoRunMouseUp) {
  258. NoRunMouseUp=false
  259. return
  260. }
  261. var bTmp=false
  262. blnMouseDown=false
  263. if (blnCapture) {
  264. if (iTimeID!=0) {
  265. window.clearInterval(iTimeID)
  266. bTmp=true
  267. }
  268. iTimeID=0
  269. if (iTimeID1!=0) {
  270. window.clearInterval(iTimeID1)
  271. bTmp=true
  272. }
  273. iTimeID1=0
  274. if (iTimeID2!=0) {
  275. window.clearInterval(iTimeID2)
  276. bTmp=true
  277. }
  278. iTimeID2=0
  279. if (iTimeID3!=0) {
  280. window.clearInterval(iTimeID3)
  281. bTmp=true
  282. }
  283. iTimeID3=0
  284. blnCapture=false
  285. t.releaseCapture()
  286. }
  287. var obj,iRow,iCol
  288. var bTmp=false
  289. if (event.button ==2)
  290. return;
  291. //当光标移到表外时,取mousemove保留的结尾选择单元格(tdEndSel)
  292. if (event.y>grid.top+t.offsetHeight || event.y<grid.top || event.x<=grid.left+35 || event.x>=grid.left+t.offsetWidth ) 
  293. obj=tdEndSel
  294. else
  295. obj=event.srcElement 
  296. try{
  297. var sTest=obj.tagName
  298. }
  299. catch (e){
  300. obj=t.rows(0).cells(0)
  301. }
  302. if(obj.tagName=="TD"){
  303. //如果只读
  304. var s1=obj.getAttribute("pressenter")
  305. if(grid.ReadOnly && s1==null){
  306.  return
  307. }
  308. }
  309. try {
  310. if (obj.tagName!="TD"  || obj.cellIndex==0 || obj.parentNode.rowIndex==0 )
  311. return
  312. }
  313. catch (e){return}
  314. eLeft=obj.offsetLeft 
  315. eTop=obj.offsetTop 
  316. eWidth=obj.offsetWidth 
  317. eHeight=obj.offsetHeight
  318. //计算列宽行高,用于计算起止点的物理位置.
  319. var i,j
  320. var tmp=1
  321. for (i=0;i<=t.rows(0).cells.length-1;i++)
  322. {
  323. if(t.childNodes(0).childNodes(i).style.pixelWidth>0) { 
  324. tmp=tmp+t.childNodes(0).childNodes(i).style.pixelWidth
  325. }
  326. if (tmp==eLeft+eWidth)
  327. {
  328. eCol=i
  329. break;
  330. }
  331. }
  332. tmp=1
  333. for (i=0;i<t.rows.length;i++)
  334. {
  335. if (t.rows(i).style.display!="none")
  336. tmp=tmp+t.rows(i).style.pixelHeight
  337. if (tmp==eTop+eHeight)
  338. {
  339. eRow=i
  340. break;
  341. }
  342. }
  343. //show(sCol+" "+sRow+"  "+eCol+"  "+eRow)
  344. if(sRow>eRow){
  345. sRowSort=eRow
  346. eRowSort=sRow
  347. }
  348. else {
  349. sRowSort=sRow
  350. eRowSort=eRow
  351. }
  352. if(sCol>eCol){
  353. sColSort=eCol
  354. eColSort=sCol
  355. }
  356. else {
  357. sColSort=sCol
  358. eColSort=eCol
  359. }
  360. showBlueRect()
  361. showBlueScale(sRow,sCol,eRow,eCol)
  362.         if(blnRunMode==false){
  363. if (cmdBrush.getAttribute("fcDown")=="1") {
  364. cmdPasteFormat()
  365. cmdBrush.setAttribute("fcDown","0")
  366. cmdBrush.className="tblclassup"
  367. clearBlueScale()
  368. }
  369.         }
  370. }
  371. /**
  372. //表头点击处理
  373. **/
  374. function thead_onclick() {
  375. if (event.srcElement.tagName!="TD") return false
  376. var curColNo=event.srcElement.cellIndex
  377. var curRowNo=event.srcElement.parentNode.rowIndex
  378. if(curColNo==0 && curRowNo==0) {
  379. //点左上角
  380. selectRange(1,1,t.rows.length-1,t.rows(0).cells.length-1)
  381. NoRunMouseUp=true
  382. }
  383. else if(curRowNo==0) {
  384. //点第一列
  385. selectRange(1,curColNo,t.rows.length-1,curColNo)
  386. NoRunMouseUp=true
  387. }
  388. else if(curColNo==0){
  389. //点第一行
  390. selectRange(curRowNo,1,curRowNo,t.rows(0).cells.length-1)
  391. NoRunMouseUp=true
  392. }
  393. return  NoRunMouseUp
  394. }
  395. /**
  396. *清除兰色的选中框
  397. **/
  398. function clearBlueScale(){
  399. tc.style.display ="none"
  400. for(var i=0;i<t.rows.length;i++)
  401. t.rows(i).cells(0).style.color="black"
  402. for(var j=0;j<t.rows(0).cells.length;j++)
  403. t.rows(0).cells(j).style.color="black"
  404. hideTxt()
  405. }
  406. /**
  407. *隐藏输入文本框
  408. **/
  409. function hideTxt(){
  410. txtMyGrid.style.display="none"
  411. }
  412. /**
  413. *显示兰色的选中框
  414. **/
  415. function showBlueScale(r0,c0,r1,c1){
  416. if(grid.ReadOnly) return
  417. //显示兰色的选中框
  418. var row0,col0,row1,col1 //物理位置
  419. //排序
  420. if (r1>r0){
  421. row0=r0
  422. row1=r1
  423. }
  424. else {
  425. row0=r1
  426. row1=r0
  427. }
  428. if (c1>c0){
  429. col0=c0
  430. col1=c1
  431. }
  432. else {
  433. col0=c1
  434. col1=c0
  435. }
  436. for (var i=0;i<t.rows.length;i++){
  437. if(i>=row0 && i<=row1 )
  438. t.rows(i).cells(0).style.color="blue"
  439. else
  440. t.rows(i).cells(0).style.color="black"
  441. }
  442. for (var i=0;i<t.rows(0).cells.length;i++){
  443. if(i>=col0 && i<=col1)
  444. t.rows(0).cells(i).style.color="blue"
  445. else
  446. t.rows(0).cells(i).style.color="black"
  447. }
  448. //显示框的背景色
  449. if (row0==row1 && col0==col1)//选中单个单元格
  450. tc.style.background ="white"
  451. else
  452. tc.style.background ="#e6e6fa"
  453. // if (lngStatus==3)//选中一个大的合并单元格
  454. // tc.style.background ="white"
  455. tc.style.display ="block"
  456. tc.style.zIndex =-1
  457. }
  458. /**
  459. *根据sLeft sTop sWidth sHeight eLeft eTop eWidth eHeight这八个全局变量的值计算兰框的位置
  460. **/
  461. function showBlueRect(){
  462. var curLeft,curTop,curWidth,curHeight
  463. /*
  464. var ssWidth,ssHeight
  465. if(sWidth>eWidth)
  466. ssWidth=sWidth
  467. else
  468. ssWidth=eWidth
  469. if(sHeight>eHeight)
  470. ssHeight=sHeight
  471. else
  472. ssHeight=eHeight
  473. */
  474. if (sLeft==eLeft && sTop==eTop) {
  475. curLeft=sLeft
  476. curTop=sTop
  477. curWidth=sWidth
  478. curHeight=sHeight
  479. }
  480. if (sLeft<=eLeft && sTop<=eTop)
  481. {
  482. curLeft=sLeft
  483. curTop=sTop
  484. curWidth=eWidth+eLeft-sLeft
  485. curHeight=eHeight+eTop-sTop
  486. }
  487. if (sLeft<=eLeft && sTop>eTop)
  488. {
  489. curLeft=sLeft
  490. curTop=eTop
  491. curWidth=eWidth+eLeft-sLeft
  492. curHeight=sHeight+sTop-eTop
  493. }
  494. if (sLeft>=eLeft && sTop>=eTop)
  495. {
  496. curLeft=eLeft
  497. curTop=eTop
  498. curWidth=sWidth+sLeft-eLeft
  499. curHeight=sHeight+sTop-eTop
  500. }
  501. if (sLeft>eLeft && sTop<=eTop)
  502. {
  503. curLeft=eLeft
  504. curTop=sTop
  505. curWidth=sWidth+sLeft-eLeft
  506. curHeight=eHeight+eTop-sTop
  507. }
  508. // tc.style.display ="block"
  509. // tc.style.zIndex =-1
  510. tc.style.left =curLeft
  511. tc.style.top =curTop
  512. tc.style.width =curWidth
  513. tc.style.height =curHeight
  514. }
  515. /**
  516. *选择某个区域的常用函数
  517. **/
  518. function selectRange(sRow1,sCol1,eRow1,eCol1){
  519. //
  520. sRow=sRow1
  521. sCol=sCol1
  522. eRow=eRow1
  523. eCol=eCol1
  524. if(sRow>eRow){
  525. sRowSort=eRow
  526. eRowSort=sRow
  527. }
  528. else {
  529. sRowSort=sRow
  530. eRowSort=eRow
  531. }
  532. if(sCol>eCol){
  533. sColSort=eCol
  534. eColSort=sCol
  535. }
  536. else {
  537. sColSort=sCol
  538. eColSort=eCol
  539. }
  540. showBlueScale(sRow,sCol,eRow,eCol)
  541. var arr=PhyToLog(sRow,sCol)
  542. var td1=t.rows(arr[0]).cells(arr[1])
  543. sLeft=td1.offsetLeft
  544. sTop=td1.offsetTop
  545. sWidth=td1.offsetWidth
  546. sHeight=td1.offsetHeight
  547. var arr1=PhyToLog(eRow,eCol)
  548. var td2=t.rows(arr1[0]).cells(arr1[1])
  549. eLeft=td2.offsetLeft
  550. eTop=td2.offsetTop
  551. eWidth=td2.offsetWidth
  552. eHeight=td2.offsetHeight
  553. showBlueRect()
  554. grid.moveedit(td1)
  555. }
  556. /**
  557. *单元格拆分
  558. **/
  559. function Split() {
  560. //show(sCol+" "+sRow+"  "+eCol+"  "+eRow)
  561. var lngStatus=SelStatus(sRow,sCol,eRow,eCol)
  562. if(lngStatus!=3) return
  563. //show(tCopy.innerHTML)
  564. var rCount=eRowSort-sRowSort+1 //合并的行数
  565. var cCount=eColSort-sColSort+1 //合并的列数
  566. //增加第一行之后的所有单元格
  567. for (var i=eRowSort;i>=sRowSort+1;i--){
  568. var tdsCol=PhyToLogCol(i,sColSort)
  569. //show("r="+i+" c="+sCol+" tdCol="+tdsCol)
  570. var tdeCol=eColSort-sColSort+tdsCol
  571. //show(tdeCol+" "+tdsCol)
  572. for (var j=tdsCol;j<=tdeCol;j++){
  573. if (tdsCol<t.rows(i).cells.length)
  574. t.rows(i).insertCell(tdsCol)
  575. else
  576. t.rows(i).insertCell()
  577. }
  578. }
  579. //增加第一行的第一个单元格之后的单元格
  580. var tdsCol=PhyToLogCol(sRowSort,sColSort)
  581. var tdeCol=eColSort-sColSort+tdsCol
  582. for (var j=tdsCol+1;j<=tdeCol;j++){
  583. if(tdsCol+1<t.rows(sRowSort).cells.length)
  584. t.rows(sRowSort).insertCell(tdsCol+1)
  585. else
  586. t.rows(sRowSort).insertCell()
  587. }
  588. //给第一单元格的rowSpan colSpan
  589. t.rows(sRowSort).cells(tdsCol).rowSpan=1
  590. t.rows(sRowSort).cells(tdsCol).colSpan=1
  591. CopytHtml()
  592. grid.moveedit()
  593. blnChange=true
  594. }
  595. /**
  596. *sRow sCol eRow eCol 单元格合并
  597. **/
  598. function Merge() {
  599. //
  600. //show(sCol+" "+sRow+"  "+eCol+"  "+eRow)
  601. var lngStatus=SelStatus(sRow,sCol,eRow,eCol)
  602. if(lngStatus!=4 ) return
  603. var rCount=eRowSort-sRowSort+1 //合并的行数
  604. var cCount=eColSort-sColSort+1 //合并的列数
  605. //删除第一行之后的所有单元格
  606. for (var i=eRowSort;i>=sRowSort+1;i--){
  607. var tdeCol=PhyToLogCol(i,eColSort)
  608. var tdsCol=PhyToLogCol(i,sColSort)
  609. for (var j=tdeCol;j>=tdsCol;j--){
  610. try {
  611. t.rows(i).deleteCell(j)
  612. }
  613. catch (e){}
  614. }
  615. }
  616. //删除第一行的第一个单元格之后的单元格
  617. var tdeCol=PhyToLogCol(sRowSort,eColSort)
  618. var tdsCol=PhyToLogCol(sRowSort,sColSort)
  619. for (var j=tdeCol;j>=tdsCol+1;j--){
  620. try {
  621. t.rows(sRowSort).deleteCell(j)
  622. }
  623. catch (e){}
  624. }
  625. //给第一单元格的rowSpan colSpan
  626. t.rows(sRowSort).cells(tdsCol).rowSpan=rCount
  627. t.rows(sRowSort).cells(tdsCol).colSpan=cCount
  628. CopytHtml()
  629. grid.moveedit()
  630. blnChange=true
  631. }
  632. function PhyToLog(row,col) {
  633. return PhyToLogTmp(row,col,1)
  634. }
  635. /**
  636. 求同一行物理列col的前面有多少个TD被合并了.然后返回col减去这个个数.
  637. 用于合并和拆分时找到删除TD和插入TD的位置
  638. **/
  639. function PhyToLogCol(row,col) {
  640. return PhyToLogTmp(row,col,3)
  641. }
  642. /**
  643. 物理位置-->逻辑位置(td位置)
  644.   A:获得TD 
  645. 找物理位置row,col,
  646. if物理位置row,col的单元格无tdCol属性
  647. 查找此行且小于此列共有多少个有tdCol属性的单元格,td位置=col-有tdCol属性的单元格个数
  648. 行为当前行.
  649. if物理位置row,col的单元格有tdCol属性,则td位置=tdCol,tdRow属性值 
  650. **/
  651. function PhyToLogTmp(row,col,iType) {
  652. //中间函数
  653. //iType=1 返回TD, =2 返回TD对应的逻辑列col, =3返回单元格对应当前行所处的列位置,  
  654. var t=tCopy.childNodes(0)
  655. var td_col=parseInt(t.rows(row).cells(col).getAttribute("tdCol"))
  656. var td_row=0
  657. var AddCols=0
  658. for(var j=0;j<col;j++){
  659. var tmp1=parseInt(t.rows(row).cells(j).getAttribute("tdCol"))
  660. if (isNaN(tmp1)==false) 
  661. AddCols++
  662. }
  663. if (isNaN(td_col)) {
  664. td_col=col-AddCols
  665. td_row=row
  666. }
  667. else {
  668. if(iType==3){
  669. td_col=col-AddCols
  670. }
  671. td_row=parseInt(t.rows(row).cells(col).getAttribute("tdRow"))
  672. if(isNaN(td_row)) td_row=0 //属于意外
  673. }
  674. //
  675. if(iType==1) {
  676. //alert("row:"+td_row+"col:"+td_col)
  677. //return t.rows(td_row).cells(td_col)
  678. var arr=new Array()
  679. arr[0]=td_row
  680. arr[1]=td_col
  681. return arr
  682. //返回一个TD行列值组成的数组
  683. }
  684. if(iType==2 || iType==3)
  685. return td_col
  686. }
  687. /**
  688. 逻辑位置(td位置)-->物理位置 {此时行号是不变,只需求列号}
  689.   A:一个单元格 B:一组单元格
  690. 找逻辑位置row,由小到大比较此行的列号和col(逻辑位置(td位置)),如单元格有tdCol属性则变量不加1,否则加1,
  691. 直到此变量等于col为至,此时当前单元格的列号即为物理位置的列号.
  692. 如是一组单元格则返回左上角单元格的列号
  693. **/
  694. function LogToPhy(row,col) {
  695. var colRet
  696. var AddCols=-1
  697. for(var j=0;j<tCopy.childNodes(0).rows(row).cells.length;j++){
  698. var tmp1=parseInt(tCopy.childNodes(0).rows(row).cells(j).getAttribute("tdCol"))
  699. if (isNaN(tmp1)) 
  700. AddCols++
  701. if(AddCols==col) {
  702. colRet=j
  703. break
  704. }
  705. }
  706. return colRet
  707. }
  708. /**
  709. 区域物理位置(sRow,sCol,eRow,eCol)-->判断:
  710. 0 意外,超出表格的行或列范围
  711. 1 一个单纯独立的单元格
  712. 2 一个合并单元格中的一部分
  713. 3 一个单纯的合并单元格
  714. 4 多个单纯独立的单元格组成的区域
  715. 5 整个合并单元格和小单元格组成的区域
  716. 直接输入或超链接:
  717. 一个小单元格/一个合并单元格
  718. 增删行列
  719. 一个小单元格
  720. 能合并
  721. 4多个小单元格组成的区域/5由整个合并单元加一些小单元格组成的区域
  722. 不能合并
  723. 一个小单元格/一个合并单元格/一个合并单元格的一部分
  724. 能拆分
  725. 3一个合并单元格
  726. 不能拆分
  727. NOT 一个合并单元格
  728. 设置字体等单元格属性
  729. 一个小单元格/一个合并单元格/多个小单元格组成的区域/由整个合并单元加一些小单元格组成的区域
  730. 在一个合并单元格的一部分+一些小单元格组成的区域情况下直接取单元格进行设置
  731. **/
  732. function SelStatus(sRow,sCol,eRow,eCol){
  733. //如果兰框未显示或行列超范围则返回0
  734. if(tc.style.display=="none" )
  735. return 0
  736. if(sRow==eRow && sCol==eCol) {
  737. return 1
  738. }
  739. var t=tCopy.childNodes(0)
  740. var colCount
  741. var rowCount=parseInt(t.rows(sRowSort).cells(sColSort).getAttribute("rowCount"))
  742. if(isNaN(rowCount)==false){
  743. colCount=parseInt(t.rows(sRowSort).cells(sColSort).getAttribute("colCount"))
  744. //show(rowCount+"=="+(eRowTmp-sRowTmp))
  745. if(rowCount-1==eRowSort-sRowSort && colCount-1==eColSort-sColSort){
  746. //只有一个合并单元格
  747. return 3
  748. }
  749. }
  750. //-------
  751. //判断区域中:包含整个合并单元/包含部分合并单元
  752. //如果合并单元格的主单元格在区域外,则肯定是包含部分合并单元
  753. //如果有一个合并单元格的主单元格+rowCount/+colCount超出区域的话,则肯定是包含部分合并单元
  754. var bMerge=false //是否有合并单元标志
  755. var bAllMerge=true //是否包含整个合并单元标志
  756. for(var i=sRowSort;i<=eRowSort;i++){
  757. for(var j=sColSort;j<=eColSort;j++){
  758. var rowCount=parseInt(t.rows(i).cells(j).getAttribute("rowCount"))
  759. if(isNaN(rowCount)==false){
  760. bMerge=true
  761. var colCount=parseInt(t.rows(i).cells(j).getAttribute("colCount"))
  762. if(i+rowCount-1>eRowSort || j+colCount-1>eColSort){
  763. bAllMerge=false
  764. }
  765. }
  766. var td_col=parseInt(t.rows(i).cells(j).getAttribute("tdCol"))
  767. if(isNaN(td_col)==false){
  768. var td_row=parseInt(t.rows(i).cells(j).getAttribute("tdRow"))
  769. if(td_row<sRowSort || td_row>eRowSort || td_col<sColSort || td_col>eColSort){
  770. //在区域外
  771. bAllMerge=false
  772. }
  773. bMerge=true
  774. }
  775. }
  776. }
  777. if(bMerge==false){ //一组小单元格
  778. return 4
  779. }
  780. if(bMerge){
  781. if (bAllMerge){
  782. //如果包含整个合并单元
  783. return 5
  784. }
  785. else {
  786. //包含部分合并单元
  787. return 2
  788. }
  789. }
  790. }
  791. //将物理位置-->逻辑位置(td位置)
  792. //td的列号,因行号相同
  793. /**计算方法:
  794. 将合并单元格按顺序展开,新加的单元格加一个tdCol属性用于标识此单元格对应的td位置.
  795. 物理位置-->逻辑位置(td位置)
  796.   A:获得TD 
  797. 找物理位置row,col,
  798. if物理位置row,col的单元格无tdCol属性
  799. 查找此行且小于此列共有多少个有tdCol属性的单元格,td位置=col-有tdCol属性的单元格个数
  800. 行为当前行.
  801. if物理位置row,col的单元格有tdCol属性,则td位置=tdCol,tdRow属性值 
  802. 逻辑位置(td位置)-->物理位置 {此时行号是不变,只需求列号}
  803.   A:一个单元格 B:一组单元格
  804. 找逻辑位置row,由小到大比较此行的列号和col(逻辑位置(td位置)),如单元格有tdCol属性则变量不加1,否则加1,
  805. 直到此变量等于col为至,此时当前单元格的列号即为物理位置的列号.
  806. *复制t.outerHTML
  807. **/
  808. function CopytHtml() {
  809. var s1=t.outerHTML
  810. s1=fc_RepStr(s1," id=t "," ")
  811. tCopy.innerHTML=s1
  812. ExpandTab(tCopy.childNodes(0))
  813. }
  814. /**
  815. *将合并单元格按顺序展开,新加的单元格加一个tdRow,tdCol属性用于标识此单元格对应的td位置.
  816. **/
  817. function ExpandTab(t) {
  818. // var d=new Date()
  819. // var t2=d.getTime()
  820. var curAddCell
  821. for (var i=0;i<t.rows.length ;i++) {
  822. for (var j=0;j<t.rows(i).cells.length ;j++) {
  823. var curTD=t.rows(i).cells(j)
  824. var lngRows=parseInt(curTD.rowSpan)
  825. if (isNaN(lngRows))lngRows=0
  826. var lngCols=parseInt(curTD.colSpan)
  827. if (isNaN(lngCols))lngCols=0
  828. if(lngCols>1 || lngRows>1 ) {
  829.     var td_col=0
  830.     var td_row=0
  831.     td_col=parseInt(curTD.getAttribute("tdCol"))
  832.     if(isNaN(td_col)==false) {
  833.     //表示此单元格为一个生成的合并单元格
  834. td_row=parseInt(curTD.getAttribute("tdRow"))
  835. if (isNaN(td_row)) td_row=0 //属于意外
  836.     }
  837.     else {
  838. //原始合并单元加上如下属性
  839. curTD.setAttribute("rowCount",curTD.rowSpan)
  840. curTD.setAttribute("colCount",curTD.colSpan)
  841. //curTD.innerText="rC="+curTD.rowSpan+" cC="+curTD.colSpan
  842. //--------
  843. //因此行以前的合并格已展开,应减去
  844. var AddCols=0
  845. for(var jjj=0;jjj<=j;jjj++){
  846. var tmp1=parseInt(t.rows(i).cells(jjj).getAttribute("tdCol"))
  847. if (isNaN(tmp1)==false) 
  848. AddCols++
  849. }
  850. td_col=j-AddCols
  851. td_row=i
  852.     }
  853. }
  854. if (lngCols>1) {
  855. curTD.colSpan=1
  856. //补齐当前行的后面的单元
  857. for (var jjj=1;jjj<=lngCols-1;jjj++) {
  858. if (j>=t.rows(i).cells.length)
  859. curAddCell=t.rows(i).insertCell()//加到结尾
  860. else
  861. curAddCell=t.rows(i).insertCell(j+1)
  862. curAddCell.setAttribute("tdRow",td_row)
  863. curAddCell.setAttribute("tdCol",td_col)
  864. //curAddCell.innerText="R="+td_row+" C="+td_col
  865. curAddCell.innerText=curTD.innerText
  866. }
  867. }
  868. //rowSpan>1
  869. if (lngRows>1 ) {
  870.     curTD.rowSpan=1
  871. //修改rowspan值,合并单元格下移
  872. var addCols=0
  873. //计算下一行同一列之前应缩小多少列
  874. for (var jjj=0;jjj<j; jjj++) {
  875. if(jjj>=t.rows(i+1).cells.length) break
  876. var c=parseInt(t.rows(i+1).cells(jjj).colSpan)
  877. if (isNaN(c)) c=1
  878. addCols=addCols+c-1
  879. }
  880. //if (i==2) alert("j="+j+" "+addCols)
  881. curAddCell=t.rows(i+1).insertCell(j-addCols)
  882. //生成的单元格应保存初始合并单元格的td row,col
  883. curAddCell.setAttribute("tdRow",td_row)
  884. curAddCell.setAttribute("tdCol",td_col)
  885. //curAddCell.innerText="R="+td_row+" C="+td_col
  886. curAddCell.innerText=curTD.innerText
  887. curAddCell.colSpan=lngCols
  888. curAddCell.rowSpan=lngRows-1
  889. //curAddCell.innerText="A"
  890. }
  891. } //列循环结束
  892. } //行循环结束
  893. // var d=new Date()
  894. // var t1=d.getTime()
  895. // alert(t1-t2)
  896. }
  897. function show(val) {
  898. txt1.style.display ="block"
  899. txt1.style.zIndex =2
  900. txt1.value =val
  901. }
  902. /**
  903. *向单元格给值时处理小数位数
  904. *curTD为要处理的单元格, v为要给的值
  905. **/
  906. function CellPoint(curTD,v) {
  907. var v1=parseFloat(v)
  908. if(isNaN(v1)==false){
  909. //小数位数
  910. var s1=curTD.getAttribute("pointnum")
  911. if(s1!=null){
  912. s1=parseInt(s1)
  913. curTD.innerText=ContDec(v1,s1)
  914. }
  915. else {
  916. curTD.innerText=v
  917. }
  918. }
  919. else {
  920. curTD.innerText=v
  921. }
  922. }
  923. //*****************************************************************************************
  924. //处理grid事件
  925. //*****************************************************************************************
  926. function grid_onVscroll() {
  927. if(tc.style.display=="block"){
  928. //show(sCol+" "+sRow+"  "+eCol+"  "+eRow)
  929. //此处暂时用物理位置,到时要变成逻辑位置
  930. var arr=PhyToLog(sRow,sCol)
  931. var arr1=PhyToLog(eRow,eCol)
  932. var tdStart=t.rows(arr[0]).cells(arr[1])
  933. var tdEnd=t.rows(arr1[0]).cells(arr1[1])
  934. //sLeft=tdStart.offsetLeft
  935. sTop=tdStart.offsetTop
  936. //sWidth=tdStart.offsetWidth
  937. sHeight=tdStart.offsetHeight
  938. //eLeft=tdEnd.offsetLeft
  939. eTop=tdEnd.offsetTop
  940. //eWidth=tdEnd.offsetWidth
  941. eHeight=tdEnd.offsetHeight
  942. //alert(sLeft+"=="+eLeft+"  "+sTop+"=="+eTop)
  943. showBlueRect()
  944. }
  945. }
  946. function grid_onHscroll() {
  947. if(tc.style.display=="block"){
  948. //show(sCol+" "+sRow+"  "+eCol+"  "+eRow)
  949. //此处暂时用物理位置,到时要变成逻辑位置
  950. var arr=PhyToLog(sRow,sCol)
  951. var arr1=PhyToLog(eRow,eCol)
  952. var tdStart=t.rows(arr[0]).cells(arr[1])
  953. var tdEnd=t.rows(arr1[0]).cells(arr1[1])
  954. sLeft=tdStart.offsetLeft
  955. //sTop=tdStart.offsetTop
  956. sWidth=tdStart.offsetWidth
  957. //sHeight=tdStart.offsetHeight
  958. eLeft=tdEnd.offsetLeft
  959. //eTop=tdEnd.offsetTop
  960. eWidth=tdEnd.offsetWidth
  961. //eHeight=tdEnd.offsetHeight
  962. showBlueRect()
  963. }
  964. }
  965. /**
  966. *插入行
  967. **/
  968. function InsRow(){
  969. if(grid.ReadOnly) return
  970. if (tc.style.display =="none" ) return
  971. SaveoUndoOneRecord()
  972. var minRow
  973. if (sRow>eRow)
  974. minRow=eRow
  975. else
  976. minRow=sRow
  977. var iRows=Math.abs(eRow-sRow)
  978. MoveFormula(minRow,iRows+1,1)
  979. for(var i=0;i<=iRows;i++){
  980. // grid.InsertRow(minRow)
  981. //---------插入行
  982. var tdCount=0 //记录此行共要插多少个TD
  983. for (j=0;j<=t.rows(0).cells.length-1;j++){
  984. //i,minCol单元的坐标换成逻辑坐标找到TD,判断
  985. //如rowspan>1则i=i+rowspan-1,此TD的colspan>1则colspan=colspan-1,
  986. //如果colspan=1则删除此TD
  987. var arr=PhyToLog(minRow,j)
  988. var curTD=t.rows(arr[0]).cells(arr[1])
  989. if(minRow==arr[0] || (curTD.rowSpan==1 && curTD.colSpan==1)){
  990. // alert(arr[0]+","+arr[1])
  991. //t.rows(minRow).insertCell()
  992. tdCount++
  993. }
  994. else { //从合并单元的半中间插入
  995. if(curTD.colSpan>1){
  996. j=j+curTD.colSpan-1
  997. }
  998. if(curTD.rowSpan>1){
  999. curTD.rowSpan=curTD.rowSpan+1
  1000. }
  1001. }
  1002. }
  1003. //按照计算好的TD个数插入行
  1004. var oTr=t.insertRow(minRow)
  1005. oTr.style.height=21
  1006. for(j=0;j<tdCount;j++){
  1007. t.rows(minRow).insertCell();
  1008. }
  1009. //---------
  1010. }
  1011. //理顺行标
  1012. for (i=minRow;i<=t.rows.length-1;i++){
  1013. t.rows(i).cells(0).innerText=i
  1014. }
  1015. // txtMyGrid.style.top=txtMyGrid.style.pixelTop-(iRows+1)*21  //per row height=21
  1016. CopytHtml()
  1017. var arr=PhyToLog(sRow,sCol)
  1018. var moveTD=t.rows(arr[0]).cells(arr[1])
  1019. grid.moveedit(moveTD)
  1020. showBlueScale(sRow,sCol,eRow,eCol)
  1021. //从单元属性中将公式及预处理过后的公式装入oFormula中
  1022. LoadAllFormula()
  1023. //强制表格宽高同步
  1024. if(grid.autosize){
  1025. grid.autosize=true
  1026. }
  1027. SaveoRedoOneRecord()
  1028. blnChange=true
  1029. }
  1030. /**
  1031. *删除行
  1032. **/
  1033. function DelRow(){
  1034. if(grid.ReadOnly) return
  1035. if (tc.style.display =="none" ) return
  1036. //var lngStatus=SelStatus(sRow,sCol,eRow,eCol)
  1037. //if(lngStatus==2 || lngStatus==5 ) return
  1038. SaveoUndoOneRecord()
  1039. var minRow
  1040. if (sRow>eRow)
  1041. minRow=eRow
  1042. else
  1043. minRow=sRow
  1044. //如选择的兰框在最边上,则删除列后不再显示兰框
  1045. if(eRow==t.rows.length-1 || sRow==t.rows.length-1 ){
  1046. if(minRow==1){
  1047. alert("不能全部删除!")
  1048. return
  1049. }
  1050. }
  1051. clearBlueScale()
  1052. var iRows=Math.abs(eRow-sRow)
  1053. MoveFormula(minRow,-(iRows+1),1)
  1054. for(var i=0;i<=iRows;i++){
  1055. // grid.DeleteRow(minRow)
  1056. //---------列删除
  1057. // t.children[0].removeChild(t.children[0].children[minCol])
  1058. //固定行不能删除
  1059. //if(t.childNodes(0).childNodes.length<=lngFixCols )return
  1060. for (j=t.rows(0).cells.length-1;j>=0;j--){
  1061. //i,minCol单元的坐标换成逻辑坐标找到TD,判断
  1062. //如rowspan>1则i=i+rowspan-1,此TD的colspan>1则colspan=colspan-1,
  1063. //如果colspan=1则删除此TD
  1064. var arr=PhyToLog(minRow,j)
  1065. var curTD=t.rows(arr[0]).cells(arr[1])
  1066. if(curTD.rowSpan==1 && curTD.colSpan==1){
  1067. //
  1068. t.rows(arr[0]).deleteCell(arr[1])
  1069. }
  1070. else {
  1071. if(curTD.colSpan>1){
  1072. j=j-curTD.colSpan+1
  1073. }
  1074. if(curTD.rowSpan>1){
  1075. //alert(arr[0]+","+arr[1])
  1076. //如当前单元是合并单元的主单元格则合并单元下移
  1077. if (arr[0]==minRow){
  1078. var tdNode=t.rows(arr[0]).cells(arr[1]).cloneNode(true)
  1079. var iInsCol=PhyToLogCol(minRow+1,j)
  1080. t.rows(minRow+1).insertCell(iInsCol)
  1081. t.rows(minRow+1).cells(iInsCol).replaceNode(tdNode)
  1082. t.rows(minRow+1).cells(iInsCol).rowSpan=curTD.rowSpan-1
  1083. t.rows(arr[0]).deleteCell(arr[1])
  1084. }
  1085. else{
  1086. curTD.rowSpan=curTD.rowSpan-1
  1087. }
  1088. }
  1089. else if(curTD.rowSpan==1){
  1090. t.rows(arr[0]).deleteCell(arr[1])
  1091. }
  1092. }
  1093. }
  1094. t.deleteRow(minRow)
  1095. //-----------------
  1096. }
  1097. //理顺行标
  1098. for (i=minRow;i<=t.rows.length-1;i++){
  1099. t.rows(i).cells(0).innerText=i
  1100. }
  1101. CopytHtml()
  1102. if(tc.style.display=="block"){
  1103. var arr=PhyToLog(sRow,sCol)
  1104. var moveTD=t.rows(arr[0]).cells(arr[1])
  1105. grid.moveedit(moveTD)
  1106. showBlueScale(sRow,sCol,eRow,eCol)
  1107. }
  1108. //从单元属性中将公式及预处理过后的公式装入oFormula中
  1109. LoadAllFormula()
  1110. //强制表格宽高同步
  1111. if(grid.autosize){
  1112. grid.autosize=true
  1113. }
  1114. SaveoRedoOneRecord()
  1115. blnChange=true
  1116. }
  1117. /**
  1118. *插入列
  1119. **/
  1120. function InsCol(){
  1121. if(grid.ReadOnly) return
  1122. if (tc.style.display =="none" ) return
  1123. SaveoUndoOneRecord()
  1124. var minCol
  1125. if (sCol>eCol)
  1126. minCol=eCol
  1127. else
  1128. minCol=sCol
  1129. var iCols=Math.abs(eCol-sCol)
  1130. MoveFormula(minCol,iCols+1)
  1131. for(var i=0;i<=iCols;i++){
  1132. // grid.InsertCol(minCol)
  1133. //---------列插入
  1134. var o=document.createElement("COL")
  1135. o.style.width=70
  1136. var iPos=t.childNodes(0).childNodes.length-1
  1137. if (iPos>minCol)
  1138. iPos=minCol
  1139. t.children[0].insertBefore(o,t.children[0].children[iPos])
  1140. //固定行不能删除
  1141. //if(t.childNodes(0).childNodes.length<=lngFixCols )return
  1142. for (j=0;j<=t.rows.length-1;j++){
  1143. //i,minCol单元的坐标换成逻辑坐标找到TD,判断
  1144. //如rowspan>1则i=i+rowspan-1,此TD的colspan>1则colspan=colspan-1,
  1145. //如果colspan=1则删除此TD
  1146. var arr=PhyToLog(j,minCol)
  1147. var curTD=t.rows(arr[0]).cells(arr[1])
  1148. if(curTD.rowSpan==1 && curTD.colSpan==1){
  1149. // alert(arr[0]+","+arr[1])
  1150. t.rows(arr[0]).insertCell(arr[1])
  1151. }
  1152. else {
  1153. if(curTD.rowSpan>1){
  1154. j=j+curTD.rowSpan-1
  1155. }
  1156. if(curTD.colSpan>1){
  1157. curTD.colSpan=curTD.colSpan+1
  1158. }
  1159. //else if(curTD.colSpan==1){
  1160. // t.rows(arr[0]).deleteCell(arr[1])
  1161. //}
  1162. }
  1163. }
  1164. //-----------------
  1165. }
  1166. //理顺行标
  1167. for (i=minCol;i<=t.rows(0).cells.length-1;i++){
  1168. t.rows(0).cells(i).innerText=IntToLbl(i)
  1169. }
  1170. CopytHtml()
  1171. var arr=PhyToLog(sRow,sCol)
  1172. var moveTD=t.rows(arr[0]).cells(arr[1])
  1173. grid.moveedit(moveTD)
  1174. showBlueScale(sRow,sCol,eRow,eCol)
  1175. //从单元属性中将公式及预处理过后的公式装入oFormula中
  1176. LoadAllFormula()
  1177. //强制表格宽高同步
  1178. if(grid.autosize){
  1179. grid.autosize=true
  1180. }
  1181. SaveoRedoOneRecord()
  1182. blnChange=true
  1183. }
  1184. /**
  1185. *删除列
  1186. **/
  1187. function DelCol(){
  1188. if(grid.ReadOnly) return
  1189. if (tc.style.display =="none" ) return
  1190. //var lngStatus=SelStatus(1,sCol,t.rows.length-1,eCol)
  1191. //alert(lngStatus)
  1192. //if(lngStatus==2 || lngStatus==5 ) return
  1193. SaveoUndoOneRecord()
  1194. var minCol
  1195. if (sCol>eCol)
  1196. minCol=eCol
  1197. else
  1198. minCol=sCol
  1199. //如选择的兰框在最边上,则删除列后不再显示兰框
  1200. if(eCol==t.rows(0).cells.length-1 || sCol==t.rows(0).cells.length-1 ){
  1201. if(minCol==1){
  1202. alert("不能全部删除!")
  1203. return
  1204. }
  1205. }
  1206. clearBlueScale()
  1207. var iCols=Math.abs(eCol-sCol)
  1208. MoveFormula(minCol,-(iCols+1))
  1209. for(var i=0;i<=iCols;i++){
  1210. // grid.DeleteCol(minCol)
  1211. //---------列删除
  1212. t.children[0].removeChild(t.children[0].children[minCol])
  1213. //固定行不能删除
  1214. //if(t.childNodes(0).childNodes.length<=lngFixCols )return
  1215. for (j=0;j<=t.rows.length-1;j++){
  1216. //i,minCol单元的坐标换成逻辑坐标找到TD,判断
  1217. //如rowspan>1则i=i+rowspan-1,此TD的colspan>1则colspan=colspan-1,
  1218. //如果colspan=1则删除此TD
  1219. var arr=PhyToLog(j,minCol)
  1220. var curTD=t.rows(arr[0]).cells(arr[1])
  1221. if(curTD.rowSpan==1 && curTD.colSpan==1){
  1222. // alert(arr[0]+","+arr[1])
  1223. t.rows(arr[0]).deleteCell(arr[1])
  1224. }
  1225. else {
  1226. if(curTD.rowSpan>1){
  1227. j=j+curTD.rowSpan-1
  1228. }
  1229. if(curTD.colSpan>1){
  1230. curTD.colSpan=curTD.colSpan-1
  1231. }
  1232. else if(curTD.colSpan==1){
  1233. t.rows(arr[0]).deleteCell(arr[1])
  1234. }
  1235. }
  1236. }
  1237. //-----------------
  1238. }
  1239. //理顺行标
  1240. for (i=minCol;i<=t.rows(0).cells.length-1;i++){
  1241. t.rows(0).cells(i).innerText=IntToLbl(i)
  1242. }
  1243. CopytHtml()
  1244. if(tc.style.display=="block"){
  1245. var arr=PhyToLog(sRow,sCol)
  1246. var moveTD=t.rows(arr[0]).cells(arr[1])
  1247. grid.moveedit(moveTD)
  1248. showBlueScale(sRow,sCol,eRow,eCol)
  1249. }
  1250. //从单元属性中将公式及预处理过后的公式装入oFormula中
  1251. LoadAllFormula()
  1252. //强制表格宽高同步
  1253. if(grid.autosize){
  1254. grid.autosize=true
  1255. }
  1256. SaveoRedoOneRecord()
  1257. blnChange=true
  1258. }
  1259. /**
  1260. * 1--->A由索引号取得字母
  1261. **/
  1262. function IntToLbl(colno){
  1263. var strLbl="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  1264. var inx=parseInt(colno/26)
  1265. if (inx>26)
  1266. return 
  1267. var strPrefix=strLbl.substring(inx-1,inx)
  1268. var strColLbl=strLbl.substring(colno-inx*26-1,colno-inx*26)
  1269. return strPrefix+strColLbl
  1270. }
  1271. /**
  1272. * A--->1由字母取得索引号,只支持最大长度为2的strS
  1273. **/
  1274. function LblToInt(strC){
  1275. var strLbl="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  1276. var inx=strC.length
  1277. var iCol
  1278. if (inx==1)//一个字母
  1279. iCol=strLbl.indexOf(strC)+1
  1280. else//两个字母
  1281. {
  1282. iCol=(strLbl.indexOf(strC.substring(0,1))+1)*26+strLbl.indexOf(strC.substring(1,2))+1
  1283. }
  1284. return iCol
  1285. }
  1286. /**
  1287. * a1==>1,1
  1288. * strLbl="a1"
  1289. * 返回一个包括行列的数组
  1290. **/
  1291. function TransAto1(strLbl){
  1292.     if(isSpace(strLbl)) return
  1293.     
  1294.     strLbl=trim(strLbl)
  1295. var strChar,strInt
  1296. var iLength=strLbl.length-1
  1297. var iRow,iCol
  1298. var lngA
  1299. var dblR
  1300. for (var i=0;i<=iLength;i++){
  1301. lngA=parseInt(strLbl.charCodeAt(i))
  1302. if (lngA>=49 && lngA<=57){
  1303. var strChar=strLbl.substring(0,i)
  1304. var strInt=strLbl.substring(i,iLength+1)
  1305. break;
  1306. }
  1307. }
  1308. iRow=parseInt(strInt)
  1309. strChar=strChar.toUpperCase()
  1310. iCol=parseInt(LblToInt(strChar))
  1311. var sR=new Array(2)
  1312. sR[0]=iRow
  1313. sR[1]=iCol
  1314. return sR;
  1315. }
  1316. /**
  1317. *除去一节Style属性
  1318. *strSource 为源Style属性串
  1319. *strFind 为要除去的Style属性名
  1320. *返回除去后的Style属性串
  1321. **/
  1322. function RemovePartStyle(strSource,strFind) {
  1323. var strResult=""
  1324. var arrS
  1325. arrS=strSource.split(";")
  1326. for (var i=0;i<arrS.length;i++) {
  1327. var sUpper=arrS[i].toUpperCase()
  1328. if (sUpper.indexOf(strFind.toUpperCase())==-1)
  1329. strResult=strResult+arrS[i]+";"
  1330. }
  1331. return strResult
  1332. }
  1333. /**
  1334. *设置单元格的颜色,iTag=1则表示设置前景色,iDefault=0表示缺省
  1335. *@date 2001-05-09 
  1336. **/
  1337. function SetColor(colorValue,iTag,iDefault){
  1338. if (tc.style.display =="none")
  1339. return
  1340. SaveoUndoOneRecord()
  1341. for (var i=sRowSort;i<=eRowSort;i++){
  1342. for (var j=sColSort;j<=eColSort;j++){
  1343. var arr=PhyToLog(i,j)
  1344. var curTD=t.rows(arr[0]).cells(arr[1])
  1345. if(iTag==1){
  1346. if(iDefault==0){
  1347. //RemovePartStyle(curTD.style.cssText,"color")
  1348. curTD.style.color="#000000"
  1349. }
  1350. else{
  1351. curTD.style.color=colorValue
  1352. }
  1353. }
  1354. else {
  1355. if(iDefault==0)
  1356. curTD.removeAttribute("bgColor")
  1357. else
  1358. curTD.bgColor=colorValue
  1359. }
  1360. //alert(curTD.style.color)
  1361. }
  1362. }
  1363. blnChange=true
  1364. hideTxt()
  1365. SaveoRedoOneRecord()
  1366. }
  1367. /**
  1368. *画线方法, iTag=0-11 sLineStyle="1px solid"
  1369. **/
  1370. function DrawLine(iTag,sLineStyle){
  1371. if (iTag<0) return
  1372. if (tc.style.display =="none")
  1373. return
  1374. SaveoUndoOneRecord()
  1375. switch (iTag){
  1376. case 0: //网格线
  1377. for (var i=sRowSort-1;i<=eRowSort;i++)
  1378. funDrawHLine(i,sLineStyle,"bottom")
  1379. for (var i=sColSort-1;i<=eColSort;i++)
  1380. funDrawVLine(i,sLineStyle,"right")
  1381. break;
  1382. case 1: //框线
  1383. funDrawHLine(sRowSort,sLineStyle,"top")
  1384. funDrawHLine(eRowSort,sLineStyle,"bottom")
  1385. funDrawVLine(sColSort,sLineStyle,"left")
  1386. funDrawVLine(eColSort,sLineStyle,"right")
  1387. break;
  1388. case 2: //上
  1389. funDrawHLine(sRowSort,sLineStyle,"top")
  1390. break;
  1391. case 3: //下线
  1392. funDrawHLine(eRowSort,sLineStyle,"bottom")
  1393. break;
  1394. case 4: //左
  1395. funDrawVLine(sColSort,sLineStyle,"left")
  1396. break;
  1397. case 5: //右
  1398. funDrawVLine(eColSort,sLineStyle,"right")
  1399. break;
  1400. case 6: //右斜线
  1401. DrawVml();
  1402. break;
  1403. case 7: //网格线
  1404. for (var i=sRowSort-1;i<=eRowSort;i++)
  1405. funDrawHLine(i,sLineStyle,"bottom",1)
  1406. for (var i=sColSort-1;i<=eColSort;i++)
  1407. funDrawVLine(i,sLineStyle,"right",1)
  1408. break;
  1409. case 8: //框线
  1410. funDrawHLine(sRowSort,sLineStyle,"top",1)
  1411. funDrawHLine(eRowSort,sLineStyle,"bottom",1)
  1412. funDrawVLine(sColSort,sLineStyle,"left",1)
  1413. funDrawVLine(eColSort,sLineStyle,"right",1)
  1414. break;
  1415. case 9: //上
  1416. funDrawHLine(sRowSort,sLineStyle,"top",1)
  1417. break;
  1418. case 10: //下线
  1419. funDrawHLine(eRowSort,sLineStyle,"bottom",1)
  1420. break;
  1421. case 11: //左
  1422. funDrawVLine(sColSort,sLineStyle,"left",1)
  1423. break;
  1424. case 12: //右
  1425. funDrawVLine(eColSort,sLineStyle,"right",1)
  1426. break;
  1427. case 13: //右斜线
  1428. DelDrawVml();
  1429. break;
  1430. }
  1431. blnChange=true
  1432. SaveoRedoOneRecord()
  1433. }
  1434. /**
  1435. *画右斜线
  1436. **/
  1437. function DrawVml() {
  1438. //画斜线
  1439. if (tc.style.display =="none")
  1440. return
  1441. SaveoUndoOneRecord()
  1442. var arr=PhyToLog(sRow,sCol)
  1443. var curTD=t.rows(arr[0]).cells(arr[1])
  1444. var oRect=curTD.getBoundingClientRect()
  1445. var s1=(oRect.right-oRect.left-2)+"px,"+(oRect.bottom-oRect.top-2)+"px"
  1446. curTD.innerHTML='<v:line id=line1 style="position:relative" from = "0,0" to = "'+s1+'">'
  1447. blnChange=true
  1448. hideTxt()
  1449. SaveoRedoOneRecord()
  1450. }
  1451. /**
  1452. *删除右斜线
  1453. **/
  1454. function DelDrawVml() {
  1455. if (tc.style.display =="none")
  1456. return
  1457. SaveoUndoOneRecord()
  1458. var arr=PhyToLog(sRow,sCol)
  1459. var curTD=t.rows(arr[0]).cells(arr[1])
  1460. curTD.innerHTML=''
  1461. blnChange=true
  1462. hideTxt()
  1463. SaveoRedoOneRecord()
  1464. }
  1465. /**
  1466. *画一条横线的函数,rowno是物理行号,linePx是线粗+实虚,strKey是指画那边线
  1467. *iDelLine=1表示删线
  1468. **/
  1469. function funDrawHLine(rowno,linePx,strKey,iDelLine){
  1470. var i
  1471. for (i=sColSort;i<=eColSort;i++){
  1472. var arr=PhyToLog(rowno,i)
  1473. var curTD=t.rows(arr[0]).cells(arr[1])
  1474. if (strKey=="bottom"){
  1475. if (iDelLine==1)
  1476. curTD.style.cssText=RemovePartStyle(curTD.style.cssText,"border-Bottom")
  1477. else
  1478. curTD.style.borderBottom=linePx+" black"
  1479. }
  1480. else { //="top"
  1481. //找到上一单元的下线画
  1482. var arr1=PhyToLog(rowno-1,i)
  1483. var curTD1=t.rows(arr1[0]).cells(arr1[1])
  1484. if (iDelLine==1)
  1485. curTD1.style.cssText=RemovePartStyle(curTD1.style.cssText,"border-Bottom")
  1486. else
  1487. curTD1.style.borderBottom=linePx+" black"
  1488. }
  1489. }
  1490. }
  1491. /**
  1492. *画一条竖线的函数,colno是物理列号,linePx是线粗+实虚,strKey是指画那边线
  1493. *iDelLine=1表示删线
  1494. **/
  1495. function funDrawVLine(colno,linePx,strKey,iDelLine){
  1496. for (var i=sRowSort;i<=eRowSort;i++){
  1497. var arr=PhyToLog(i,colno)
  1498. var curTD=t.rows(arr[0]).cells(arr[1])
  1499. if (strKey=="right"){
  1500. if (iDelLine==1)
  1501. curTD.style.cssText=RemovePartStyle(curTD.style.cssText,"border-Right")
  1502. else
  1503. curTD.style.borderRight=linePx+" black"
  1504. }
  1505. else { //="left"
  1506. if(colno==1){
  1507. var arr1=PhyToLog(i,colno)
  1508. var curTD1=t.rows(arr1[0]).cells(arr1[1])
  1509. if (iDelLine==1)
  1510. curTD1.style.cssText=RemovePartStyle(curTD1.style.cssText,"border-Left")
  1511. else
  1512. curTD1.style.borderLeft=linePx+" black"
  1513. }
  1514. else {
  1515. //找到上一单元的下线画
  1516. var arr1=PhyToLog(i,colno-1)
  1517. var curTD1=t.rows(arr1[0]).cells(arr1[1])
  1518. if (iDelLine==1)
  1519. curTD1.style.cssText=RemovePartStyle(curTD1.style.cssText,"border-Right")
  1520. else
  1521. curTD1.style.borderRight=linePx+" black"
  1522. }
  1523. }
  1524. }
  1525. }
  1526. /**
  1527. *设置当前单元的字体
  1528. *@param strKey :B,I,U,F,S
  1529. **/
  1530. function cmdFont(strKey)
  1531. {
  1532. // if (SetReadOnly()) return
  1533. if (tc.style.display =="none")
  1534. return
  1535. // var i,j
  1536. // var sColno,eColno
  1537. SaveoUndoOneRecord()
  1538. // MatchRowCol()
  1539. // getColnoPerRow()
  1540. //选中单个的单元格的情况
  1541. var i,j
  1542. var sB=cmdFontBold.getAttribute("fcDown")
  1543. var sI=cmdFontItalic.getAttribute("fcDown")
  1544. var sU=cmdFontU.getAttribute("fcDown")
  1545. if (sB=="1") {
  1546. cmdFontBold.setAttribute("fcDown","0")
  1547. }
  1548. else {
  1549. cmdFontBold.setAttribute("fcDown","1")
  1550. }
  1551. if (sI=="1") {
  1552. cmdFontItalic.setAttribute("fcDown","0")
  1553. }
  1554. else {
  1555. cmdFontItalic.setAttribute("fcDown","1")
  1556. }
  1557. if (sU=="1") {
  1558. cmdFontU.setAttribute("fcDown","0")
  1559. }
  1560. else {
  1561. cmdFontU.setAttribute("fcDown","1")
  1562. }
  1563. for (i=sRowSort;i<=eRowSort;i++)
  1564. {
  1565. for (j=sColSort;j<=eColSort;j++)
  1566. {
  1567. var arr=PhyToLog(i,j)
  1568. var curTD=t.rows(arr[0]).cells(arr[1])
  1569. switch (strKey){
  1570. case "B":
  1571. if (sB=="1") {
  1572. curTD.style.fontWeight="normal"
  1573. }
  1574. else {
  1575. curTD.style.fontWeight="bold"
  1576. }
  1577. break;
  1578. case "I":
  1579. if (sI=="1") {
  1580. curTD.style.fontStyle="normal"
  1581. }
  1582. else {
  1583. curTD.style.fontStyle="italic"
  1584. }
  1585. break;
  1586. case "U":
  1587. if (sU=="1") {
  1588. curTD.style.textDecorationUnderline=false
  1589. }
  1590. else {
  1591. curTD.style.textDecorationUnderline=true
  1592. }
  1593. break;
  1594. case "F":
  1595. curTD.style.fontFamily=cboFont.options[cboFont.selectedIndex].text
  1596. break;
  1597. case "S":
  1598. curTD.style.fontSize=cboFontSize.options[cboFontSize.selectedIndex].text
  1599. break;
  1600. }
  1601. }
  1602. }
  1603. blnChange=true
  1604. hideTxt()
  1605. SaveoRedoOneRecord()
  1606. }
  1607. /**
  1608. *处理当前单元格的对齐
  1609. *@param strAlign:left,center,right,top,middle,bottom
  1610. *@param strOrient:h v
  1611. **/
  1612. function cmdAlign(strAlign,strOrient) 
  1613. {
  1614. //if (SetReadOnly()) return
  1615. //var sColno,eColno
  1616. if (tc.style.display =="none")
  1617. return
  1618. //判断按钮是按下还是恢复。
  1619. var blnPressDown=true
  1620. if((strAlign=="left" && cmdLeft.getAttribute("fcDown")=="1") 
  1621.  || (strAlign=="center" && cmdCenter.getAttribute("fcDown")=="1")
  1622.  || (strAlign=="right" && cmdRight.getAttribute("fcDown")=="1")
  1623.  || (strAlign=="top" && cmdTopv.getAttribute("fcDown")=="1")
  1624.  || (strAlign=="middle" && cmdMiddle.getAttribute("fcDown")=="1")
  1625.  || (strAlign=="bottom" && cmdBottomv.getAttribute("fcDown")=="1")
  1626. )
  1627. blnPressDown=false
  1628. //MatchRowCol()
  1629. // getColnoPerRow()
  1630. //选中单个的单元格的情况
  1631. SaveoUndoOneRecord()//在改变之前保存住位置,备undo时装入
  1632. var i,j
  1633. for (i=sRowSort;i<=eRowSort;i++){
  1634. for (j=sColSort;j<=eColSort;j++){
  1635. var arr=PhyToLog(i,j)
  1636. var curTD=t.rows(arr[0]).cells(arr[1])
  1637. if (strOrient=="h") {
  1638. if (strAlign=="left") {
  1639. if (blnPressDown==false) {
  1640. cmdLeft.setAttribute("fcDown","0")
  1641. curTD.align=""
  1642. }
  1643. else {
  1644. cmdLeft.setAttribute("fcDown","1")
  1645. cmdCenter.setAttribute("fcDown","0")
  1646. cmdRight.setAttribute("fcDown","0")
  1647. cmdCenter.className="tblclassup"
  1648. cmdRight.className="tblclassup"
  1649. curTD.align="left"
  1650. }
  1651. }
  1652. if (strAlign=="center") {
  1653. if (blnPressDown==false) {
  1654. cmdCenter.setAttribute("fcDown","0")
  1655. curTD.align=""
  1656. }
  1657. else {
  1658. cmdLeft.setAttribute("fcDown","0")
  1659. cmdCenter.setAttribute("fcDown","1")
  1660. cmdRight.setAttribute("fcDown","0")
  1661. cmdLeft.className="tblclassup"
  1662. cmdRight.className="tblclassup"
  1663. curTD.align="center"
  1664. }
  1665. }
  1666. if (strAlign=="right") {
  1667. if (blnPressDown==false) {
  1668. cmdRight.setAttribute("fcDown","0")
  1669. curTD.align=""
  1670. }
  1671. else {
  1672. cmdLeft.setAttribute("fcDown","0")
  1673. cmdCenter.setAttribute("fcDown","0")
  1674. cmdRight.setAttribute("fcDown","1")
  1675. cmdLeft.className="tblclassup"
  1676. cmdCenter.className="tblclassup"
  1677. curTD.align="right"
  1678. }
  1679. }
  1680. }
  1681. if (strOrient=="v") {
  1682. if (strAlign=="top") {
  1683. if (blnPressDown==false) {
  1684. cmdTopv.setAttribute("fcDown","0")
  1685. curTD.vAlign=""
  1686. }
  1687. else {
  1688. cmdTopv.setAttribute("fcDown","1")
  1689. cmdMiddle.setAttribute("fcDown","0")
  1690. cmdBottomv.setAttribute("fcDown","0")
  1691. cmdMiddle.className="tblclassup"
  1692. cmdBottomv.className="tblclassup"
  1693. curTD.vAlign="top"
  1694. }
  1695. }
  1696. if (strAlign=="middle") {
  1697. if (blnPressDown==false) {
  1698. cmdMiddle.setAttribute("fcDown","0")
  1699. curTD.vAlign=""
  1700. }
  1701. else {
  1702. cmdTopv.setAttribute("fcDown","0")
  1703. cmdMiddle.setAttribute("fcDown","1")
  1704. cmdBottomv.setAttribute("fcDown","0")
  1705. cmdTopv.className="tblclassup"
  1706. cmdBottomv.className="tblclassup"
  1707. curTD.vAlign="middle"
  1708. }
  1709. }
  1710. if (strAlign=="bottom") {
  1711. if (blnPressDown==false) {
  1712. cmdMiddle.setAttribute("fcDown","0")
  1713. curTD.vAlign=""
  1714. }
  1715. else {
  1716. cmdTopv.setAttribute("fcDown","0")
  1717. cmdMiddle.setAttribute("fcDown","0")
  1718. cmdBottomv.setAttribute("fcDown","1")
  1719. cmdTopv.className="tblclassup"
  1720. cmdMiddle.className="tblclassup"
  1721. curTD.vAlign="bottom"
  1722. }
  1723. }
  1724. }
  1725. }
  1726. }
  1727. blnChange=true
  1728. hideTxt()
  1729. SaveoRedoOneRecord() //在改变之后保存住位置,备redo时装入
  1730. }
  1731. /**
  1732. *当在某单元格时,处理工具栏的显示状态
  1733. **/
  1734. function showFontProperty(tdobj){
  1735. if(blnRunMode)return
  1736. if (tdobj.align=="left") {
  1737. cmdLeft.setAttribute("fcDown","1")
  1738. cmdLeft.className="divmenutrue"
  1739. }
  1740. else {
  1741. cmdLeft.setAttribute("fcDown","0")
  1742. cmdLeft.className="tblclassup"
  1743. }
  1744. if (tdobj.align=="center") {
  1745. cmdCenter.setAttribute("fcDown","1")
  1746. cmdCenter.className="divmenutrue"
  1747. }
  1748. else {
  1749. cmdCenter.setAttribute("fcDown","0")
  1750. cmdCenter.className="tblclassup"
  1751. }
  1752. if (tdobj.align=="right") {
  1753. cmdRight.setAttribute("fcDown","1")
  1754. cmdRight.className="divmenutrue"
  1755. }
  1756. else {
  1757. cmdRight.setAttribute("fcDown","0")
  1758. cmdRight.className="tblclassup"
  1759. }
  1760. if (tdobj.vAlign=="top") {
  1761. cmdTopv.setAttribute("fcDown","1")
  1762. cmdTopv.className="divmenutrue"
  1763. }
  1764. else {
  1765. cmdTopv.setAttribute("fcDown","0")
  1766. cmdTopv.className="tblclassup"
  1767. }
  1768. if (tdobj.vAlign=="middle") {
  1769. cmdMiddle.setAttribute("fcDown","1")
  1770. cmdMiddle.className="divmenutrue"
  1771. }
  1772. else {
  1773. cmdMiddle.setAttribute("fcDown","0")
  1774. cmdMiddle.className="tblclassup"
  1775. }
  1776. if (tdobj.vAlign=="bottom") {
  1777. cmdBottomv.setAttribute("fcDown","1")
  1778. cmdBottomv.className="divmenutrue"
  1779. }
  1780. else {
  1781. cmdBottomv.setAttribute("fcDown","0")
  1782. cmdBottomv.className="tblclassup"
  1783. }
  1784. //跟踪B I U
  1785. if (tdobj.style.fontWeight=="bold") {
  1786. cmdFontBold.setAttribute("fcDown","1")
  1787. cmdFontBold.className="divmenutrue"
  1788. }
  1789. else {
  1790. cmdFontBold.setAttribute("fcDown","0")
  1791. cmdFontBold.className="tblclassup"
  1792. }
  1793. if (tdobj.style.fontStyle=="italic") {
  1794. cmdFontItalic.setAttribute("fcDown","1")
  1795. cmdFontItalic.className="divmenutrue"
  1796. }
  1797. else {
  1798. cmdFontItalic.setAttribute("fcDown","0")
  1799. cmdFontItalic.className="tblclassup"
  1800. }
  1801. if (tdobj.style.textDecorationUnderline==true) {
  1802. cmdFontU.setAttribute("fcDown","1")
  1803. cmdFontU.className="divmenutrue"
  1804. }
  1805. else {
  1806. cmdFontU.setAttribute("fcDown","0")
  1807. cmdFontU.className="tblclassup"
  1808. }
  1809. var strFont=tdobj.style.fontFamily
  1810. var lngFontSize=parseInt(tdobj.style.fontSize)
  1811. switch(strFont) {
  1812. case "宋体":
  1813. cboFont.selectedIndex =0
  1814. break;
  1815. case "仿宋_GB2312":
  1816. cboFont.selectedIndex =1
  1817. break;
  1818. case "黑体":
  1819. cboFont.selectedIndex =2
  1820. break;
  1821. case "楷体_GB2312":
  1822. cboFont.selectedIndex =3
  1823. break;
  1824. case "隶书":
  1825. cboFont.selectedIndex =4
  1826. break;
  1827. case "幼圆":
  1828. cboFont.selectedIndex =5
  1829. break;
  1830. case "Arial":
  1831. cboFont.selectedIndex =6
  1832. break;
  1833. case "Courier":
  1834. cboFont.selectedIndex =7
  1835. break;
  1836. default:
  1837. cboFont.selectedIndex =0
  1838. break;
  1839. }
  1840. switch(lngFontSize) {
  1841. case 4:
  1842. cboFontSize.selectedIndex =0
  1843. break;
  1844. case 6:
  1845. cboFontSize.selectedIndex =1
  1846. break;
  1847. case 8:
  1848. cboFontSize.selectedIndex =2
  1849. break;
  1850. case 9:
  1851. case 10:
  1852. case 11:
  1853. case 12:
  1854. cboFontSize.selectedIndex =lngFontSize - 6
  1855. break;
  1856. case 14:
  1857. cboFontSize.selectedIndex =7
  1858. break;
  1859. case 16:
  1860. cboFontSize.selectedIndex =8
  1861. break;
  1862. case 18:
  1863. cboFontSize.selectedIndex =9
  1864. break;
  1865. case 20:
  1866. cboFontSize.selectedIndex =10
  1867. break;
  1868. case 22:
  1869. cboFontSize.selectedIndex =11
  1870. break;
  1871. case 24:
  1872. cboFontSize.selectedIndex =12
  1873. break;
  1874. case 26:
  1875. cboFontSize.selectedIndex =13
  1876. break;
  1877. case 28:
  1878. cboFontSize.selectedIndex =14
  1879. break;
  1880. case 36:
  1881. cboFontSize.selectedIndex =15
  1882. break;
  1883. case 48:
  1884. cboFontSize.selectedIndex =16
  1885. break;
  1886. case 72:
  1887. cboFontSize.selectedIndex =17
  1888. break;
  1889. default:
  1890. cboFontSize.selectedIndex =8
  1891. break;
  1892. }
  1893. //show(tdobj.bgColor)
  1894. if(isSpace(tdobj.bgColor)){
  1895. sel1.selectedIndex=0
  1896. }
  1897. else {
  1898. for(var i=1;i<sel1.options.length;i++){
  1899. if(sel1.options(i).style.backgroundColor==tdobj.bgColor){
  1900. sel1.selectedIndex=i
  1901. break
  1902. }
  1903. }
  1904. }
  1905. if(isSpace(tdobj.style.color)){
  1906. sel2.selectedIndex=0
  1907. }
  1908. else {
  1909. for(var i=1;i<sel2.options.length;i++){
  1910. if(sel2.options(i).style.backgroundColor==tdobj.style.color){
  1911. sel2.selectedIndex=i
  1912. break
  1913. }
  1914. }
  1915. }
  1916. }
  1917. /**
  1918. *用于点击了工具栏上的按钮后将焦点给到文本框上
  1919. **/
  1920. function ExitMe() {
  1921. window.setTimeout("try {txtMyGrid.focus()} catch (e){}", 10);
  1922. }
  1923. /**
  1924. *初始化表格以外的东西:滚动条,div的边框,运行时显示的按钮等
  1925. *用于打开一个表将这些东西调动后(用进入时运行事件)又打开一个表时恢复
  1926. **/
  1927. function InitOutTable() {
  1928. t.parentNode.style.borderLeft="1px solid";
  1929. t.parentNode.style.borderRight="1px solid";
  1930. t.parentNode.style.borderTop="1px solid";
  1931. t.parentNode.style.borderBottom="1px solid";
  1932. grid.hideHscroll=false;
  1933. grid.hideVscroll=false;
  1934. t.parentNode.style.backgroundImage="";
  1935. t.parentNode.style.backgroundColor="";
  1936. fcPage.style.display="none"
  1937. fcShowAll.style.display="none"
  1938. for(var i=0;i<5;i++){fcButton[i].style.display="none"}
  1939. txtMyGrid.style.display="none"
  1940. tc.style.display="none"
  1941. fc_curpage=1
  1942. fc_allpages=1
  1943. }
  1944. /**
  1945. *保存报表
  1946. **/
  1947. function SaveReport() {
  1948. t.setAttribute("graph",escape(oGraph.documentElement.xml))
  1949. CopytHtml()
  1950. var s1=document.title 
  1951. if(isSpace(s1)){
  1952. //新增存盘
  1953. var sRet=window.showModalDialog("input.htm",s1,"status:no;dialogHeight:120px;dialogWidth:400px;dialogTop:180;dialogLeft:250px") 
  1954. if(typeof sRet=="undefined") return
  1955. var s2=SqlToField("select fstrTableName from fcCell where fstrTableName='"+escape(sRet)+"'")
  1956. if(s2!=""){
  1957. alert("报表名称:"+sRet+"的报表已存在,请另取一个报表名称。")
  1958. return
  1959. }
  1960. var sql="Insert into fcCell (fstrTableName,fstrTable,fstrTable1) values ('"+escape(sRet)+"','"+escape(t.outerHTML)+"','"+escape(tCopy.innerHTML)+"')"
  1961. document.title=sRet
  1962. if(fc_Database=="access")
  1963. var sR=fc_insertunescape(sql)
  1964. else
  1965. var sR=fc_insertClob(sql)
  1966. }
  1967. else {
  1968. //修改存盘
  1969. var sql="Update fcCell set fstrTable='"+escape(t.outerHTML)+"',fstrTable1='"+escape(tCopy.innerHTML)+"' Where fstrTableName='"+escape(s1)+"'"
  1970. if(fc_Database=="access")
  1971. var sR=fc_insertunescape(sql)
  1972. else
  1973. var sR=fc_updateClob(sql)
  1974. }
  1975. if(isSpace(sR)){
  1976. alert("保存成功!")
  1977. }
  1978. else{
  1979. alert(sR)
  1980. }
  1981. blnChange=false
  1982. }
  1983. /**
  1984. *报表另存
  1985. **/
  1986. function SaveAsReport() {
  1987. t.setAttribute("graph",escape(oGraph.documentElement.xml))
  1988. CopytHtml()
  1989. var sRet=window.showModalDialog("input.htm","","status:no;dialogHeight:120px;dialogWidth:400px;dialogTop:180;dialogLeft:250px") 
  1990. if(typeof sRet=="undefined") return
  1991. var s2=SqlToField("select fstrTableName from fcCell where fstrTableName='"+escape(sRet)+"'")
  1992. if(s2!=""){
  1993. alert("报表名称:"+sRet+"的报表已存在,请另取一个报表名称。")
  1994. return
  1995. }
  1996. var sql="Insert into fcCell (fstrTableName,fstrTable,fstrTable1) values ('"+escape(sRet)+"','"+escape(t.outerHTML)+"','"+escape(tCopy.innerHTML)+"')"
  1997. var sR=fc_insertunescape(sql)
  1998. if(isSpace(sR)){
  1999. document.title=sRet
  2000. alert("保存成功!")
  2001. }
  2002. else{
  2003. alert(sR)
  2004. }
  2005. blnChange=false
  2006. }
  2007. /**
  2008. *新增一张报表,先检查是否要保存当前报表
  2009. **/
  2010. function NewReport() {
  2011. CheckReportChange()
  2012. var sTab='<TABLE borderColor=lightgrey borderColorDark=white cellPadding=0 cellSpacing=0 frame=box id=t style="BORDER-COLLAPSE: collapse; BORDER-BOTTOM: 1px solid; BORDER-LEFT: 1px solid; BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid;  CURSOR: default; FILTER: alpha(opacity=90);TABLE-LAYOUT: fixed; POSITION: absolute; LEFT: 0px; TOP: 0px" '
  2013. +'onmousedown="t_onmousedown()" onmousemove="t_onmousemove()" onmouseup="t_onmouseup()" >'
  2014. +'<COLGROUP id=tg><COL style="width:35" align=middle class=fixedStyle><COL style="width:70"><COL style="width:70"><COL style="width:70"><COL style="width:70"><COL style="width:70"><COL style="width:70"><COL style="width:70"><COL style="width:70"><COL style="width:70"><COL style="width:70"></COLGROUP>'
  2015. +'<THEAD><TR style="height:21" align=middle class=fixedStyle ><TD></TD><TD>A</TD><TD>B</TD><TD>C</TD><TD>D</TD><TD>E</TD><TD>F</TD><TD>G</TD><TD>H</TD><TD>I</TD><TD>J</TD></TR></THEAD>'
  2016. +'<TBODY>'
  2017. +'<TR style="height:21"><TD>1</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR>'
  2018. +'<TR style="height:21"><TD>2</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>3</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>4</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>5</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>6</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>7</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>8</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>9</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>10</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>11</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>12</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>13</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>14</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>15</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>16</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>17</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>18</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>19</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>20</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>21</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>22</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>23</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD>24</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR><TR style="height:21"><TD >25</TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD><TD></TD></TR>'
  2019. +'</TBODY></TABLE>'
  2020. t.outerHTML=sTab
  2021. CopytHtml()
  2022. document.title=""
  2023. grid.reload(sTab)
  2024. initoUndooRedo()
  2025. oFormula=new ActiveXObject("Microsoft.XMLDOM")
  2026. oFormula.async ="false";
  2027. oFormula.loadXML("<root></root>")
  2028. oGraph=new ActiveXObject("Microsoft.XMLDOM")
  2029. oGraph.async ="false";
  2030. oGraph.loadXML("<root></root>")
  2031. blnChange=false
  2032. }
  2033. function LoadReport(TableName,sFilter) {
  2034. //TableName为打开的报表名称。
  2035. //sFilter为联查报表时的过滤条件串
  2036. //先检查是否要保存当前报表
  2037. //show("aaa")
  2038. CheckReportChange()
  2039. ShowWait.style.display="block";
  2040. if(fc_Database=="access"){
  2041. var sql="select fstrTable from fcCell Where fstrTableName='"+escape(TableName)+"'"
  2042. var sTab=unescape(SqlToField(sql))
  2043. t.outerHTML=sTab
  2044. CopytHtml()
  2045. }else {
  2046. var sTab=unescape(fc_loadClob("<no>"+escape(TableName)+"</no>"))
  2047. var sTab1=unescape(fc_loadClob1("<no>"+escape(TableName)+"</no>"))
  2048. //去掉id=t
  2049. sTab1=fc_RepStr(sTab1," id=t "," ")
  2050. tCopy.innerHTML=sTab1
  2051. t.outerHTML=sTab
  2052. }
  2053. document.title=TableName
  2054. grid.reload(sTab)
  2055. InitOutTable()
  2056. //----------------------
  2057. initoUndooRedo()
  2058. LoadAllFormula()
  2059. // oGraph=new ActiveXObject("Microsoft.XMLDOM")
  2060. // oGraph.async ="false";
  2061. // oGraph.loadXML("<root></root>")
  2062. // LoadGraph(1)
  2063. // setGraph(1)
  2064. queryToolbar.style.display="none"
  2065. //装入运行时的设置参数
  2066. if(blnRunMode) {
  2067. //查询SQL
  2068. queryToolbar.style.display="block"
  2069. initButton()
  2070. var s1=t.getAttribute("queryorder")
  2071. if(s1=="1" && arguments.length==1){
  2072. //直接出查询条件对话框
  2073. fc_wherexml="" //清空条件变量
  2074. fc_getwhere()
  2075. }
  2076. else {
  2077. //LoadWhereToSql()
  2078. //用于打开统计表时,需要装入缺省条件进行查询
  2079. if (arguments.length==2){
  2080. fc_wherexml=sFilter
  2081. }
  2082. else {
  2083. if(isSpace(t.getAttribute("initwhere")))
  2084. fc_wherexml=""
  2085. else 
  2086. fc_wherexml=t.getAttribute("initwhere")
  2087. }
  2088. fc_wherexml=unescape(fc_wherexml)
  2089. fc_curpage=1
  2090. fc_executesql(1,fc_wherexml)//1 为页号,fc_wherexml为条件数据的XML串
  2091. //-----------------------------------
  2092. }
  2093. var arySend=t.getAttribute("runpara")
  2094. if(arySend!=null){
  2095. eval(unescape(arySend))
  2096. }
  2097. }
  2098. //当外部是自动表格尺寸时
  2099. if (grid.autosize){
  2100. grid.hideVscroll=true
  2101. grid.hideHscroll=true
  2102. grid.autosize=true
  2103. }
  2104. //----------------------
  2105. //运行模式中的参数内容:
  2106. /*
  2107. 隐藏行标列标和边框:
  2108. t.rows(0).style.display="none";
  2109. t.childNodes(0).childNodes(0).style.pixelWidth=0;
  2110. t.border=0;
  2111. t.style.borderLeft="";
  2112. t.style.borderRight="";
  2113. t.style.borderTop="";
  2114. t.style.borderBottom="";
  2115. 隐藏滚动条:
  2116. grid.hideVscroll=true;
  2117. grid.hideHscroll=true;
  2118. 不能修改行高列宽
  2119. grid.AdjustRowHeight=false;
  2120. grid.AdjustColWidth=false;
  2121. 只读
  2122. (不能增删行增删列,除设了回车键后移动到何单元此属性之外的单元(不能录入和点击进入),不出现兰框
  2123. grid.ReadOnly=true;
  2124. 在固定列上能否拖动修改
  2125. */
  2126. //----------------------
  2127. blnChange=false
  2128. window.setTimeout("ShowWait.style.display='none';", 10);
  2129. }
  2130. /**
  2131. *打印报表
  2132. **/
  2133. function PrintReport(){
  2134. grid.prn.inPrint=1
  2135. grid.print()
  2136. }
  2137. /**
  2138. *打印预览报表
  2139. **/
  2140. function PreviewReport() {
  2141. grid.prn.inPrint=0
  2142. grid.print()
  2143. }
  2144. /**
  2145. *块复制
  2146. **/
  2147. function cmdBlockCopy(){
  2148. if (tc.style.display =="none")
  2149. return
  2150. //检查区域是否有合并的单元格
  2151. /* if (lngStatus==3 || lngStatus==4){
  2152. alert("选择的区域内有合并单元格,不能做块复制!")
  2153. return
  2154. }
  2155. */
  2156. //块复制
  2157. var i,j,clipboard=""
  2158. //var sColno,eColno
  2159. //blockObjAry=new Array()
  2160. //blockObjAry[0]=eRowSort-sRowSort
  2161. //blockObjAry[1]=eColSort-sColSort
  2162. //var inx=2
  2163. for (i=sRowSort;i<=eRowSort;i++){
  2164. /*
  2165. sColno=sCol
  2166. eColno=eCol
  2167. var osFind=oCoor.documentElement.selectNodes("//record[row='" + i + "' and col='" +sCol +"']")
  2168. if (osFind.length>=1)
  2169. sColno=parseInt(osFind.item(0).childNodes.item(2).text)
  2170. var osFind=oCoor.documentElement.selectNodes("//record[row='" + i + "' and col='" +eCol +"']")
  2171. if (osFind.length>=1)
  2172. eColno=parseInt(osFind.item(0).childNodes.item(2).text)
  2173. */
  2174. for (j=sColSort;j<=eColSort;j++){
  2175. var arr=PhyToLog(i,j)
  2176. var curTD=t.rows(arr[0]).cells(arr[1])
  2177. // blockObjAry[inx]=curTD.innerText //curTD.cloneNode(true)
  2178. clipboard=clipboard+curTD.innerText+"t"
  2179. // inx=inx+1
  2180. }
  2181. clipboard=clipboard+"n"
  2182. }
  2183. window.clipboardData.setData("Text",clipboard)
  2184. }
  2185. /**
  2186. *块粘贴
  2187. **/
  2188. function cmdBlockPaste(){
  2189. //if (SetReadOnly()) return
  2190. var clipboard=""
  2191. //检查是否有复制的数据
  2192. //if (blockObjAry.length<=0 ){
  2193. clipboard=window.clipboardData.getData("Text")
  2194. if (clipboard=="" || clipboard==null ) {
  2195. alert("您还未做区域数据的复制,先复制数据,然后再做粘贴!")
  2196. }
  2197. else