Chinaunix首页 | 论坛 | 博客
  • 博客访问: 225738
  • 博文数量: 36
  • 博客积分: 1188
  • 博客等级: 军士长
  • 技术积分: 802
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-08 21:45
文章分类

全部博文(36)

文章存档

2020年(1)

2017年(2)

2015年(1)

2014年(1)

2013年(1)

2012年(3)

2011年(27)

分类: WINDOWS

2011-06-05 09:11:16

工作中,需按客户(医院)提供的数据重建核算科室的核算报表,perl帮了我的大忙。Text::Table模块用于报表输出可以让代码简洁直观些。
以下代码只是示例如何从Excel中取数,并用Text::Table格式化输出报表。其中的财务数据的勾兑关系不一定正确,而且输出的报表也不全,缺少人员经费这部分的项目。
 测试.rar   
  1. #!/usr/bin/Perl

  2. use Cwd;
  3. use Win32::OLE;
  4. use Text::Table;
  5. #use Acme::PerlTidy;

  6. my $nll = '×';
  7. my $dir = getcwd();
  8. my $BookName = $dir . '/收入成本.xls';

  9. my @arrSh = qw(1月 2月 3月 4月);

  10. my $Excel = Win32::OLE->new("Excel.Application");
  11. $Excel->{Visible} = 1;
  12. $Book = $Excel->Workbooks->Open($BookName);
  13. foreach my $sheet (@arrSh) {

  14.     $Book->Sheets($sheet)->Select;
  15.     my $ActSheet = $Book->ActiveSheet;
  16.     my $ks = $ActSheet->Range('A3:A20')->{'Value'};
  17.     foreach my $i ( 0 .. 17 ) {
  18.         my $ks_now = $ks->[$i][0];
  19.         my $j = $i + 3;
  20.         my $sr = $ActSheet->Range("B$j:C$j")->{'Value'};
  21.         my $cb = $ActSheet->Range("E$j:M$j")->{'Value'};

  22.         my $ylsr = $sr->[0][0] - $sr->[0][1];
  23.         my $qtcb = $cb->[0][4] + $cb->[0][5];

  24.         my $tb = Text::Table->new();
  25.         $tb->load(
  26.             [ "一、业务收入", $nll, "四、业务费", $nll ],
  27.             [ "药品收入", $sr->[0][1], "1、药品成本", $cb->[0][2] ],
  28.             [ "挂号收入", $nll, "2、高值耗材成本", $cb->[0][3] ],
  29.             [ "门诊治疗收入", $nll, "3、氧气成本", $nll ],
  30.             [ "心超收入(电生理)", $nll, "4、卫生材料", $cb->[0][1]],
  31.             [ "化验收入(检验科)", $nll, "5、低值易耗品", $nll],
  32.             [ "X、CT收入(放射科)", $nll, "6、洗涤费",$nll ],
  33.             [ "理疗收入(理疗科)", $nll, "7、消毒费",$nll ],
  34.             [ "检查收入",$nll, "8、器设维修", $nll ],
  35.             [ "住院治疗收入",$ylsr, "9、保洁费",$nll ],
  36.             [ "×××××××××××",$nll, "10、差旅费",$nll ],
  37.             ["×××××××××××", $nll, "11、水电支出", $cb->[0][0]],
  38.             [ "×××××××××××", $nll, "12、电话费",$nll ],
  39.             [ "×××××××××××", $nll, "13、取暖费",$nll ],
  40.             [ "×××××××××××", $nll, "14、其他",$qtcb ],
  41.             [ "×××××××××××", $nll, "×××××××××××", $nll ],
  42.             [ "×××××××××××", $nll, "×××××××××××", $nll ],
  43.             ["×××××××××××", $nll,"五、折旧摊销费", $cb->[0][7]],
  44.             [ "×××××××××××", $nll, "×××××××××××", $nll ],
  45.             ["×××××××××××",$nll,"手术室费用(备查)", $cb->[0][6]],

  46.         );
  47.         open( FH, ">>Srcb.txt" );
  48.         print FH "$ks_now:$sheet\n";
  49.         print FH "$tb\n";
  50.         close FH;

  51.     }

  52. }
  53. $Book->Save;
  54. $Book->Close;
  55. $Excel->quit;

格式化输出至HTML向CU论坛的ttcn_cu又学了一招

  1. #!/usr/bin/Perl
  2. use Text::Table;
  3. my $nll = '×';
  4. my $tb = Text::Table->new();
  5.         $tb->load(

  6.         [ "一、业务收入", 44, "四、业务费", $nll ],
  7.         [ "药品收入", 22, "1、药品成本", 22 ],
  8.         [ "挂号收入", $nll, "2、高值耗材成本", 22 ],
  9.         [ "门诊治疗收入", $nll, "3、氧气成本", $nll ],
  10.         [ "心超收入(电生理)", $nll, "4、卫生材料", 22],
  11.         [ "化验收入(检验科)", $nll, "5、低值易耗品", $nll],
  12.         [ "X、CT收入(放射科)", $nll, "6、洗涤费",$nll ],
  13.         [ "理疗收入(理疗科)", $nll, "7、消毒费",$nll ],
  14.         [ "检查收入",$nll, "8、器设维修", $nll ],
  15.         [ "住院治疗收入",22, "9、保洁费",$nll ],
  16.         [ "×××××××××××",$nll, "10、差旅费",$nll ],
  17.         ["×××××××××××", $nll, "11、水电支出", 22],
  18.         [ "×××××××××××", $nll, "12、电话费",$nll ],
  19.         [ "×××××××××××", $nll, "13、取暖费",$nll ],
  20.         [ "×××××××××××", $nll, "14、其他",17 ],
  21.         [ "×××××××××××", $nll, "×××××××××××", $nll ],
  22.         [ "×××××××××××", $nll, "×××××××××××", $nll ],
  23.         ["×××××××××××", $nll,"五、折旧摊销费", 22],
  24.         [ "×××××××××××", $nll, "×××××××××××", $nll ],
  25.         ["×××××××××××",$nll,"手术室费用(备查)", 22],
  26. );
  27. my $outputbuff='';

  28. my $line_num= $tb->body_height();
  29. for my $i (0..$line_num-1){
  30.          $outputbuff.="";
  31.          my @row=split(/\s+/,$tb->body($i));
  32.          for (@row){
  33.                 $outputbuff.="$_";
  34.         }
  35.         $outputbuff.="";
  36. }

  37. $outputbuff.="";
  38. open OUTPUT,'>','out1.html';
  39. print OUTPUT "";
  40. print OUTPUT $outputbuff;
  41. close OUTPUT;

  42. open OUTPUT,'>','out2.html';
  43. print OUTPUT "
  44. ";
  45. print OUTPUT $outputbuff;
  46. close OUTPUT;

  47. #############################################
  48. #另外一个使用Text::Table的原因,就是可以很容易地按行(取单行:$tb->body($i);取多行:$tb->body(0..$i)或$tb->body(0,1,$i))或按列($tb->select($i))取数据,再结合使用切片可以方便地计算出需要的数据
  49. my @temp=split(/\n/,$tb->select(1));
  50. my @col=grep(/\d+/,@temp[1..$#temp]);
  51. print '业务收入='.join('+',@col),"\n" ;
  52. 阅读(1899) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~