aardio 官方社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 20357|回复: 13

excel工作表拆分

[复制链接]

3

主题

9

回帖

85

积分

一级会员

积分
85
发表于 2014-3-2 07:45:27 | 显示全部楼层 |阅读模式
在工作中有时会需要把某个excel工作表按某列拆分,虽然能找到一些现成的宏来拆分,但觉得操作不方便,于是用aardio写了个拆分工具。
  1. import win.ui;
  2. import fsys.dlg;
  3. import com.excel;
  4. /*DSG{{*/
  5. mainForm = ..win.form(text="excel拆分2";right=600;bottom=400)
  6. mainForm.add()
  7. /*}}*/

  8. import win.wizard;
  9. wiz = win.wizard( text = "excel拆分向导" )

  10. wiz.add("选择excel表格").loader = function (hwnd) {
  11.         var form = win.form( hwnd = hwnd);
  12.         form.add(
  13.                 edit={cls="edit";left=0;top=0;right=350;bottom=26;edge=1;z=2};
  14.                 button={cls="button";text="选择";left=450;top=0;right=540;bottom=26;z=1};
  15.                 checkbox={ bottom=75;right=100;left=0;top=50;z=2;text="显示拆分过程";cls="checkbox" }
  16.                 static={cls="static";text="注意:勾选显示拆分表格过程,程序操作过程中,不能进行其他操作。";left=0;top=90;right=400;bottom=120;color=255;transparent=1;z=3}
  17.         )
  18.         form.button.oncommand = function(id,event){
  19.                 var path = fsys.dlg.open("excel文件|*.xls;*.xlsx||");
  20.                 if(#path) form.edit.text = path;
  21.         }
  22.         form.onNext = function(){
  23.                 if(!#form.edit.text){
  24.                         form.msgboxErr("请先选择文件","操作错误")
  25.                         return false;
  26.                 }
  27.         }
  28.         return form;
  29. }

  30. wiz.add("数据前几行预览").loader = function (hwnd) {
  31.         excel = com.excel();
  32.         excel.Visible = false;
  33.         if(wiz.items[1].checkbox.checked){
  34.                 excel.Visible = true;
  35.         }
  36.        
  37.         book = excel.WorkBooks.Open(io.fullpath(wiz.items[1].edit.text));
  38.         sheet = excel.ActiveWorkbook.Sheets(1);
  39.         col = sheet.UsedRange.Columns.count;
  40.         row = sheet.UsedRange.Rows.count;
  41.        
  42.         r1 = {};
  43.         for(i=1;10;1){
  44.                 r1[i] = {};
  45.                 for(j=1;col;1){
  46.                         r1[i][j] = sheet.Cells(i,j).getValue2();
  47.                 }
  48.         }
  49.        
  50.         r2 = {};
  51.         for(i=row;row-10;-1){
  52.                 r2[i] = {};
  53.                 for(j=1;col;1){
  54.                         r2[i][j] = sheet.Cells(i,j).getValue2();
  55.                 }       
  56.         }
  57.        
  58.         var form = win.form( hwnd = hwnd);
  59.         form.add(
  60.                 static={cls="static";text="请输入标题所占行数:";left=0;top=4;right=150;bottom=26;transparent=1;z=2}
  61.                 edit={cls="edit";left=150;top=0;right=200;bottom=26;edge=1;z=2};
  62.                 static2={cls="static";text="请输入拆分依据所在列数:";left=250;top=4;right=430;bottom=26;transparent=1;z=2}
  63.                 edit2={cls="edit";left=430;top=0;right=480;bottom=26;edge=1;z=2};
  64.                 listview={cls="listview";left=0;top=38;right=600;bottom=241;asel=false;dl=1;bgcolor=00000000;dr=1;edge=1;font=LOGFONT( name='SimSun' );fullRow=1;gridLines=1;msel=false;z=1;hscroll=1};       
  65.         )
  66.         form.listview.insertColumn(" ",40,,0x0/*_LVCFMT_LEFT*/)
  67.         for(j=1;col;1){
  68.                 form.listview.insertColumn(tostring(j) ++ "列",100,,0x0/*_LVCFMT_LEFT*/)
  69.         }
  70.         for(i=1;10;1){
  71.                 line = {};
  72.                 table.push(line,tostring(i) ++ "行");
  73.                 for(j=1;col;1){
  74.                         if(r1[i][j] == null){
  75.                                 r1[i][j] = " ";
  76.                         }
  77.                         table.push(line,tostring(r1[i][j]));
  78.                 }
  79.                 form.listview.addItem(line);
  80.         }
  81.        
  82.         form.onNext = function(){
  83.                 if(!#form.edit.text or !#form.edit2.text){
  84.                         form.msgboxErr("请输入行列数","操作错误")
  85.                         return false;
  86.                 }
  87.                 if(tonumber(form.edit.text) <= 0 or tonumber(form.edit2.text) <= 0){
  88.                         form.msgboxErr("大哥别开玩笑了,最起码输入个正数","操作错误")
  89.                         return false;
  90.                 }
  91.         }
  92.         return form;
  93. }

  94. wiz.add("数据最后几行预览").loader = function (hwnd) {
  95.         var form = win.form( hwnd = hwnd);
  96.         form.add(
  97.                 static={cls="static";text="请输入注脚所占行数(如:合计行。如果没有不用输入):";left=0;top=4;right=380;bottom=26;transparent=1;z=2}
  98.                 edit={cls="edit";left=380;top=0;right=440;bottom=26;edge=1;z=2};
  99.                 listview={cls="listview";left=0;top=38;right=600;bottom=241;asel=false;dl=1;bgcolor=00000000;dr=1;edge=1;font=LOGFONT( name='SimSun' );fullRow=1;gridLines=1;msel=false;z=1;hscroll=1};
  100.         )
  101.         form.listview.insertColumn(" ",40,,0x0/*_LVCFMT_LEFT*/)
  102.         for(j=1;col;1){
  103.                 form.listview.insertColumn(tostring(j) ++ "列",100,,0x0/*_LVCFMT_LEFT*/)
  104.         }
  105.         for(i=row-10;row;1){
  106.                 line = {};
  107.                 table.push(line,tostring(i) ++ "行");
  108.                 for(j=1;col;1){
  109.                         if(r2[i][j] == null){
  110.                                 r2[i][j] = " ";
  111.                         }
  112.                         table.push(line,tostring(r2[i][j]));
  113.                 }
  114.                 form.listview.addItem(line);
  115.         }
  116.         return form;
  117. }

  118. wiz.add("请选择拆分文件保持位置").loader = function (hwnd) {
  119.         var form = win.form( hwnd = hwnd);
  120.         form.add(
  121.                 edit={cls="edit";left=0;top=0;right=350;bottom=26;edge=1;z=2};
  122.                 button={cls="button";text="选择";left=450;top=0;right=540;bottom=26;z=1};
  123.                 static={cls="static";text="如果不选择保存路径,拆分文件默认保存在原文件所在路径。";left=0;top=50;right=380;bottom=80;transparent=1;z=3}
  124.                 static2={cls="static";text="点击完成后,请耐心等待,完成后会跳出完成对话框。";left=240;top=280;right=600;bottom=310;transparent=1;z=4}
  125.         )
  126.         form.button.oncommand = function(id,event){
  127.                 var path = fsys.dlg.opendir();
  128.                 if(#path) form.edit.text = path;
  129.         }
  130.         return form;
  131. }

  132. wiz.onFinish = function () {
  133.         var title = tonumber(wiz.items[2].edit.text);
  134.         var fliter = tonumber(wiz.items[2].edit2.text);
  135.         var tail = tonumber(wiz.items[3].edit.text);
  136.         //创建拆分依据列的table
  137.         var r1 = {};
  138.        
  139.         for(i=title+1;row-(row-tail+1);1){
  140.                 k = sheet.Cells(i,fliter).getValue();
  141.                 r1[k] = {};
  142.         }
  143.        
  144.         for(i=title+1;row-(row-tail+1);1){
  145.                 k1 = sheet.Cells(i,fliter).getValue();
  146.                 for(k2 in r1){
  147.                         if(k1 == k2){
  148.                                 table.push(r1[k2],i);
  149.                         }
  150.                 }
  151.         }
  152.        
  153.         tpath = io.splitpath(wiz.items[1].edit.text);
  154.        
  155.         for(k in r1){
  156.                 var book2 = excel.WorkBooks.Add();
  157.                 var sheet2  = excel.ActiveWorkbook.Sheets(1);
  158.                 var titlerow = "1:"++ title;
  159.                 sheet.UsedRange.Rows(titlerow).copy();
  160.                 sheet2.cells(1,1).PasteSpecial(xlPasteColumnWidths);
  161.                 var r = title + 1;
  162.                 for(name,value in r1[k]){
  163.                         sheet.UsedRange.Rows(value).copy();
  164.                         sheet2.cells(r,1).PasteSpecial(xlPasteColumnWidths);
  165.                         r = r + 1;
  166.                 }
  167.                 var tailrow = tail ++ ":" ++ row;
  168.                 sheet.UsedRange.Rows(tailrow).copy();
  169.                 sheet2.cells(r,1).PasteSpecial();
  170.                 newpath = tpath.dir ++ tpath.name ++ "("  ++ k ++ ").xlsx";
  171.                 if(#wiz.items[4].edit.text) newpath = io.fullpath(wiz.items[4].edit.text ++ "" ++ tpath.name ++ "("  ++ k ++ ").xlsx");
  172.                 excel.ActiveWorkBook.SaveAs(newpath);
  173.                 excel.ActiveWorkBook.close();
  174.         }
  175.        
  176.         excel.ActiveWorkbook.close();
  177.        
  178.         excel.Quit();
  179.         excel = null;
  180.         collectgarbage("collect");
  181.        
  182.         win.msgbox("完成","ok");       
  183. }

  184. wiz.doModal(mainForm);
  185. win.loopMessage();
复制代码



评分

参与人数 1 +50 收起 理由
stillywud + 50 感谢分享

查看全部评分

7

主题

293

回帖

1900

积分

新手入门

积分
1900
QQ
发表于 2014-3-2 11:57:42 | 显示全部楼层
感谢分享!

0

主题

5

回帖

27

积分

新手入门

积分
27
发表于 2014-3-2 17:54:46 | 显示全部楼层
不错,挺好的,收藏了

0

主题

12

回帖

77

积分

一级会员

积分
77
发表于 2014-3-3 10:43:38 | 显示全部楼层
很好,支持,感谢分享!

1

主题

8

回帖

68

积分

一级会员

积分
68
发表于 2014-3-3 21:24:44 | 显示全部楼层
谢谢分享

0

主题

13

回帖

1093

积分

四级会员

积分
1093
发表于 2014-3-4 00:14:50 | 显示全部楼层
很好,支持,感谢分享!

17

主题

79

回帖

2773

积分

新手入门

积分
2773
发表于 2014-3-4 16:04:39 | 显示全部楼层
给出方案与大家分享,顶。
我觉得用aardio的SQL语句操作excel可能更有效率更快,没有亲自尝试,只是这么想

3

主题

9

回帖

85

积分

一级会员

积分
85
 楼主| 发表于 2014-3-5 14:33:17 | 显示全部楼层
hgbuser 发表于 2014-3-4 16:04
给出方案与大家分享,顶。
我觉得用aardio的SQL语句操作excel可能更有效率更快,没有亲自尝试,只是这么想

对纯数据而言可以用你说的思路。这个拆分工具的思路是最大程度使拆分出来的表格跟原表格的样式保持一致。

2

主题

11

回帖

97

积分

一级会员

积分
97
发表于 2014-4-22 16:40:10 | 显示全部楼层
145行出错了

2

主题

11

回帖

97

积分

一级会员

积分
97
发表于 2014-4-22 16:43:59 | 显示全部楼层
line:#145
file:[string "import win.ui;..."]:
attempt to:perform arithmetic on
kind:variable(local)
name:'tail'
type:null

1

主题

10

回帖

73

积分

一级会员

积分
73
发表于 2014-7-3 17:06:28 | 显示全部楼层
开卷有益,感谢分享!

0

主题

2

回帖

33

积分

新手入门

积分
33
发表于 2014-7-6 15:40:14 | 显示全部楼层
新手学习,感谢分享!

15

主题

21

回帖

447

积分

二级会员

积分
447
发表于 2018-3-25 23:19:18 | 显示全部楼层
145行出错了
line:#145 file:[string "import win.ui;..."]: attempt to:perform arithmetic on

line:#145
file:[string "import win.ui;..."]:
attempt to:perform arithmetic on
kind:variable(local)
name:'tail'
type:null

0

主题

13

回帖

145

积分

培训班

积分
145
发表于 2018-3-26 16:17:03 | 显示全部楼层
145行出错,将楼主的代码略微改动了一下,就可以了:
  1. import win.ui;
  2. import fsys.dlg;
  3. import com.excel;
  4. //import console;
  5. /*DSG{{*/
  6. mainForm = win.form(text="excel拆分";right=600;bottom=400)
  7. mainForm.add()
  8. /*}}*/

  9. import win.wizard;
  10. wiz = win.wizard( text = "excel拆分向导" )

  11. wiz.add("选择excel表格").loader = function (hwnd) {
  12.         var form = win.form( hwnd = hwnd);
  13.         form.add(
  14.                 edit={cls="edit";left=0;top=0;right=350;bottom=26;edge=1;z=2};
  15.                 button={cls="button";text="选择";left=560;top=0;right=650;bottom=26;z=1};
  16.                 checkbox={ bottom=75;right=100;left=0;top=60;z=2;text="显示拆分过程";cls="checkbox" }
  17.                 static={cls="static";text="注意:勾选显示拆分表格过程,程序操作过程中,不能进行其他操作。";left=0;top=100;right=400;bottom=120;color=255;transparent=1;z=3}
  18.         )
  19.         form.button.oncommand = function(id,event){
  20.                 var path = fsys.dlg.open("excel文件|*.xls;*.xlsx||");
  21.                 if(#path) form.edit.text = path;
  22.         }
  23.         form.onNext = function(){
  24.                 if(!#form.edit.text){
  25.                         form.msgboxErr("请先选择文件","操作错误")
  26.                         return false;
  27.                 }
  28.         }
  29.         return form;
  30. }

  31. wiz.add("数据前10行预览").loader = function (hwnd) {
  32.         excel = com.excel();
  33.         excel.Visible = false;
  34.         if(wiz.items[1].checkbox.checked){
  35.                 excel.Visible = true;
  36.         }
  37.         
  38.         book = excel.WorkBooks.Open(io.fullpath(wiz.items[1].edit.text));
  39.         sheet = excel.ActiveWorkbook.Sheets(1);
  40.         cols = sheet.UsedRange.Columns.count; //总列数
  41.         rows = sheet.UsedRange.Rows.count; //总行数
  42.         
  43.         r1 = {};
  44.         for(i=1;10;1){
  45.                 r1[ i ] = {};
  46.                 for(j=1;cols;1){
  47.                         r1[ i ][j] = sheet.Cells(i,j).getValue2();
  48.                 }
  49.         }
  50.         
  51.         r2 = {};
  52.         for(i=rows;rows-10;-1){ //前10行预览,表中数据小于10行会报错
  53.                 r2[ i ] = {};
  54.                 for(j=1;cols;1){
  55.                         r2[ i ][j] = sheet.Cells(i,j).getValue2();
  56.                 }        
  57.         }
  58.         
  59.         var form = win.form( hwnd = hwnd);
  60.         form.add(
  61.                 static={cls="static";text="请输入标题所占行数:";left=0;top=4;right=150;bottom=26;transparent=1;z=2}
  62.                 edit={cls="edit";left=190;top=0;right=230;bottom=20;edge=1;z=2};
  63.                 static2={cls="static";text=",请输入拆分依据所在列数:";left=260;top=4;right=440;bottom=26;transparent=1;z=2}
  64.                 edit2={cls="edit";left=510;top=0;right=550;bottom=20;edge=1;z=2};
  65.                 listview={cls="listview";left=0;top=42;right=720;bottom=248;asel=false;dl=1;bgcolor=00000000;dr=1;edge=1;font=LOGFONT( name='SimSun' );fullRow=1;gridLines=1;msel=false;z=1;hscroll=1};        
  66.         )
  67.         form.listview.insertColumn(" ",40,,0x0/*_LVCFMT_LEFT*/)
  68.         for(j=1;cols;1){
  69.                 form.listview.insertColumn(tostring(j) ++ "列",100,,0x0/*_LVCFMT_LEFT*/)
  70.         }
  71.         for(i=1;10;1){
  72.                 line = {};
  73.                 table.push(line,tostring(i) ++ "行");
  74.                 for(j=1;cols;1){
  75.                         if(r1[ i ][j] == null){
  76.                                 r1[ i ][j] = " ";
  77.                         }
  78.                         table.push(line,tostring(r1[ i ][j]));
  79.                 }
  80.                 form.listview.addItem(line);
  81.         }
  82.         
  83.         form.onNext = function(){
  84.                 if(!#form.edit.text or !#form.edit2.text){
  85.                         form.msgboxErr("请输入行列数","操作错误")
  86.                         return false;
  87.                 }
  88.                 if(tonumber(form.edit.text) <= 0 or tonumber(form.edit2.text) <= 0){
  89.                         form.msgboxErr("大哥别开玩笑了,最起码输入个正数","操作错误")
  90.                         return false;
  91.                 }
  92.         }
  93.         return form;
  94. }

  95. wiz.add("数据最后几行预览").loader = function (hwnd) {
  96.         var form = win.form( hwnd = hwnd);
  97.         form.add(
  98.                 static={cls="static";text="请输入注脚所在行数(如:合计行。如果没有不用输入):";left=0;top=4;right=380;bottom=26;transparent=1;z=2}
  99.                 edit={cls="edit";left=480;top=0;right=520;bottom=20;edge=1;z=2};
  100.                 listview={cls="listview";left=0;top=42;right=720;bottom=248;asel=false;dl=1;bgcolor=00000000;dr=1;edge=1;font=LOGFONT( name='SimSun' );fullRow=1;gridLines=1;msel=false;z=1;hscroll=1};
  101.         )
  102.         form.listview.insertColumn(" ",40,,0x0/*_LVCFMT_LEFT*/)
  103.         for(j=1;cols;1){
  104.                 form.listview.insertColumn(tostring(j) ++ "列",100,,0x0/*_LVCFMT_LEFT*/)
  105.         }
  106.         for(i=rows-10;rows;1){
  107.                 line = {};
  108.                 table.push(line,tostring(i) ++ "行");
  109.                 for(j=1;cols;1){
  110.                         if(r2[ i ][j] == null){
  111.                                 r2[ i ][j] = " ";
  112.                         }
  113.                         table.push(line,tostring(r2[ i ][j]));
  114.                 }
  115.                 form.listview.addItem(line);
  116.         }
  117.         return form;
  118. }

  119. wiz.add("请选择拆分文件保持位置").loader = function (hwnd) {
  120.         var form = win.form( hwnd = hwnd);
  121.         form.add(
  122.                 edit={cls="edit";left=0;top=0;right=350;bottom=26;edge=1;z=2};
  123.                 button={cls="button";text="选择";left=560;top=0;right=650;bottom=26;z=1};
  124.                 static={cls="static";text="如果不选择保存路径,拆分文件默认保存在原文件所在路径。";left=0;top=50;right=380;bottom=80;transparent=1;z=3}
  125.                 static2={cls="static";text="点击完成后,请耐心等待,完成后会跳出完成对话框。";left=240;top=280;right=600;bottom=310;transparent=1;z=4}
  126.         )
  127.         form.button.oncommand = function(id,event){
  128.                 var path = fsys.dlg.opendir();
  129.                 if(#path) form.edit.text = path;
  130.         }
  131.         return form;
  132. }

  133. wiz.onFinish = function () {
  134.         var title = tonumber(wiz.items[2].edit.text);
  135.         var fliter = tonumber(wiz.items[2].edit2.text);
  136.         var tail = tonumber(wiz.items[3].edit.text);
  137.         
  138.         if( tail ){
  139.                 rowsData = tail-1;
  140.         }
  141.         else { //如果未填写注脚所在行数
  142.                 rowsData = rows;
  143.         }
  144.         
  145.         //创建拆分依据列的table
  146.         var r1 = {};
  147.         
  148.         for(i=title+1;rowsData;1){
  149.                 k = sheet.Cells(i,fliter).getValue();
  150.                 r1[k] = {};
  151.         }
  152.         
  153.         for(i=title+1;rowsData;1){
  154.                 k1 = sheet.Cells(i,fliter).getValue();
  155.                 for(k2 in r1){
  156.                         if(k1 == k2){
  157.                                 table.push(r1[k2],i);
  158.                         }
  159.                 }
  160.         }
  161.         
  162.         tpath = io.splitpath(wiz.items[1].edit.text);
  163.         
  164.         for(k in r1){
  165.                 var book2 = excel.WorkBooks.Add();
  166.                 var sheet2  = excel.ActiveWorkbook.Sheets(1);
  167.                 var titlerow = "1:"++ title;
  168.                 sheet.UsedRange.Rows(titlerow).copy();
  169.                 sheet2.cells(1,1).PasteSpecial(xlPasteColumnWidths);
  170.                 var r = title + 1;
  171.                 for(name,value in r1[k]){
  172.                         sheet.UsedRange.Rows(value).copy();
  173.                         sheet2.cells(r,1).PasteSpecial(xlPasteColumnWidths);
  174.                         r = r + 1;
  175.                 }
  176.                
  177.                 if( tail ){
  178.                         var tailrow = tail ++ ":" ++ rows;
  179.                         sheet.UsedRange.Rows(tailrow).copy();
  180.                         sheet2.cells(r,1).PasteSpecial();
  181.                 }

  182.                 newpath = tpath.dir ++ tpath.name ++ "("  ++ k ++ ").xlsx";
  183.                 if(#wiz.items[4].edit.text) newpath = io.fullpath(wiz.items[4].edit.text ++ "" ++ tpath.name ++ "("  ++ k ++ ").xlsx");
  184.                 excel.ActiveWorkBook.SaveAs(newpath);
  185.                 excel.ActiveWorkBook.close();
  186.         }
  187.         
  188.         excel.ActiveWorkbook.close();
  189.         
  190.         excel.Quit();
  191.         excel = null;
  192.         collectgarbage("collect");
  193.         
  194.         win.msgbox("拆分完成","ok");        
  195. }

  196. wiz.doModal(mainForm);
  197. win.loopMessage();
复制代码
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2024-12-13 08:04 , Processed in 0.064886 second(s), 24 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表