另类方法实现对excel的操作

2012年2月16日 发表评论 阅读评论

前一段因为数据提取的需要,需要在linux下对数据进行提取,并导出为execl格式。诚然,在linux下实现对excel文件的生成的方法很多。比较常见的就是利用perl和php语言及其扩展模块实现对excel文件的格式化操作及数据的写入、更改。不过这种现方式实现起来都比较复杂,一般都需要先安装相关的模块,再写复杂的格式化的语句,然后才是数据的操作。后来在网上查看到一篇关于利于excel的xml格式实现对excel文件的数据操作的方法。感觉很新颖,现拿来一块学习下。

1.创建一个模板excel
新建一个test.xls文件,打开
自己设计样式如下:
2.把test.xls另存为xml表格 test.xml
3.用文本编辑器打开test.xml,我要介绍要用代码操作的地方
 
4.代码操作完后的结果,注意生成完后的文件的后缀必须改为.xls,这样就可以用excel直接打开了,只要有了模板excel之后,就可以在linux下把文件生成了。
 
5.代码,下面的代码使用时,注意:若是不是在web下使用,请把第1,2个print注释掉。使用时需要把代码保存为UTF-8格式,下面的m***cel="ms"+"excel",至于为什么,你懂的
 
  1. my $filename="test.xls";
  2. @data=([12,8,98],[9,16,99],[7,4,67],[2,64,99],[3,16,67],[1,64,78]);
  3. $RowCount=scalar(@data)+1;
  4. print "Content-type: Application/m***celn";
  5. print "Content-Disposition: attachment; filename='$filename'nn";
  6. #输出excel格式
  7. print <<EOFEXCELHEAD;
  8. <?xml version="1.0"?>
  9. <?mso-application progid="Excel.Sheet"?>
  10. <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  11.  xmlns:o="urn:schemas-microsoft-com:office:office"
  12.  xmlns:x="urn:schemas-microsoft-com:office:excel"
  13.  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  14.  xmlns:html="http://www.w3.org/TR/REC-html40">
  15.  <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
  16.   <Created>1996-12-17T01:32:42Z</Created>
  17.   <LastSaved>2000-11-18T06:53:49Z</LastSaved>
  18.   <Version>11.9999</Version>
  19.  </DocumentProperties>
  20.  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
  21.   <RemovePersonalInformation/>
  22.  </OfficeDocumentSettings>
  23.  <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
  24.   <WindowHeight>4530</WindowHeight>
  25.   <WindowWidth>8505</WindowWidth>
  26.   <WindowTopX>480</WindowTopX>
  27.   <WindowTopY>120</WindowTopY>
  28.   <AcceptLabelsInFormulas/>
  29.   <ProtectStructure>False</ProtectStructure>
  30.   <ProtectWindows>False</ProtectWindows>
  31.  </ExcelWorkbook>
  32.  <Styles>
  33.   <Style ss:ID="Default" ss:Name="Normal">
  34.    <Alignment ss:Vertical="Bottom"/>
  35.    <Borders/>
  36.    <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12"/>
  37.    <Interior/>
  38.    <NumberFormat/>
  39.    <Protection/>
  40.   </Style>
  41.   <Style ss:ID="s23">
  42.    <Font ss:FontName="宋体" x:CharSet="134" ss:Size="12" ss:Color="#FFFFFF"
  43.     ss:Bold="1"/>
  44.    <Interior ss:Color="#000000" ss:Pattern="Solid"/>
  45.   </Style>
  46.   <Style ss:ID="s26">
  47.    <Borders>
  48.     <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
  49.     <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
  50.     <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
  51.     <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
  52.    </Borders>
  53.   </Style>
  54.   <Style ss:ID="s27">
  55.    <Borders>
  56.     <Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>
  57.     <Border ss:Position="Left" ss:LineStyle="Continuous" ss:Weight="1"/>
  58.     <Border ss:Position="Right" ss:LineStyle="Continuous" ss:Weight="1"/>
  59.     <Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>
  60.    </Borders>
  61.    <Interior ss:Color="#CCFFCC" ss:Pattern="Solid"/>
  62.   </Style>
  63.  </Styles>
  64.  <Worksheet ss:Name="Sheet1">
  65.   <Table ss:ExpandedColumnCount="3" ss:ExpandedRowCount="$RowCount" x:FullColumns="1"
  66.    x:FullRows="1" ss:DefaultColumnWidth="54" ss:DefaultRowHeight="14.25">
  67.    <Column ss:AutoFitWidth="0" ss:Width="99.75"/>
  68.    <Column ss:AutoFitWidth="0" ss:Width="82.5"/>
  69.    <Column ss:AutoFitWidth="0" ss:Width="99"/>
  70.    <Row>
  71.     <Cell ss:StyleID="s23"><Data ss:Type="String">响应时间(ms)</Data></Cell>
  72.     <Cell ss:StyleID="s23"><Data ss:Type="String">带宽(Mbps)</Data></Cell>
  73.     <Cell ss:StyleID="s23"><Data ss:Type="String">成功率(%)</Data></Cell>
  74.    </Row>
  75. EOFEXCELHEAD
  76. my $i=0;
  77. for$i(0..$#data){
  78. if($i % 2 == 0){
  79. print <<EOFROW
  80.         <Row>
  81.     <Cell ss:StyleID="s26"><Data ss:Type="Number">$data[$i][0]</Data></Cell>
  82.     <Cell ss:StyleID="s26"><Data ss:Type="Number">$data[$i][1]</Data></Cell>
  83.     <Cell ss:StyleID="s26"><Data ss:Type="Number">$data[$i][2]</Data></Cell>
  84.    </Row>
  85. EOFROW
  86.     }else{
  87. print <<EOFROW
  88.         <Row>
  89.     <Cell ss:StyleID="s27"><Data ss:Type="Number">$data[$i][0]</Data></Cell>
  90.     <Cell ss:StyleID="s27"><Data ss:Type="Number">$data[$i][1]</Data></Cell>
  91.     <Cell ss:StyleID="s27"><Data ss:Type="Number">$data[$i][2]</Data></Cell>
  92.    </Row>
  93. EOFROW
  94.     }
  95. }
  96. print <<EOFEXCELTAIL;
  97. </Table>
  98.   <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
  99.    <Print>
  100.     <ValidPrinterInfo/>
  101.     <PaperSizeIndex>9</PaperSizeIndex>
  102.     <HorizontalResolution>300</HorizontalResolution>
  103.     <VerticalResolution>300</VerticalResolution>
  104.    </Print>
  105.    <Selected/>
  106.    <Panes>
  107.     <Pane>
  108.      <Number>3</Number>
  109.      <ActiveRow>1</ActiveRow>
  110.     </Pane>
  111.    </Panes>
  112.    <ProtectObjects>False</ProtectObjects>
  113.    <ProtectScenarios>False</ProtectScenarios>
  114.   </WorksheetOptions>
  115.  </Worksheet>
  116. </Workbook>
  117. EOFEXCELTAIL

当然上面后一部分提供的对代码的操作是基于perl实现的,个人认为。其是作者帮我们提供了一种新颖的实现方法,利于xml文件导出并且形成格式后。后面的数据部分的操作就是对xml文件的修改罢了。这时候通过shell、perl、php、c、java、vb、甚至是bat批处理任意方式去处理后面的数据都无所谓了。

最后,懒一点,具体perl下对excel下的操作不再写了,给几个参照资源看下吧!

perl平台下exel的模块:http://search.cpan.org/search?m=all&q=excel&s=1

CPAN提供的Spreadsheet::WriteExcel操作的说明:http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel-2.37/

perl下对excel操作的示例:http://liang573728.itpub.net/post/37715/485310

perl连结数据库对excel操作的示例:http://liang573728.itpub.net/post/37715/511396

感觉提供新颖思路的那位仁兄,其原文为:http://blog.chinaunix.net/uid-11121450-id-193355.html




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.