check.xlsx.full.js 78 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942
  1. //chrome brower need F12-> Network->disable cache
  2. // *************************重要:
  3. //1. eval(fun + "('不是数字!')");小心使用,会把字符串参数,转为数学运算,如参数为:"2022-01-01",转为2022-1-1=2020,所以,无论是什么类型的参数,都加上双引号或单引号,不让其认为是计算公式;
  4. //2. window[fun]( txt );在vue中使用,存在兼容问题
  5. var str2=null;
  6. function import_excel_to_json(file){
  7. return new Promise(function (resolve, reject) {
  8. let jsonData = {};
  9. let reader = new FileReader();
  10. reader.readAsBinaryString(file);
  11. reader.onload = function () {
  12. let data = reader.result
  13. let workbook = XLSX.read(data, {
  14. type: 'binary'
  15. })
  16. resolve(workbook);
  17. }
  18. })
  19. };
  20. // 读取本地excel文件
  21. function readWorkbookFromLocalFile(file, callback) {
  22. var reader = new FileReader();
  23. reader.onload = function (e) {
  24. var data = e.target.result;
  25. var workbook = XLSX.read(data, { type: 'binary' });
  26. if (callback) callback(workbook);
  27. };
  28. reader.readAsBinaryString(file);
  29. //reader.readAsArrayBuffer(file);
  30. }
  31. //sheet数
  32. function SheetAmount(workbook){
  33. if (workbook.SheetNames.length >= 15) {
  34. return true;
  35. } else {
  36. return "少于15个表,不是正确日报文件!";
  37. }
  38. }
  39. //sheet是否存在
  40. function HaveSheets(workbook){
  41. var arraySheetNames = ["B1","B2","B3","B4","B6","B7","B8","B9","B10","B11","B12","B13","B14","B15","C"];
  42. let arrStr = new Array(arraySheetNames.length).fill("");
  43. var sheetNames = workbook.SheetNames; // 工作表名称集合
  44. for (let i = 0; i < arraySheetNames.length; i++) {
  45. for (let index = 0; index < sheetNames.length; index++) {
  46. if (arraySheetNames[i] === sheetNames[index]) {
  47. arrStr[i]=arraySheetNames[i];
  48. }
  49. }
  50. }
  51. var flag = true;
  52. var str ="不存在的表: ";
  53. for (let n = 0; n < arrStr.length; n++) {
  54. if (arrStr[n] === "") {
  55. flag = false;
  56. str += arraySheetNames[n] + " ";
  57. }
  58. }
  59. if (flag === true) {
  60. return true;
  61. } else {
  62. return str;
  63. }
  64. }//sheet是否存在
  65. //是否为空表,2022-4-20停用,新函数为HaveData3Para
  66. /* function HaveDatas(workbook){
  67. var worksheet = workbook.Sheets["C"];
  68. if (worksheet["C16"] === undefined) {
  69. return "单元格: C16 " + " -> 空值!" + '\n';
  70. } else {
  71. if (worksheet["C16"].v > 0){
  72. return true;
  73. }else{
  74. return "表C单元格C16 " + " 等于或小于 0,无需上报!" + '\n';
  75. }
  76. }
  77. }*/
  78. function 项目号(str) {
  79. if (str.length != 10){
  80. return "所填:"+ str +",不是10字符!";
  81. }else if(str.substr(0,1)!="U" || !myIsNaN(str.substr(1,4)) || str.substr(5,1)!="P" || !myIsNaN(str.substr(6,4)) ){
  82. return "所填:"+ str +",格式有误!";
  83. }else{
  84. return true;
  85. };
  86. };
  87. // 检验日报excel文件
  88. function readWorkbook(workbook,logID,strDate,userID,unitID,projectID) {
  89. var arraySheetNames = ["B1","B2","B3","B4","B6","B7","B8","B9","B10","B11","B12","B13","B14","B15"];
  90. var arrayFunNames=[
  91. ["必填","站归类B1","区域归类","经度","纬度","文字","日期","上传人","单元号","项目号","受阻归类","通过"],
  92. ["必填","站归类B2","区域归类","经度","纬度","文字","日期","上传人","单元号","项目号","通过"],
  93. ["必填","段归类","区域归类","文字","数值","日期","上传人","单元号","项目号","通过"],
  94. ["必填","段归类","区域归类","文字","数值","数值","日期","上传人","单元号","项目号","通过"],
  95. ["必填","日期","上传人","单元号","项目号","数值","通过"],
  96. ["必填","室分归类B7","经度","纬度","文字","数值","日期","上传人","单元号","项目号","通过"],
  97. ["必填","室分归类B8","经度","纬度","文字","数值","数值","数值","日期","上传人","单元号","项目号","通过"],
  98. ["必填","室分归类B9","经度","纬度","文字","数值","数值","日期","上传人","单元号","项目号","通过"],
  99. ["必填","经度","纬度","文字","数值","数值","日期","上传人","单元号","项目号","通过"],
  100. ["必填","经度","纬度","文字","数值","数值","日期","上传人","单元号","项目号","通过"],
  101. ["必填","经度","纬度","文字","数值","日期","上传人","单元号","项目号","通过"],
  102. ["必填","经度","纬度","文字","数值","日期","上传人","单元号","项目号","通过"],
  103. ["日期","文字","文字","上传人","单元号","项目号","交通归类","用车归类","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","文字","通过"],
  104. ["日期","单元号","项目号","上传人","文字","文字","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","通过"]
  105. ];
  106. var stc = workbook.Sheets["C"];
  107. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  108. var stid=i+2;
  109. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  110. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  111. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  112. var rows = stc["C"+stid].v
  113. var cell_ref;
  114. var index;
  115. for (var R = 2; R <= rows+1; ++R) {//loop row
  116. index = 0;
  117. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  118. str2="";
  119. cell_ref = number2alphabet(C) + R;
  120. str2=null;
  121. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  122. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  123. if (worksheet[cell_ref] === undefined) {
  124. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  125. index++;
  126. // alert(index);
  127. } else {
  128. // alert(index);
  129. if (arrayFunNames[i][index]==="日期") {
  130. //alert(window[arrayFunNames[i][index]](worksheet[cell_ref].v,strDate));
  131. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true){
  132. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  133. }else if (formatExcelDate(worksheet[cell_ref].v,"-") != strDate) {
  134. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ formatExcelDate(worksheet[cell_ref].v,"-") +",不等于所选:" + strDate + '\n';
  135. };
  136. } else if (arrayFunNames[i][index]==="上传人") {
  137. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  138. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  139. };
  140. }else if (arrayFunNames[i][index]==="单元号") {
  141. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true){
  142. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  143. }else if (worksheet[cell_ref].v != unitID) {
  144. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ worksheet[cell_ref].v +",不等于用户归属:" + unitID + '\n';
  145. };
  146. }else if (arrayFunNames[i][index]==="项目号") {
  147. var strs= new Array();
  148. var bHaveMoreID=false
  149. if (projectID.includes(',') && !projectID.includes(',')) {
  150. strs = projectID.split(',')
  151. bHaveMoreID=true
  152. } else if (projectID.includes(',') && !projectID.includes(',') ) {
  153. strs = projectID.split(',')
  154. bHaveMoreID=true
  155. }else if (projectID.includes(',') && projectID.includes(',') ) {
  156. document.getElementById(logID).innerHTML += "所填:"+ projectID +",同时包含中英文豆号!"+ '\n';
  157. }
  158. if (bHaveMoreID) {
  159. for (let index = 0; index < strs.length; index++) {
  160. if (项目号(strs[index]) != true) {
  161. document.getElementById(logID).innerHTML += 项目号(strs[index])+ '\n';
  162. }
  163. }
  164. var bEqual=false
  165. for (let index = 0; index < strs.length; index++) {
  166. if (worksheet[cell_ref].v == strs[index]) {
  167. bEqual = true
  168. }
  169. }
  170. if (bEqual != true ) {
  171. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ worksheet[cell_ref].v +",不含于:" + projectID + '\n';
  172. }
  173. } else {
  174. if (worksheet[cell_ref].v != projectID) {
  175. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ worksheet[cell_ref].v +",不等于:" + projectID + '\n';
  176. };
  177. }
  178. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true){
  179. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  180. }
  181. }else{
  182. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  183. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  184. };
  185. };
  186. index++;
  187. };//cell is not blank
  188. };//loop col
  189. };//loop row
  190. };// 只检查有数据行的sheet
  191. };//loop sheet
  192. };//// 检验日报excel文件
  193. //自定义单元格核验函数/////////////////////////////////////////////////////////////////////////////////////////////////////
  194. function 必填(str) {
  195. //要求非空字符,非0
  196. if(str.toString()==="0"){
  197. return "所填为0!";
  198. }else if(myTrim(str)===""){
  199. return "所填为空!";
  200. }else{
  201. return true;
  202. };
  203. };
  204. function 站归类B1(str) {
  205. var arrStr = ["新址","共址","维护","微站"];
  206. if(!myMatch(arrStr,str)){
  207. return "所填:"+ str +",不是其一:新址|共址|维护|微站 !";
  208. }else{
  209. return true;
  210. };
  211. };
  212. function 站归类B2(str) {
  213. var arrStr = ["新址","共址","维护","微站","存满","软扩"];
  214. if(!myMatch(arrStr,str)){
  215. return "所填:"+ str +",不是其一:新址|共址|维护|微站|存满|软扩 !";
  216. }else{
  217. return true;
  218. };
  219. };
  220. function 区域归类(str) {
  221. var arrStr = ["城区","非城区"];
  222. if(!myMatch(arrStr,str)){
  223. return "所填:"+ str +",不是其一:城区|非城区 !";
  224. }else{
  225. return true;
  226. };
  227. };
  228. function 经度(str) {
  229. if (!myIsNaN(str)){
  230. return "所填:"+ str +",不是数值!";
  231. }else if(str>140||str<60){
  232. return "所填:"+ str +",不在区间60-140!";
  233. }else{
  234. return true;
  235. };
  236. };
  237. function 纬度(str) {
  238. if (!myIsNaN(str)){
  239. return "所填:"+ str +",不是数值!";
  240. }else if(str>125||str<1){
  241. return "所填:"+ str +",不在区间1-125!";
  242. }else{
  243. return true;
  244. };
  245. };
  246. function 文字(str) {
  247. if (myIsNaN(str)){
  248. return "所填:"+ str +",是数值!";
  249. }else if(myTrim(str)===""){
  250. return "所填为空!";
  251. }else{
  252. return true;
  253. };
  254. };
  255. function 日期(strX) {
  256. var str=formatExcelDate(strX,"-")
  257. if(isNaN(str) && !isNaN(Date.parse(str))) {
  258. return true;
  259. }else{
  260. return "所填:"+ str +",不是日期格式!";
  261. };
  262. };
  263. function 上传人(str,userID) {
  264. if (str != userID) {
  265. return "所填:"+ str +",和用户名:"+ userID +",不相等!";
  266. }else{
  267. return true;
  268. };
  269. };
  270. //2022-4-21停用,使用只有1个参数的新版
  271. /*function 单元号(str,unitID) {
  272. if (str != unitID) {
  273. return "所填:"+ str +",和用户单元号:"+ unitID +",不相等!";
  274. }else{
  275. return true;
  276. };
  277. };*/
  278. //2022-4-22停用,使用只有1个参数的新版
  279. /*function 项目号(str,projectID) {
  280. if (str != projectID) {
  281. return "所填:"+ str +",和所选项目号:"+ projectID +",不相等!";
  282. }else{
  283. return true;
  284. };
  285. };*/
  286. function myMatch(arrClass,str) {
  287. var b=false
  288. for (let index = 0; index < arrClass.length; index++) {
  289. if (arrClass[index]===str) {
  290. b=true
  291. }
  292. }
  293. return b;
  294. };
  295. function 受阻归类(str) {
  296. var arrStr = ["成功","部分","失败"];
  297. if(!myMatch(arrStr,str)){
  298. return "所填:"+ str +",不是其一:成功|部分|失败 !";
  299. }else{
  300. return true;
  301. };
  302. };
  303. function 段归类(str) {
  304. var arrStr = ["新建管道","干线","城域","家集客"];
  305. if(!myMatch(arrStr,str)){
  306. return "所填:"+ str +",不是其一:新建管道|干线|城域|家集客 !";
  307. }else{
  308. return true;
  309. };
  310. };
  311. function 数值(str) {
  312. if (!myIsNaN(str)){
  313. return "所填:"+ str +",不是数值!";
  314. }else{
  315. return true;
  316. };
  317. };
  318. function 室分归类B7(str) {
  319. var arrStr = ["信源改造","传统分布","新型分布"];
  320. if(!myMatch(arrStr,str)){
  321. return "所填:"+ str +",不是其一:信源改造|传统分布|新型分布 !";
  322. }else{
  323. return true;
  324. };
  325. };
  326. function 室分归类B8(str) {
  327. var arrStr = ["传统分布","新型分布"];
  328. if(!myMatch(arrStr,str)){
  329. return "所填:"+ str +",不是其一:传统分布|新型分布 !";
  330. }else{
  331. return true;
  332. };
  333. };
  334. function 室分归类B9(str) {
  335. if(str != "仅信源"){
  336. return "所填:"+ str +",不是:仅信源 !";
  337. }else{
  338. return true;
  339. };
  340. };
  341. function 交通归类(str) {
  342. var arrStr = ["租公司车","租个人车","打车","网约车","公交地铁","步行","他方出车","按出图包干"];
  343. if(!myMatch(arrStr,str)){
  344. return "所填:"+ str +",不是其一:租公司车|租个人车|打车|网约车|公交地铁|步行|他方出车|按出图包干 !";
  345. }else{
  346. return true;
  347. };
  348. };
  349. function 用车归类(str) {
  350. var arrStr = ["普通车","越野车","其他"];
  351. if(!myMatch(arrStr,str)){
  352. return "所填:"+ str +",不是其一:普通车|越野车|其他 !";
  353. }else{
  354. return true;
  355. };
  356. };
  357. function myTrim(x) {
  358. var x2 = String(x);
  359. return x2.replace(/^\s+|\s+$/gm,'');
  360. };
  361. function myIsNaN(value) {
  362. let numX = Number(value);
  363. return typeof numX === 'number' && !isNaN(numX);
  364. };
  365. function isNumber(val){
  366. var regPos = /^\d+(\.\d+)?$/;
  367. var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/;
  368. if(regPos.test(val) && regNeg.test(val)){
  369. return true;
  370. }else{
  371. return false;
  372. }
  373. }
  374. function CheckFile(obj) {
  375. alert( typeof obj);
  376. alert(obj.value);
  377. console.log(obj);
  378. var array = new Array('xlsx'); //可以上传的文件类型'gif', 'jpeg', 'png', 'jpg'
  379. if (obj.value == '') {
  380. alert("选择要上传的xlsx文件!");
  381. return false;
  382. }
  383. else {
  384. var fileContentType = obj.value.match(/^(.*)(\.)(.{1,8})$/)[3]; //这个文件类型正则很有用:)
  385. var isExists = false;
  386. for (var i in array) {
  387. if (fileContentType.toLowerCase() == array[i].toLowerCase()) {
  388. isExists = true;
  389. //can next sub
  390. readWorkbookFromLocalFile(obj, function(workbook) {
  391. readWorkbook(workbook);
  392. });
  393. return true;
  394. }
  395. }
  396. if (isExists == false) {
  397. obj.value = null;
  398. alert("文件类型不是xlsx!");
  399. return false;
  400. }
  401. return false;
  402. }
  403. };
  404. /**
  405. * 格式化excel传递的时间
  406. * @param numb 需转化的时间 43853
  407. * @param format 分隔符 "-"
  408. * @returns {string} 2020-1-22
  409. */
  410. function formatExcelDate(numb, format) {
  411. const old = numb - 1;
  412. const t = Math.round((old - Math.floor(old)) * 24 * 60 * 60);
  413. const time = new Date(1900, 0, old, 0, 0, t)
  414. const year = time.getFullYear() ;
  415. const month = time.getMonth() + 1 ;
  416. const date = time.getDate() ;
  417. return year + format + (month < 10 ? '0' + month : month) + format + (date < 10 ? '0' + date : date)
  418. };
  419. //数字列转字母列
  420. str2="";//全局变量,用之前str2="",用完了要手工str2=null;
  421. function number2alphabet(number){
  422. // number要大于0
  423. var str1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  424. if (number <= 26 ) {
  425. //var num1 = parseInt(number / 26);
  426. var num2 = number % 26
  427. if (num2 === 0) {
  428. str2 += "Z";
  429. } else {
  430. str2 += str1.charAt(num2-1);//charAt从0开始的
  431. };
  432. } else {
  433. var num1=parseInt(number / 26);
  434. var num2= number % 26;
  435. if (num1 >= 2 && num2 === 0) {
  436. num1 -= 1 ;
  437. }
  438. number2alphabet(num1);
  439. if (num2 === 0) {
  440. str2 += "Z";
  441. } else {
  442. str2 += str1.charAt(num2-1);//charAt从0开始的
  443. };
  444. };
  445. return str2;
  446. };
  447. //generate json string from workbook
  448. function makeJSONstring(workbook){
  449. var arraySheetNames = ["B1","B2","B3","B4","B6","B7","B8","B9","B10","B11","B12","B13","B14","B15"];
  450. var arrayFunNames=[
  451. ["必填","站归类B1","区域归类","经度","纬度","文字","日期","上传人","单元号","项目号","受阻归类","通过"],
  452. ["必填","站归类B2","区域归类","经度","纬度","文字","日期","上传人","单元号","项目号","通过"],
  453. ["必填","段归类","区域归类","文字","数值","日期","上传人","单元号","项目号","通过"],
  454. ["必填","段归类","区域归类","文字","数值","数值","日期","上传人","单元号","项目号","通过"],
  455. ["必填","日期","上传人","单元号","项目号","数值","通过"],
  456. ["必填","室分归类B7","经度","纬度","文字","数值","日期","上传人","单元号","项目号","通过"],
  457. ["必填","室分归类B8","经度","纬度","文字","数值","数值","数值","日期","上传人","单元号","项目号","通过"],
  458. ["必填","室分归类B9","经度","纬度","文字","数值","数值","日期","上传人","单元号","项目号","通过"],
  459. ["必填","经度","纬度","文字","数值","数值","日期","上传人","单元号","项目号","通过"],
  460. ["必填","经度","纬度","文字","数值","数值","日期","上传人","单元号","项目号","通过"],
  461. ["必填","经度","纬度","文字","数值","日期","上传人","单元号","项目号","通过"],
  462. ["必填","经度","纬度","文字","数值","日期","上传人","单元号","项目号","通过"],
  463. ["日期","文字","文字","上传人","单元号","项目号","交通归类","用车归类","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","文字","通过"],
  464. ["日期","单元号","项目号","上传人","文字","文字","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","通过"]
  465. ];
  466. var strB="";
  467. var stc = workbook.Sheets["C"];
  468. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  469. var stid=i+2;
  470. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  471. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  472. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  473. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  474. var rows = stc["C"+stid].v
  475. var cell_ref;
  476. for (var R = 2; R <= rows+1; ++R) {//loop row
  477. if (R===2) {
  478. strB +="[";
  479. }else{
  480. strB +="▓[";
  481. };
  482. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  483. str2="";
  484. cell_ref = number2alphabet(C) + R;
  485. str2=null;
  486. if (C===(arrayFunNames[i].length+1)) {
  487. if (arrayFunNames[i][C-2]==="日期") {
  488. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  489. }else{
  490. strB += worksheet[cell_ref].v;
  491. };
  492. } else {
  493. if (arrayFunNames[i][C-2]==="日期") {
  494. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  495. }else{
  496. strB += worksheet[cell_ref].v + "∮";
  497. };
  498. };
  499. };//loop col
  500. strB +="]";
  501. };//loop row
  502. strB +="]\",";
  503. };// 只检查有数据行的sheet
  504. };//loop sheet
  505. return "{"+strB+"}";
  506. };
  507. ///////////////////under this line special for income xlsx file //////////////////////////////////
  508. function 年月(str) {
  509. var str1 = str.substr(0,4);
  510. var str2 = str.substr(4,2);
  511. if(isNaN(str1+"-"+str2+"-01") && !isNaN(Date.parse(str1+"-"+str2+"-01"))) {
  512. return true;
  513. }else{
  514. return "所填:"+ str +",不是年月!";
  515. };
  516. };
  517. function 是否(str) {
  518. var arrStr = ["是","否"];
  519. if(!myMatch(arrStr,str)){
  520. return "所填:"+ str +",不是其一:是|否 !";
  521. }else{
  522. return true;
  523. };
  524. };
  525. function 收入凭证(str) {
  526. var arrStr = ["无","邮件","聊天截图","签证图片","其他"];
  527. if(!myMatch(arrStr,str)){
  528. return "所填:"+ str +",不是其一:无|邮件|聊天截图|签证图片|其他 !";
  529. }else{
  530. return true;
  531. };
  532. };
  533. function 结算模式(str) {
  534. var arrStr = ["比例","计件","人天","比例计件","比例人天","计件人天","比例计件人天"];
  535. if(!myMatch(arrStr,str)){
  536. return "所填:"+ str +",不是其一:比例|计件|人天|比例计件|比例人天|计件人天|比例计件人天 !";
  537. }else{
  538. return true;
  539. };
  540. };
  541. function 通过(str) {
  542. return true;
  543. };
  544. //Single sheet是否存在
  545. function HaveSingleSheetName(workbook,sheetname){
  546. var flag = false;
  547. var sheetNames = workbook.SheetNames; // 工作表名称集合
  548. for (let index = 0; index < sheetNames.length; index++) {
  549. if (sheetname === sheetNames[index]) {
  550. flag = true;
  551. }
  552. }
  553. if (flag === true) {
  554. return true;
  555. } else {
  556. return sheetname + ",表不存在!";
  557. }
  558. } ; //Single sheet是否存在
  559. //是否为空表3参数通用版
  560. function HaveData3Para(workbook,sheetname,cellname){
  561. var worksheet = workbook.Sheets[sheetname];
  562. if (worksheet[cellname] === undefined) {
  563. var worksheet = workbook.Sheets[sheetname];
  564. return "表"+ sheetname +"单元格" + cellname + " 为空!" + '\n';
  565. } else {
  566. if (worksheet[cellname].v > 0){
  567. return true;
  568. }else{
  569. return "表"+ sheetname +"单元格" + cellname + " 等于或小于 0,无需上报!" + '\n';
  570. }
  571. }
  572. };
  573. // 检验收入excel文件
  574. function checkIncomeFile(workbook,logID,strYYYYMM,userID,unitID) {
  575. var arraySheetNames = ["SR"];
  576. var arrayFunNames=[
  577. ["年月","单元号","上传人","文字","文字","文字","文字","日期","日期","是否","数值","数值","收入凭证","结算模式","文字","文字","通过","通过"]
  578. ];
  579. var stc = workbook.Sheets["SR"];
  580. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  581. var stid=1;
  582. if (stc["T"+stid].v > 0 ) {// 只检查有数据行的sheet
  583. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  584. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  585. var rows = stc["T"+stid].v
  586. var cell_ref;
  587. var index;
  588. for (var R = 2; R <= rows+1; ++R) {//loop row
  589. index = 0;
  590. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  591. str2="";
  592. cell_ref = number2alphabet(C) + R;
  593. str2=null;
  594. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  595. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  596. if (worksheet[cell_ref] === undefined) {
  597. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  598. index++;
  599. // alert(index);
  600. } else {
  601. // alert(index);
  602. if (arrayFunNames[i][index]==="年月") {
  603. //alert(window[arrayFunNames[i][index]](worksheet[cell_ref].v,strDate));
  604. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true){
  605. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  606. }else if (worksheet[cell_ref].v != strYYYYMM) {
  607. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ worksheet[cell_ref].v +",不等于所选:" + strYYYYMM + '\n';
  608. };
  609. } else if (arrayFunNames[i][index]==="上传人") {
  610. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  611. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  612. };
  613. }else if (arrayFunNames[i][index]==="单元号") {
  614. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true){
  615. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  616. }else if (worksheet[cell_ref].v != unitID) {
  617. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ worksheet[cell_ref].v +",不等于用户归属:" + unitID + '\n';
  618. };
  619. }else{
  620. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  621. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  622. };
  623. };
  624. index++;
  625. };//cell is not blank
  626. };//loop col
  627. };//loop row
  628. };// 只检查有数据行的sheet
  629. };//loop sheet
  630. };//// 检验收入excel文件
  631. //generate income data to json string from workbook
  632. function makeIncomeJSONstring(workbook){
  633. var arraySheetNames = ["SR"];
  634. var arrayFunNames=[
  635. ["年月","单元号","上传人","文字","文字","文字","文字","日期","日期","是否","数值","数值","收入凭证","结算模式","文字","文字","通过","通过"]
  636. ];
  637. var strB="";
  638. var stc = workbook.Sheets["SR"];
  639. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  640. var stid=1;
  641. if (stc["T"+stid].v > 0 ) {// 只检查有数据行的sheet
  642. //strB +=","+ arraySheetNames[i] +":[";
  643. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  644. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  645. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  646. var rows = stc["T"+stid].v
  647. var cell_ref;
  648. for (var R = 2; R <= rows+1; ++R) {//loop row
  649. if (R===2) {
  650. strB +="[";
  651. }else{
  652. strB +="▓[";
  653. };
  654. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  655. str2="";
  656. cell_ref = number2alphabet(C) + R;
  657. str2=null;
  658. if (C===(arrayFunNames[i].length+1)) {
  659. if (arrayFunNames[i][C-2]==="日期") {
  660. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  661. }else{
  662. strB += worksheet[cell_ref].v;
  663. };
  664. } else {
  665. if (arrayFunNames[i][C-2]==="日期") {
  666. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  667. }else{
  668. strB += worksheet[cell_ref].v + "∮";
  669. };
  670. };
  671. };//loop col
  672. strB +="]";
  673. };//loop row
  674. strB +="]\",";
  675. };// 只检查有数据行的sheet
  676. };//loop sheet
  677. return "{"+strB+"}";
  678. };//generate income data to json string from workbook
  679. ///////////////////under this line start for balance xlsx file //////////////////////////////////
  680. function 单元号(str) {
  681. if (str.length != 5){
  682. return "所填:"+ str +",不是5字符!";
  683. }else if(str.substr(0,1)!="U" || !myIsNaN(str.substr(1,4))){
  684. return "所填:"+ str +",格式有误!";
  685. }else{
  686. return true;
  687. };
  688. };
  689. function 住宿归类(str) {
  690. var arrStr = ["宾馆","宿舍"];
  691. if(!myMatch(arrStr,str)){
  692. return "所填:"+ str +",不是其一:宾馆|宿舍 !";
  693. }else{
  694. return true;
  695. };
  696. };
  697. // 检验 支援 excel文件
  698. function checkBalanceFile(workbook,logID,strStartDate,strEndDate,userID) {
  699. var arraySheetNames = ["GRZY","JJZY"];
  700. var arrayFunNames=[
  701. ["文字","单元号","单元号","日期","住宿归类","数值","上传人","通过"],
  702. ["文字","单元号","单元号","日期","文字","文字","文字","数值","数值","数值","上传人","通过"]
  703. ];
  704. var stc = workbook.Sheets["C"];
  705. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  706. var stid=i+2;
  707. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  708. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  709. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  710. var rows = stc["C"+stid].v
  711. var cell_ref;
  712. var index;
  713. for (var R = 2; R <= rows+1; ++R) {//loop row
  714. index = 0;
  715. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  716. str2="";
  717. cell_ref = number2alphabet(C) + R;
  718. str2=null;
  719. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  720. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  721. if (worksheet[cell_ref] === undefined) {
  722. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  723. index++;
  724. // alert(index);
  725. } else {
  726. // alert(index);
  727. if (arrayFunNames[i][index]==="日期") {
  728. //alert(window[arrayFunNames[i][index]](worksheet[cell_ref].v,strDate));
  729. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true){
  730. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  731. }else {
  732. var objStartDate = new Date(strStartDate);
  733. var objEndDate = new Date(strEndDate);
  734. var objTableDate = new Date(formatExcelDate(worksheet[cell_ref].v,"-"));
  735. if (objTableDate.getTime()<objStartDate.getTime() || objTableDate.getTime()>objEndDate.getTime() ){
  736. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ formatExcelDate(worksheet[cell_ref].v,"-") +",不在界面日期区间内!" + '\n';
  737. }
  738. };
  739. } else if (arrayFunNames[i][index]==="上传人") {
  740. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  741. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  742. };
  743. }else{
  744. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  745. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  746. };
  747. };
  748. index++;
  749. };//cell is not blank
  750. };//loop col
  751. };//loop row
  752. };// 只检查有数据行的sheet
  753. };//loop sheet
  754. }; // 检验 支援 excel文件
  755. //generate balance data to json string from workbook
  756. function makeBalanceJSONstring(workbook){
  757. var arraySheetNames = ["GRZY","JJZY"];
  758. var arrayFunNames=[
  759. ["文字","单元号","单元号","日期","住宿归类","数值","上传人","通过"],
  760. ["文字","单元号","单元号","日期","文字","文字","文字","数值","数值","数值","上传人","通过"]
  761. ];
  762. var strB="";
  763. var stc = workbook.Sheets["C"];
  764. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  765. var stid=i+2;
  766. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  767. //strB +=","+ arraySheetNames[i] +":[";
  768. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  769. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  770. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  771. var rows = stc["C"+stid].v
  772. var cell_ref;
  773. for (var R = 2; R <= rows+1; ++R) {//loop row
  774. if (R===2) {
  775. strB +="[";
  776. }else{
  777. strB +="▓[";
  778. };
  779. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  780. str2="";
  781. cell_ref = number2alphabet(C) + R;
  782. str2=null;
  783. if (C===(arrayFunNames[i].length+1)) {
  784. if (arrayFunNames[i][C-2]==="日期") {
  785. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  786. }else{
  787. strB += worksheet[cell_ref].v;
  788. };
  789. } else {
  790. if (arrayFunNames[i][C-2]==="日期") {
  791. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  792. }else{
  793. strB += worksheet[cell_ref].v + "∮";
  794. };
  795. };
  796. };//loop col
  797. strB +="]";
  798. };//loop row
  799. strB +="]\",";
  800. };// 只检查有数据行的sheet
  801. };//loop sheet
  802. return "{"+strB+"}";
  803. };//generate balance data to json string from workbook
  804. ///////////////////under this line start for invoice xlsx file //////////////////////////////////
  805. // 检验 开票 excel文件
  806. function checkInvoiceFile(workbook,logID,userID) {
  807. var arraySheetNames = ["KP"];
  808. var arrayFunNames=[
  809. ["通过","通过","通过","通过","文字","数值","数值","数值","文字","数值","数值","日期","结算模式","文字","文字","是否","项目号","通过","文字","上传人","通过"]
  810. ];
  811. var stc = workbook.Sheets["KP"];
  812. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  813. var stid=1;
  814. if (stc["W"+stid].v > 0 ) {// 只检查有数据行的sheet
  815. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  816. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  817. var rows = stc["W"+stid].v
  818. var cell_ref;
  819. var index;
  820. for (var R = 2; R <= rows+1; ++R) {//loop row
  821. index = 0;
  822. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  823. str2="";
  824. cell_ref = number2alphabet(C) + R;
  825. str2=null;
  826. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  827. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  828. if (worksheet[cell_ref] === undefined) {
  829. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  830. index++;
  831. } else {
  832. // alert(index);
  833. if (arrayFunNames[i][index]==="上传人") {
  834. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  835. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  836. };
  837. }else if(arrayFunNames[i][index]==="项目号"){
  838. str2="";
  839. var cell_ref2 = number2alphabet(C-1) + R;
  840. str2=null;
  841. if (worksheet[cell_ref2].v=== "是" ){
  842. //worksheet[cell_ref].v = "见拆分";
  843. }else{
  844. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  845. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  846. };
  847. };
  848. }else{
  849. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  850. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  851. };
  852. };
  853. index++;
  854. };//cell is not blank
  855. };//loop col
  856. };//loop row
  857. };// 只检查有数据行的sheet
  858. };//loop sheet
  859. };//// 检验 开票 excel文件
  860. //generate invoice data to json string from workbook
  861. function makeInvoiceJSONstring(workbook){
  862. var arraySheetNames = ["KP"];
  863. var arrayFunNames=[
  864. ["通过","通过","通过","通过","文字","数值","数值","数值","文字","数值","数值","日期","结算模式","文字","文字","是否","项目号","通过","文字","上传人","通过"]
  865. ];
  866. var strB="";
  867. var stc = workbook.Sheets["KP"];
  868. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  869. var stid=1;
  870. if (stc["W"+stid].v > 0 ) {// 只检查有数据行的sheet
  871. //strB +=","+ arraySheetNames[i] +":[";
  872. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  873. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  874. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  875. var rows = stc["W"+stid].v
  876. var cell_ref;
  877. for (var R = 2; R <= rows+1; ++R) {//loop row
  878. if (R===2) {
  879. strB +="[";
  880. }else{
  881. strB +="▓[";
  882. };
  883. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  884. str2="";
  885. cell_ref = number2alphabet(C) + R;
  886. str2=null;
  887. if (C===(arrayFunNames[i].length+1)) {
  888. if (arrayFunNames[i][C-2]==="日期") {
  889. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  890. }else{
  891. strB += worksheet[cell_ref].v;
  892. };
  893. } else {
  894. if (arrayFunNames[i][C-2]==="日期") {
  895. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  896. }else{
  897. strB += worksheet[cell_ref].v + "∮";
  898. };
  899. };
  900. };//loop col
  901. strB +="]";
  902. };//loop row
  903. strB +="]\",";
  904. };// 只检查有数据行的sheet
  905. };//loop sheet
  906. return "{"+strB+"}";
  907. };//generate invoice data to json string from workbook
  908. ///////////////////under this line start for invoice_split xlsx file //////////////////////////////////
  909. // 检验 开票拆分 excel文件
  910. function checkInvoiceSplitFile(workbook,logID,userID) {
  911. var arraySheetNames = ["KPCF"];
  912. var arrayFunNames=[
  913. ["通过","数值","项目号","通过","文字","上传人"]
  914. ];
  915. var stc = workbook.Sheets["KPCF"];
  916. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  917. var stid=1;
  918. if (stc["H"+stid].v > 0 ) {// 只检查有数据行的sheet
  919. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  920. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  921. var rows = stc["H"+stid].v
  922. var cell_ref;
  923. var index;
  924. for (var R = 2; R <= rows+1; ++R) {//loop row
  925. index = 0;
  926. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  927. str2="";
  928. cell_ref = number2alphabet(C) + R;
  929. str2=null;
  930. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  931. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  932. if (worksheet[cell_ref] === undefined) {
  933. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  934. index++;
  935. } else {
  936. // alert(index);
  937. if (arrayFunNames[i][index]==="上传人") {
  938. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  939. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  940. };
  941. }else{
  942. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  943. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  944. };
  945. };
  946. index++;
  947. };//cell is not blank
  948. };//loop col
  949. };//loop row
  950. };// 只检查有数据行的sheet
  951. };//loop sheet
  952. };//// 检验 开票 excel文件
  953. //generate invoice-split data to json string from workbook
  954. function makeInvoiceSplitJSONstring(workbook){
  955. var arraySheetNames = ["KPCF"];
  956. var arrayFunNames=[
  957. ["通过","数值","项目号","通过","文字","上传人"]
  958. ];
  959. var strB="";
  960. var stc = workbook.Sheets["KPCF"];
  961. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  962. var stid=1;
  963. if (stc["H"+stid].v > 0 ) {// 只检查有数据行的sheet
  964. //strB +=","+ arraySheetNames[i] +":[";
  965. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  966. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  967. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  968. var rows = stc["H"+stid].v
  969. var cell_ref;
  970. for (var R = 2; R <= rows+1; ++R) {//loop row
  971. if (R===2) {
  972. strB +="[";
  973. }else{
  974. strB +="▓[";
  975. };
  976. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  977. str2="";
  978. cell_ref = number2alphabet(C) + R;
  979. str2=null;
  980. if (C===(arrayFunNames[i].length+1)) {
  981. if (arrayFunNames[i][C-2]==="日期") {
  982. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  983. }else{
  984. strB += worksheet[cell_ref].v;
  985. };
  986. } else {
  987. if (arrayFunNames[i][C-2]==="日期") {
  988. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  989. }else{
  990. strB += worksheet[cell_ref].v + "∮";
  991. };
  992. };
  993. };//loop col
  994. strB +="]";
  995. };//loop row
  996. strB +="]\",";
  997. };// 只检查有数据行的sheet
  998. };//loop sheet
  999. return "{"+strB+"}";
  1000. };//generate invoice data to json string from workbook
  1001. ///////////////////under this line start for salary xlsx file //////////////////////////////////
  1002. // 检验 工资 excel文件
  1003. function checkSalaryFile(workbook,logID,strYYYYMM,userID) {
  1004. var arraySheetNames = ["CGZ","CQT","CJT"];
  1005. var arrayFunNames=[
  1006. ["单元号","年月","文字","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","通过","通过","数值","数值","上传人"],
  1007. ["单元号","年月","数值","数值","数值","数值","通过","上传人"],
  1008. ["单元号","年月","文字","文字","数值","通过","上传人"]
  1009. ];
  1010. var stc = workbook.Sheets["C"];
  1011. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1012. var stid=i+2;
  1013. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  1014. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1015. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1016. var rows = stc["C"+stid].v
  1017. var cell_ref;
  1018. var index;
  1019. for (var R = 2; R <= rows+1; ++R) {//loop row
  1020. index = 0;
  1021. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1022. str2="";
  1023. cell_ref = number2alphabet(C) + R;
  1024. str2=null;
  1025. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  1026. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  1027. if (worksheet[cell_ref] === undefined) {
  1028. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  1029. index++;
  1030. // alert(index);
  1031. } else {
  1032. if (arrayFunNames[i][index]==="年月") {
  1033. //alert(window[arrayFunNames[i][index]](worksheet[cell_ref].v,strDate));
  1034. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true){
  1035. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  1036. }else if (worksheet[cell_ref].v != strYYYYMM) {
  1037. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ worksheet[cell_ref].v +",不等于所选:" + strYYYYMM + '\n';
  1038. };
  1039. } else if (arrayFunNames[i][index]==="上传人") {
  1040. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  1041. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  1042. };
  1043. }else{
  1044. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  1045. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  1046. };
  1047. };
  1048. index++;
  1049. };//cell is not blank
  1050. };//loop col
  1051. };//loop row
  1052. };// 只检查有数据行的sheet
  1053. };//loop sheet
  1054. }; // 检验 支援 excel文件
  1055. //generate salary data to json string from workbook
  1056. function makeSalaryJSONstring(workbook){
  1057. var arraySheetNames = ["CGZ","CQT","CJT"];
  1058. var arrayFunNames=[
  1059. ["单元号","年月","文字","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","通过","通过","数值","数值","上传人"],
  1060. ["单元号","年月","数值","数值","数值","数值","通过","上传人"],
  1061. ["单元号","年月","文字","文字","数值","通过","上传人"]
  1062. ];
  1063. var strB="";
  1064. var stc = workbook.Sheets["C"];
  1065. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1066. var stid=i+2;
  1067. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  1068. //strB +=","+ arraySheetNames[i] +":[";
  1069. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  1070. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1071. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1072. var rows = stc["C"+stid].v
  1073. var cell_ref;
  1074. for (var R = 2; R <= rows+1; ++R) {//loop row
  1075. if (R===2) {
  1076. strB +="[";
  1077. }else{
  1078. strB +="▓[";
  1079. };
  1080. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1081. str2="";
  1082. cell_ref = number2alphabet(C) + R;
  1083. str2=null;
  1084. if (C===(arrayFunNames[i].length+1)) {
  1085. if (arrayFunNames[i][C-2]==="日期") {
  1086. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  1087. }else{
  1088. strB += worksheet[cell_ref].v;
  1089. };
  1090. } else {
  1091. if (arrayFunNames[i][C-2]==="日期") {
  1092. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  1093. }else{
  1094. strB += worksheet[cell_ref].v + "∮";
  1095. };
  1096. };
  1097. };//loop col
  1098. strB +="]";
  1099. };//loop row
  1100. strB +="]\",";
  1101. };// 只检查有数据行的sheet
  1102. };//loop sheet
  1103. return "{"+strB+"}";
  1104. };//generate salary data to json string from workbook
  1105. ///////////////////under this line start for cash_in xlsx file //////////////////////////////////
  1106. // 检验 到款 excel文件
  1107. function checkCashInFile(workbook,logID,strStartDate,strEndDate,userID) {
  1108. var arraySheetNames = ["DK"];
  1109. var arrayFunNames=[
  1110. ["日期","数值","通过","项目号","文字","通过","上传人"]
  1111. ];
  1112. var stc = workbook.Sheets["DK"];
  1113. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1114. var stid=1;
  1115. if (stc["I"+stid].v > 0 ) {// 只检查有数据行的sheet
  1116. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1117. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1118. var rows = stc["I"+stid].v
  1119. var cell_ref;
  1120. var index;
  1121. for (var R = 2; R <= rows+1; ++R) {//loop row
  1122. index = 0;
  1123. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1124. str2="";
  1125. cell_ref = number2alphabet(C) + R;
  1126. str2=null;
  1127. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  1128. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  1129. if (worksheet[cell_ref] === undefined) {
  1130. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  1131. index++;
  1132. // alert(index);
  1133. } else {
  1134. // alert(index);
  1135. if (arrayFunNames[i][index]==="日期") {
  1136. //alert(window[arrayFunNames[i][index]](worksheet[cell_ref].v,strDate));
  1137. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true){
  1138. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  1139. }else {
  1140. var objStartDate = new Date(strStartDate);
  1141. var objEndDate = new Date(strEndDate);
  1142. var objTableDate = new Date(formatExcelDate(worksheet[cell_ref].v,"-"));
  1143. if (objTableDate.getTime()<objStartDate.getTime() || objTableDate.getTime()>objEndDate.getTime() ){
  1144. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ formatExcelDate(worksheet[cell_ref].v,"-") +",不在界面日期区间内!" + '\n';
  1145. }
  1146. };
  1147. } else if (arrayFunNames[i][index]==="上传人") {
  1148. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  1149. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  1150. };
  1151. }else{
  1152. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  1153. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  1154. };
  1155. };
  1156. index++;
  1157. };//cell is not blank
  1158. };//loop col
  1159. };//loop row
  1160. };// 只检查有数据行的sheet
  1161. };//loop sheet
  1162. }; // 检验 到款 excel文件
  1163. //generate cashin data to json string from workbook
  1164. function makeCashInJSONstring(workbook){
  1165. var arraySheetNames = ["DK"];
  1166. var arrayFunNames=[
  1167. ["日期","数值","通过","项目号","文字","通过","上传人"]
  1168. ];
  1169. var strB="";
  1170. var stc = workbook.Sheets["DK"];
  1171. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1172. var stid=1;
  1173. if (stc["I"+stid].v > 0 ) {// 只检查有数据行的sheet
  1174. //strB +=","+ arraySheetNames[i] +":[";
  1175. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  1176. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1177. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1178. var rows = stc["I"+stid].v
  1179. var cell_ref;
  1180. for (var R = 2; R <= rows+1; ++R) {//loop row
  1181. if (R===2) {
  1182. strB +="[";
  1183. }else{
  1184. strB +="▓[";
  1185. };
  1186. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1187. str2="";
  1188. cell_ref = number2alphabet(C) + R;
  1189. str2=null;
  1190. if (C===(arrayFunNames[i].length+1)) {
  1191. if (arrayFunNames[i][C-2]==="日期") {
  1192. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  1193. }else{
  1194. strB += worksheet[cell_ref].v;
  1195. };
  1196. } else {
  1197. if (arrayFunNames[i][C-2]==="日期") {
  1198. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  1199. }else{
  1200. strB += worksheet[cell_ref].v + "∮";
  1201. };
  1202. };
  1203. };//loop col
  1204. strB +="]";
  1205. };//loop row
  1206. strB +="]\",";
  1207. };// 只检查有数据行的sheet
  1208. };//loop sheet
  1209. return "{"+strB+"}";
  1210. };//generate cashin data to json string from workbook
  1211. ///////////////////under this line start for cash_out xlsx file //////////////////////////////////
  1212. // 检验 付款 excel文件
  1213. function checkCashOutFile(workbook,logID,strStartDate,strEndDate,userID) {
  1214. var arraySheetNames = ["FK"];
  1215. var arrayFunNames=[
  1216. ["日期","数值","通过","项目号","通过","上传人"]
  1217. ];
  1218. var stc = workbook.Sheets["FK"];
  1219. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1220. var stid=1;
  1221. if (stc["H"+stid].v > 0 ) {// 只检查有数据行的sheet
  1222. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1223. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1224. var rows = stc["H"+stid].v
  1225. var cell_ref;
  1226. var index;
  1227. for (var R = 2; R <= rows+1; ++R) {//loop row
  1228. index = 0;
  1229. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1230. str2="";
  1231. cell_ref = number2alphabet(C) + R;
  1232. str2=null;
  1233. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  1234. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  1235. if (worksheet[cell_ref] === undefined) {
  1236. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  1237. index++;
  1238. // alert(index);
  1239. } else {
  1240. // alert(index);
  1241. if (arrayFunNames[i][index]==="日期") {
  1242. //alert(window[arrayFunNames[i][index]](worksheet[cell_ref].v,strDate));
  1243. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true){
  1244. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  1245. }else {
  1246. var objStartDate = new Date(strStartDate);
  1247. var objEndDate = new Date(strEndDate);
  1248. var objTableDate = new Date(formatExcelDate(worksheet[cell_ref].v,"-"));
  1249. if (objTableDate.getTime()<objStartDate.getTime() || objTableDate.getTime()>objEndDate.getTime() ){
  1250. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + "所填:"+ formatExcelDate(worksheet[cell_ref].v,"-") +",不在界面日期区间内!" + '\n';
  1251. }
  1252. };
  1253. } else if (arrayFunNames[i][index]==="上传人") {
  1254. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  1255. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  1256. };
  1257. }else{
  1258. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  1259. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  1260. };
  1261. };
  1262. index++;
  1263. };//cell is not blank
  1264. };//loop col
  1265. };//loop row
  1266. };// 只检查有数据行的sheet
  1267. };//loop sheet
  1268. }; // 检验 付款 excel文件
  1269. //generate cashout data to json string from workbook
  1270. function makeCashOutJSONstring(workbook){
  1271. var arraySheetNames = ["FK"];
  1272. var arrayFunNames=[
  1273. ["日期","数值","通过","项目号","通过","上传人"]
  1274. ];
  1275. var strB="";
  1276. var stc = workbook.Sheets["FK"];
  1277. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1278. var stid=1;
  1279. if (stc["H"+stid].v > 0 ) {// 只检查有数据行的sheet
  1280. //strB +=","+ arraySheetNames[i] +":[";
  1281. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  1282. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1283. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1284. var rows = stc["H"+stid].v
  1285. var cell_ref;
  1286. for (var R = 2; R <= rows+1; ++R) {//loop row
  1287. if (R===2) {
  1288. strB +="[";
  1289. }else{
  1290. strB +="▓[";
  1291. };
  1292. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1293. str2="";
  1294. cell_ref = number2alphabet(C) + R;
  1295. str2=null;
  1296. if (C===(arrayFunNames[i].length+1)) {
  1297. if (arrayFunNames[i][C-2]==="日期") {
  1298. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  1299. }else{
  1300. strB += worksheet[cell_ref].v;
  1301. };
  1302. } else {
  1303. if (arrayFunNames[i][C-2]==="日期") {
  1304. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  1305. }else{
  1306. strB += worksheet[cell_ref].v + "∮";
  1307. };
  1308. };
  1309. };//loop col
  1310. strB +="]";
  1311. };//loop row
  1312. strB +="]\",";
  1313. };// 只检查有数据行的sheet
  1314. };//loop sheet
  1315. return "{"+strB+"}";
  1316. };//generate cashout data to json string from workbook
  1317. ///////////////////under this line start for b14c xlsx file //////////////////////////////////
  1318. // 检验 B14C excel文件
  1319. function checkB14CFile(workbook,logID,userID) {
  1320. var arraySheetNames = ["B14C"];
  1321. var arrayFunNames=[
  1322. ["日期","文字","文字","文字","单元号","项目号","交通归类","用车归类","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","通过","通过","文字","日期","通过","通过","通过","通过","通过","数值","通过","通过","通过","通过","通过","通过","数值","数值","数值","数值","通过","通过","日期","文字","上传人"]
  1323. ];
  1324. var stc = workbook.Sheets["C"];
  1325. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1326. var stid=2;
  1327. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  1328. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1329. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1330. var rows = stc["C"+stid].v
  1331. var cell_ref;
  1332. var index;
  1333. for (var R = 2; R <= rows+1; ++R) {//loop row
  1334. index = 0;
  1335. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1336. str2="";
  1337. cell_ref = number2alphabet(C) + R;
  1338. str2=null;
  1339. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  1340. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  1341. if (worksheet[cell_ref] === undefined) {
  1342. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  1343. index++;
  1344. // alert(index);
  1345. } else {
  1346. if (arrayFunNames[i][index]==="上传人") {
  1347. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  1348. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  1349. };
  1350. }else{
  1351. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  1352. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  1353. };
  1354. };
  1355. index++;
  1356. };//cell is not blank
  1357. };//loop col
  1358. };//loop row
  1359. };// 只检查有数据行的sheet
  1360. };//loop sheet
  1361. }; // 检验 B14C excel文件
  1362. //generate b14c data to json string from workbook
  1363. function makeB14CJSONstring(workbook){
  1364. var arraySheetNames = ["B14C"];
  1365. var arrayFunNames=[
  1366. ["日期","文字","文字","文字","单元号","项目号","交通归类","用车归类","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","通过","通过","文字","日期","通过","通过","通过","通过","通过","数值","通过","通过","通过","通过","通过","通过","数值","数值","数值","数值","通过","通过","日期","文字","上传人"]
  1367. ];
  1368. var strB="";
  1369. var stc = workbook.Sheets["C"];
  1370. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1371. var stid=2;
  1372. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  1373. //strB +=","+ arraySheetNames[i] +":[";
  1374. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  1375. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1376. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1377. var rows = stc["C"+stid].v
  1378. var cell_ref;
  1379. for (var R = 2; R <= rows+1; ++R) {//loop row
  1380. if (R===2) {
  1381. strB +="[";
  1382. }else{
  1383. strB +="▓[";
  1384. };
  1385. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1386. str2="";
  1387. cell_ref = number2alphabet(C) + R;
  1388. str2=null;
  1389. if (C===(arrayFunNames[i].length+1)) {
  1390. if (arrayFunNames[i][C-2]==="日期") {
  1391. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  1392. }else{
  1393. strB += worksheet[cell_ref].v;
  1394. };
  1395. } else {
  1396. if (arrayFunNames[i][C-2]==="日期") {
  1397. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  1398. }else{
  1399. strB += worksheet[cell_ref].v + "∮";
  1400. };
  1401. };
  1402. };//loop col
  1403. strB +="]";
  1404. };//loop row
  1405. strB +="]\",";
  1406. };// 只检查有数据行的sheet
  1407. };//loop sheet
  1408. return "{"+strB+"}";
  1409. };//generate b14c data to json string from workbook
  1410. ///////////////////under this line start for b15c xlsx file //////////////////////////////////
  1411. // 检验 B15C excel文件
  1412. function checkB15CFile(workbook,logID,userID) {
  1413. var arraySheetNames = ["B15C"];
  1414. var arrayFunNames=[
  1415. ["日期","单元号","项目号","文字","通过","通过","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","通过","文字","通过","文字","通过","通过","通过","通过","数值","数值","数值","数值","数值","通过","数值","数值","数值","通过","通过","通过","文字","通过","通过","通过","通过","通过","通过","上传人"]
  1416. ];
  1417. var stc = workbook.Sheets["C"];
  1418. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1419. var stid=2;
  1420. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  1421. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1422. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1423. var rows = stc["C"+stid].v
  1424. var cell_ref;
  1425. var index;
  1426. for (var R = 2; R <= rows+1; ++R) {//loop row
  1427. index = 0;
  1428. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1429. str2="";
  1430. cell_ref = number2alphabet(C) + R;
  1431. str2=null;
  1432. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  1433. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  1434. if (worksheet[cell_ref] === undefined) {
  1435. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  1436. index++;
  1437. // alert(index);
  1438. } else {
  1439. if (arrayFunNames[i][index]==="上传人") {
  1440. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  1441. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  1442. };
  1443. }else{
  1444. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  1445. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  1446. };
  1447. };
  1448. index++;
  1449. };//cell is not blank
  1450. };//loop col
  1451. };//loop row
  1452. };// 只检查有数据行的sheet
  1453. };//loop sheet
  1454. }; // 检验 B15C excel文件
  1455. //generate b15c data to json string from workbook
  1456. function makeB15CJSONstring(workbook){
  1457. var arraySheetNames = ["B15C"];
  1458. var arrayFunNames=[
  1459. ["日期","单元号","项目号","文字","通过","通过","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","数值","通过","文字","日期","文字","通过","通过","通过","通过","数值","数值","数值","数值","数值","通过","数值","数值","数值","通过","通过","日期","文字","通过","通过","通过","通过","通过","通过","上传人"]
  1460. ];
  1461. var strB="";
  1462. var stc = workbook.Sheets["C"];
  1463. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1464. var stid=2;
  1465. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  1466. //strB +=","+ arraySheetNames[i] +":[";
  1467. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  1468. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1469. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1470. var rows = stc["C"+stid].v
  1471. var cell_ref;
  1472. for (var R = 2; R <= rows+1; ++R) {//loop row
  1473. if (R===2) {
  1474. strB +="[";
  1475. }else{
  1476. strB +="▓[";
  1477. };
  1478. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1479. str2="";
  1480. cell_ref = number2alphabet(C) + R;
  1481. str2=null;
  1482. if (C===(arrayFunNames[i].length+1)) {
  1483. if (arrayFunNames[i][C-2]==="日期") {
  1484. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  1485. }else{
  1486. strB += worksheet[cell_ref].v;
  1487. };
  1488. } else {
  1489. if (arrayFunNames[i][C-2]==="日期") {
  1490. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  1491. }else{
  1492. strB += worksheet[cell_ref].v + "∮";
  1493. };
  1494. };
  1495. };//loop col
  1496. strB +="]";
  1497. };//loop row
  1498. strB +="]\",";
  1499. };// 只检查有数据行的sheet
  1500. };//loop sheet
  1501. return "{"+strB+"}";
  1502. };//generate b15c data to json string from workbook
  1503. ///////////////////under this line start for b16-b19 xlsx file //////////////////////////////////
  1504. // 检验 b16-b19 excel文件
  1505. function checkB16toB19File(workbook,logID,userID) {
  1506. var arraySheetNames = ["B16","B17","B18","B19"];
  1507. var arrayFunNames=[
  1508. ["通过","日期","文字","单元号","日期","文字","文字","文字","数值","文字","上传人"],
  1509. ["通过","日期","文字","单元号","日期","文字","文字","数值","数值","文字","上传人"],
  1510. ["通过","日期","文字","单元号","日期","文字","文字","文字","数值","文字","上传人"],
  1511. ["通过","日期","文字","单元号","文字","数值","文字","上传人"]
  1512. ];
  1513. var stc = workbook.Sheets["C"];
  1514. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1515. var stid=i+2;
  1516. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  1517. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1518. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1519. var rows = stc["C"+stid].v
  1520. var cell_ref;
  1521. var index;
  1522. for (var R = 2; R <= rows+1; ++R) {//loop row
  1523. index = 0;
  1524. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1525. str2="";
  1526. cell_ref = number2alphabet(C) + R;
  1527. str2=null;
  1528. //xlsx.full.min.js 里面没有Cell对象,要访问Cell值,只能通worksheet对象,可以从workbook object的内部结构看出来
  1529. //如果单元格为空,控制台会提示错误,运行停止,下面是解决办法!
  1530. if (worksheet[cell_ref] === undefined) {
  1531. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + " 空值!" + '\n';
  1532. index++;
  1533. // alert(index);
  1534. } else {
  1535. if (arrayFunNames[i][index]==="上传人") {
  1536. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") != true ){
  1537. document.getElementById(logID).innerHTML += "表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"','"+userID+"')") + '\n';
  1538. };
  1539. }else{
  1540. if (eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") != true ){
  1541. document.getElementById(logID).innerHTML +="表" + arraySheetNames[i] + "单元格" + cell_ref + eval(arrayFunNames[i][index]+"('"+worksheet[cell_ref].v+"')") + '\n';
  1542. };
  1543. };
  1544. index++;
  1545. };//cell is not blank
  1546. };//loop col
  1547. };//loop row
  1548. };// 只检查有数据行的sheet
  1549. };//loop sheet
  1550. }; // 检验 b16-b19 excel文件
  1551. //generate b16-b19 data to json string from workbook
  1552. function makeB16toB19JSONstring(workbook){
  1553. var arraySheetNames = ["B16","B17","B18","B19"];
  1554. var arrayFunNames=[
  1555. ["通过","日期","文字","单元号","日期","文字","文字","文字","数值","文字","上传人"],
  1556. ["通过","日期","文字","单元号","日期","文字","文字","数值","数值","文字","上传人"],
  1557. ["通过","日期","文字","单元号","日期","文字","文字","文字","数值","文字","上传人"],
  1558. ["通过","日期","文字","单元号","文字","数值","文字","上传人"]
  1559. ];
  1560. var strB="";
  1561. var stc = workbook.Sheets["C"];
  1562. for (let i = 0; i < arraySheetNames.length; i++) {//loop sheet
  1563. var stid=i+2;
  1564. if (stc["C"+stid].v > 0 ) {// 只检查有数据行的sheet
  1565. //strB +=","+ arraySheetNames[i] +":[";
  1566. strB += '\"'+arraySheetNames[i]+'\"' +":\"[";
  1567. var worksheet = workbook.Sheets[arraySheetNames[i]]; // 这里我们只读取每个sheet
  1568. //var strRange = worksheet['!ref'];// 取已使用区域,格式为:A1:U3,包含很多空的行,不能使用这个方式了,从C表中,取真实的数据行数
  1569. var rows = stc["C"+stid].v
  1570. var cell_ref;
  1571. for (var R = 2; R <= rows+1; ++R) {//loop row
  1572. if (R===2) {
  1573. strB +="[";
  1574. }else{
  1575. strB +="▓[";
  1576. };
  1577. for (var C = 2; C <= arrayFunNames[i].length+1; ++C) {//loop col
  1578. str2="";
  1579. cell_ref = number2alphabet(C) + R;
  1580. str2=null;
  1581. if (C===(arrayFunNames[i].length+1)) {
  1582. if (arrayFunNames[i][C-2]==="日期") {
  1583. strB += formatExcelDate(worksheet[cell_ref].v,"-") ;
  1584. }else{
  1585. strB += worksheet[cell_ref].v;
  1586. };
  1587. } else {
  1588. if (arrayFunNames[i][C-2]==="日期") {
  1589. strB += formatExcelDate(worksheet[cell_ref].v,"-") + "∮";
  1590. }else{
  1591. strB += worksheet[cell_ref].v + "∮";
  1592. };
  1593. };
  1594. };//loop col
  1595. strB +="]";
  1596. };//loop row
  1597. strB +="]\",";
  1598. };// 只检查有数据行的sheet
  1599. };//loop sheet
  1600. return "{"+strB+"}";
  1601. };//generate b16-b19 data to json string from workbook
  1602. /*
  1603. export{import_excel_to_json,readWorkbookFromLocalFile,SheetAmount,HaveSheets,HaveData3Para,readWorkbook,makeJSONstring}
  1604. export{HaveSingleSheetName,makeIncomeJSONstring,checkIncomeFile}
  1605. export{ checkBalanceFile,makeBalanceJSONstring }
  1606. export{ makeInvoiceJSONstring,checkInvoiceFile }
  1607. export{ checkInvoiceSplitFile,makeInvoiceSplitJSONstring }
  1608. export { checkSalaryFile,makeSalaryJSONstring }
  1609. export { checkCashInFile,makeCashInJSONstring }
  1610. export { checkCashOutFile,makeCashOutJSONstring }
  1611. export { checkB14CFile,makeB14CJSONstring }
  1612. export { checkB15CFile,makeB15CJSONstring }
  1613. export { checkB16toB19File,makeB16toB19JSONstring }
  1614. */